• winnet winhttp


     // HttpPost.cpp written by l_zhaohui@163.com
    // 2007/11/30
    
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS
    #include <atlbase.h>
    #include <atlstr.h>
    
    #define USE_WINHTTP    //Comment this line to user wininet.
    #ifdef USE_WINHTTP
    #include <winhttp.h>
    #pragma comment(lib, "winhttp.lib")
    #else
    #include <wininet.h>
    #pragma comment(lib, "wininet.lib")
    #endif
    #define BUF_SIZE    (1024)
    
    // CrackedUrl
    class CrackedUrl
    {
        int m_scheme;
        CStringW m_host;
        int m_port;
        CStringW m_path;
    public:
        CrackedUrl(LPCWSTR url)
        {
            URL_COMPONENTS uc = { 0};
            uc.dwStructSize = sizeof(uc);
    
            const DWORD BUF_LEN = 256;
    
            WCHAR host[BUF_LEN];
            uc.lpszHostName = host;
            uc.dwHostNameLength = BUF_LEN;
    
            WCHAR path[BUF_LEN];
            uc.lpszUrlPath = path;
            uc.dwUrlPathLength = BUF_LEN;
    
            WCHAR extra[BUF_LEN];
            uc.lpszExtraInfo = extra;
            uc.dwExtraInfoLength = BUF_LEN;
    
    #ifdef USE_WINHTTP
            if (!WinHttpCrackUrl(url, 0, ICU_ESCAPE, &uc))
            {
                printf("Error:WinHttpCrackUrl failed!/n");
            }
    
    #else
            if (!InternetCrackUrl(url, 0, ICU_ESCAPE, &uc))
            {
                printf("Error:InternetCrackUrl failed!/n");
            }
    #endif
            m_scheme = uc.nScheme;
            m_host = host;
            m_port = uc.nPort;
            m_path = path;
        }
    
        int GetScheme() const
        {
            return m_scheme;
        }
    
        LPCWSTR GetHostName() const
        {
            return m_host;
        }
    
        int GetPort() const
        {
            return m_port;
        }
    
        LPCWSTR GetPath() const
        {
            return m_path;
        }
    
        static CStringA UrlEncode(const char *p)
        {
            if (p == 0)
            {
                return CStringA();
            }
    
            CStringA buf;
    
            for (;;)
            {
                int ch = (BYTE) (*(p++));
                if (ch == '/0')
                {
                    break;
                }
    
                if (isalnum(ch) || ch == '_' || ch == '-' || ch == '.')
                {
                    buf += (char)ch;
                }
                else if (ch == ' ')
                {
                    buf += '+';
                }
                else
                {
                    char c[16];
                    wsprintfA(c, "%%%02X", ch);
                    buf += c;
                }
            }
    
            return buf;
        }
    };
    
    // CrackedUrl
    
    
    
    
    
    
    
    
    
    
    HINTERNET OpenSession(LPCWSTR userAgent = 0)
    {
    #ifdef USE_WINHTTP
        return WinHttpOpen(userAgent, NULL, NULL, NULL, NULL);;
    #else
        return InternetOpen(userAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    #endif
    }
    
    HINTERNET Connect(HINTERNET hSession, LPCWSTR serverAddr, int portNo)
    {
    #ifdef USE_WINHTTP
        return WinHttpConnect(hSession, serverAddr, (INTERNET_PORT) portNo, 0);
    #else
        return InternetConnect(hSession, serverAddr, portNo, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
    #endif
    }
    
    HINTERNET OpenRequest(HINTERNET hConnect, LPCWSTR verb, LPCWSTR objectName, int scheme)
    {
        DWORD flags = 0;
    #ifdef USE_WINHTTP
        if (scheme == INTERNET_SCHEME_HTTPS)
        {
            flags |= WINHTTP_FLAG_SECURE;
        }
    
        return WinHttpOpenRequest(hConnect, verb, objectName, NULL, NULL, NULL, flags);
    
    #else
        if (scheme == INTERNET_SCHEME_HTTPS)
        {
            flags |= INTERNET_FLAG_SECURE;
        }
    
        return HttpOpenRequest(hConnect, verb, objectName, NULL, NULL, NULL, flags, 0);
    #endif
    }
    
    BOOL AddRequestHeaders(HINTERNET hRequest, LPCWSTR header)
    {
        SIZE_T len = lstrlenW(header);
    #ifdef USE_WINHTTP
        return WinHttpAddRequestHeaders(hRequest, header, DWORD(len), WINHTTP_ADDREQ_FLAG_ADD);
    #else
        return HttpAddRequestHeaders(hRequest, header, DWORD(len), HTTP_ADDREQ_FLAG_ADD);
    #endif
    }
    
    BOOL SendRequest(HINTERNET hRequest, const void *body, DWORD size)
    {
    #ifdef USE_WINHTTP
        return WinHttpSendRequest(hRequest, 0, 0,const_cast<void *>(body), size, size, 0);
    #else
        return HttpSendRequest(hRequest, 0, 0, const_cast<void *>(body), size);
    #endif
    }
    BOOL EndRequest(HINTERNET hRequest)
    {
    #ifdef USE_WINHTTP
        return WinHttpReceiveResponse(hRequest, 0);
    #else
        // if you use HttpSendRequestEx to send request then use HttpEndRequest in here!
        return TRUE;
    #endif
    }
    
    BOOL QueryInfo(HINTERNET hRequest, int queryId, char *szBuf, DWORD *pdwSize)
    {
    #ifdef USE_WINHTTP
        return WinHttpQueryHeaders(hRequest, (DWORD) queryId, 0, szBuf, pdwSize, 0);
    #else
        return HttpQueryInfo(hRequest, queryId, szBuf, pdwSize, 0);
    #endif
    }
    
    BOOL ReadData(HINTERNET hRequest, void *buffer, DWORD length, DWORD *cbRead)
    {
    #ifdef USE_WINHTTP
        return WinHttpReadData(hRequest, buffer, length, cbRead);
    #else
        return InternetReadFile(hRequest, buffer, length, cbRead);
    #endif
    }
    
    void CloseInternetHandle(HINTERNET hInternet)
    {
        if (hInternet)
        {
    #ifdef USE_WINHTTP
            WinHttpCloseHandle(hInternet);
    #else
            InternetCloseHandle(hInternet);
    #endif
        }
    }
    
    int _tmain(int argc, _TCHAR *argv[])
    {
        HINTERNET hSession = 0;
        HINTERNET hConnect = 0;
        HINTERNET hRequest = 0;
        CStringW strHeader(L"Content-type: application/x-www-form-urlencoded/r/n");
    
        // Test data
        CrackedUrl crackedUrl(L"http://www.baidu.com");
        CStringA strPostData("a=1");
    
        // Open session.
        hSession = OpenSession(L"HttpPost");
        if (hSession == NULL)
        {
            printf("Error:Open session!/n");
            return -1;
        }
    
        // Connect.
        hConnect = Connect(hSession, crackedUrl.GetHostName(), crackedUrl.GetPort());
           // hConnect = Connect(hSession, L"192.168.0.8",80);
        if (hConnect == NULL)
        {
            printf("Error:Connect failed!/n");
            return -1;
        }
    
        // Open request.
        //hRequest = OpenRequest(hConnect, L"POST", L"login.html", crackedUrl.GetScheme());
        hRequest = OpenRequest(hConnect, L"POST", crackedUrl.GetPath(), crackedUrl.GetScheme());
        if (hRequest == NULL)
        {
            printf("Error:OpenRequest failed!/n");
            return -1;
        }
    
        // Add request header.
        if (!AddRequestHeaders(hRequest, strHeader))
        {
            printf("Error:AddRequestHeaders failed!/n");
            return -1;
        }
    
        // Send post data.
        if (!SendRequest(hRequest, (const char *)strPostData, strPostData.GetLength()))
        {
            printf("Error:SendRequest failed!/n");
            return -1;
        }
    
        // End request
        if (!EndRequest(hRequest))
        {
            printf("Error:EndRequest failed!/n");
            return -1;
        }
        char szBuf[BUF_SIZE];
        DWORD dwSize = 0;
        szBuf[0] = 0;
    
        // Query header info.
    #ifdef USE_WINHTTP
        int contextLengthId = WINHTTP_QUERY_CONTENT_LENGTH;
        int statusCodeId = WINHTTP_QUERY_STATUS_CODE;
        int statusTextId = WINHTTP_QUERY_STATUS_TEXT;
    #else
        int contextLengthId = HTTP_QUERY_CONTENT_LENGTH;
        int statusCodeId = HTTP_QUERY_STATUS_CODE;
        int statusTextId = HTTP_QUERY_STATUS_TEXT;
    #endif
        dwSize = BUF_SIZE;
        if (QueryInfo(hRequest, contextLengthId, szBuf, &dwSize))
        {
            szBuf[dwSize] = 0;
            printf("Content length:[%s]/n", szBuf);
        }
        dwSize = BUF_SIZE;
        if (QueryInfo(hRequest, statusCodeId, szBuf, &dwSize))
        {
            szBuf[dwSize] = 0;
            printf("Status code:[%s]/n", szBuf);
        }
    
        dwSize = BUF_SIZE;
        if (QueryInfo(hRequest, statusTextId, szBuf, &dwSize))
        {
            szBuf[dwSize] = 0;
            printf("Status text:[%s]/n", szBuf);
        }
    
        // read data.
        for (;;)
        {
            dwSize = BUF_SIZE;
            if (ReadData(hRequest, szBuf, dwSize, &dwSize) == FALSE)
            {
                break;
            }
    
            if (dwSize <= 0)
            {
                break;
            }
    
            szBuf[dwSize] = 0;
            printf("%s/n", szBuf);    //Output value = value1 + value2
        }
    
        CloseInternetHandle(hRequest);
        CloseInternetHandle(hConnect);
        CloseInternetHandle(hSession);
    
             system("pause");
    
        return 0;
    }
  • 相关阅读:
    浏览器缓存
    FLINK --- 写HDFS
    ArrayList 线程不安全
    rocketMQ源码之 似乎并不能严格进行顺序消费
    报错 Aray size is not a small enough positive integer 的解决方案
    什么是函数的柯里化?
    props, state与render函数关系 – 数据和页面是如何实现互相联动的?
    【自我管理】my schedule
    【解题报告】洛谷P1219 八皇后
    【解题报告】洛谷P1433 吃奶酪
  • 原文地址:https://www.cnblogs.com/ytjjyy/p/2507994.html
Copyright © 2020-2023  润新知