웹, HTML

WinINet을 이용하여 HTTPS로 POST하는방법? 데브피아

디버그정 2009. 7. 4. 12:56
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=576410&ref=551678


 WinINet을 이용하여 HTTPS로 POST하는방법?  | WinSock
2005-11-29 오전 9:50:15
김연준 (longdari)  김연준님께 메시지 보내기김연준님을 내 주소록에 추가합니다.김연준님의 개인게시판 가기 번호: 551678  / 읽음:1,627

 안녕하세요


WinINet을 이용하여 HTTPS를 이용하려고 합니다.


InternetConnect의 파라미터중 INTERNET_DEFAULT_HTTPS_PORT가 있어서


사용하려했는데 HTTPS 통신을 하지 않습니다.


InternetOpenUrl을 이용해서 URL에 https://... 를 줘서 해봤는데


HTTPS는 동작하는데 Get 방식으로 동작합니다.


필요한건 HTTPS에서 POST로 데이터를 보내는건데


어떤방법이 있을지 가르쳐주시면 고맙겠습니다...

이 글에 답변 등록하기
 [답변]HTTP / POST 2005-11-29 오전 10:20:56
김대홍 (kyh0511)  김대홍님께 메시지 보내기김대홍님을 내 주소록에 추가합니다.김대홍님의 개인게시판 가기 번호: 551683  

//---------------------------------------------------------------------------||

//-- Post_Query

//---------------------------------------------------------------------------||

char * Post_Query (char * szURL, char * szPostData)

{

    CAString aString;

    aString = "";

 

    HINTERNET hSession = ::InternetOpen ("TestOpen", 0, NULL, NULL, NULL);

    if (hSession)

    {

        // crack url..

        char szExtraInfo    [MAX_PATH];

        char szHostName     [MAX_PATH];

        char szPassword     [MAX_PATH];

        char szScheme       [MAX_PATH];

        char szUrlPath      [MAX_PATH * 4];

        char szUserName     [MAX_PATH];

 

        URL_COMPONENTS      urlcomponent;

        urlcomponent.dwExtraInfoLength  = MAX_PATH;

        urlcomponent.dwHostNameLength   = MAX_PATH;

        urlcomponent.dwPasswordLength   = MAX_PATH;

        urlcomponent.dwSchemeLength     = MAX_PATH;

        urlcomponent.dwStructSize       = sizeof(URL_COMPONENTS);

        urlcomponent.dwUrlPathLength    = MAX_PATH * 4;

        urlcomponent.dwUserNameLength   = MAX_PATH;

        urlcomponent.lpszExtraInfo      = szExtraInfo;

        urlcomponent.lpszHostName       = szHostName;

        urlcomponent.lpszPassword       = szPassword;

        urlcomponent.lpszScheme         = szScheme;

        urlcomponent.lpszUrlPath        = szUrlPath;

        urlcomponent.lpszUserName       = szUserName;

        urlcomponent.nPort              = 0;

        //urlcomponent.nScheme = 0;

        ::InternetCrackUrl(szURL, sizeof(URL_COMPONENTS), NULL, &urlcomponent);

        // download user

        HINTERNET hConnect = ::InternetConnect (hSession,

                                                urlcomponent.lpszHostName,

                                                urlcomponent.nPort,

                                                urlcomponent.lpszUserName,

                                                urlcomponent.lpszPassword,

                                                urlcomponent.nScheme,

                                                NULL,

                                                NULL);

        if (hConnect)

        {

            // connected server..

            HINTERNET hObject = ::HttpOpenRequest ( hConnect,

                                                    szPostData == NULL ? "GET" : "POST",

                                                    urlcomponent.lpszUrlPath,

                                                    "HTTP/1.1",

                                                    "text/*" ,

                                                    NULL,

                                                    INTERNET_FLAG_RELOAD,

                                                    NULL);

            if (hObject)

            {

                // post header

                char szLen[MAX_PATH];

                CAString aHeader;

                aHeader = "";

 

                wsprintf(szLen, "%d", szPostData == NULL ? 0 : strlen(szPostData));

                aHeader +=_T("Accept: text/*\r\n");

                aHeader +=_T("User-Agent: Mozilla/4.0 (compatible; MSIE 5.0;* Windows NT)\r\n");

                aHeader +=_T("Content-type: application/x-www-form-urlencoded\r\n");

                aHeader +=_T("Content-length: ");

                aHeader += szLen;

                aHeader +=_T("\r\n\n");

               

                ::HttpAddRequestHeaders(hObject,(LPCTSTR)aHeader.m_pString,-1L,HTTP_ADDREQ_FLAG_ADD);

 

                // post data..

                if (szPostData)

                {

                    ::HttpSendRequest(hObject,NULL,0L,(LPVOID)szPostData,strlen(szPostData));

                }

                else

                {

                    ::HttpSendRequest(hObject,NULL,0L,NULL,0);

                }

 

                // open object

                char szBuffer[1024];

                DWORD dwRead = 0;

                //DWORD dwWrite = 0;

               

                while (::InternetReadFile(hObject, szBuffer, 1023, &dwRead) &&

                        dwRead > 0)

                {

                    szBuffer[dwRead] = 0;

                    aString += szBuffer;

                    Sleep(1);

                }

                ::InternetCloseHandle(hObject);

                //bDownLoad = TRUE;

            }

        }

    }

    if (aString.m_pString && aString.GetLength() > 0)

    {

        char * pReturn = new char[aString.GetLength() + 1];

        strcpy(pReturn, aString.m_pString);

        return pReturn;

    }

    return 0;

}

 

 

저는 이렇게 만들어서 썼었는데, 대충 잘 동작하는 것 같습니다.

요구사항에 맞게 수정해서 쓰셔도 될 듯 합니다.


    CAString aString;


과 같은 것들은 자체 라이브러리이니.. CString 이나 char * 등으로 맞게 변환해서 쓰시면 됩니다.


이 글에 답변 등록하기
 [답변]안되는데요...ㅠㅠ 2005-11-29 오전 11:45:22
김연준 (longdari)  김연준님께 메시지 보내기김연준님을 내 주소록에 추가합니다.김연준님의 개인게시판 가기 번호: 551710  


님이 말씀하신대로 HttpAddRequestHeaders 함수를 추가했는데 제대로 동작을 안합니다.

어디가 틀렸을까요...?



    HINTERNET hInternetRoot = InternetOpen( "TestWinINet",

                                            INTERNET_OPEN_TYPE_PRECONFIG,

                                            NULL,

                                            NULL,

                                            0);


    HINTERNET hInternetConnect = InternetConnect(   hInternetRoot,

                                                    "211.111.111.111",

                                                    INTERNET_DEFAULT_HTTPS_PORT,

                                                    "",

                                                    "",

                                                    INTERNET_SERVICE_HTTP,

                                                    0,

                                                    0);


    HINTERNET hOpenRequest = HttpOpenRequest(   hInternetConnect,

                                                "POST",

                                                "/jsp/trcs/portal/kk2.jsp",

                                                HTTP_VERSION,

                                                "",

                                                NULL,

                                                INTERNET_FLAG_SECURE|INTERNET_FLAG_IGNORE_CERT_CN_INVALID|INTERNET_FLAG_IGNORE_CERT_DATE_INVALID,

                                                0);


    char szPostData[2048] = {0};

    lstrcpy(szPostData, "input1=aaa");


    // post header

    char szLen[MAX_PATH] = {0};

    char szHeader[2048] = {0};


    wsprintf(szLen, "%d", lstrlen(szPostData));

    lstrcpy(szHeader, "Accept: text/*\r\n");

    lstrcat(szHeader, "User-Agent: Mozilla/4.0 (compatible; MSIE 5.0;* Windows NT)\r\n");

    lstrcat(szHeader, "Content-type: application/x-www-form-urlencoded\r\n");

    lstrcat(szHeader, "Content-length: ");

    lstrcat(szHeader, szLen);

    lstrcat(szHeader, "\r\n\n");


    HttpAddRequestHeaders(hOpenRequest, szHeader, -1L, HTTP_ADDREQ_FLAG_ADD);


    BOOL bSendRequest = HttpSendRequest(hOpenRequest,

                                        NULL,

                                        0,

                                        szPostData,

                                        lstrlen(szPostData));


    char szBuf[2048] = {0};

    DWORD dwSize = 0;

    BOOL bRead = InternetReadFile(  hOpenRequest,

                                    szBuf,

                                    sizeof(szBuf),

                                    &dwSize);


    MessageBox(szBuf);


    BOOL bRet = InternetCloseHandle(hOpenRequest);

    bRet = InternetCloseHandle(hInternetConnect);

    bRet = InternetCloseHandle(hInternetRoot);


이 글에 답변 등록하기
         [답변]님이 말씀하신대로 HttpAddRequestHeaders 함수를 추가했는데 제대로 동작을 안합니다. 2006-05-12 오후 6:09:32
김동환 (htjulia)  김동환님께 메시지 보내기김동환님을 내 주소록에 추가합니다.김동환님의 개인게시판 가기 번호: 576410  

 님이 말씀하신대로 HttpAddRequestHeaders 함수를 추가했는데 제대로 동작을 안합니다.

어디가 틀렸을까요...?



    HINTERNET hInternetRoot = InternetOpen( "TestWinINet",

                                            INTERNET_OPEN_TYPE_PRECONFIG,

                                            NULL,

                                            NULL,

                                            0);


    HINTERNET hInternetConnect = InternetConnect(   hInternetRoot,

                                                    "211.111.111.111",

                                                    INTERNET_DEFAULT_HTTPS_PORT,

                                                    "",

                                                    "",

                                                    INTERNET_SERVICE_HTTP,

                                                    0,

                                                    0);


    HINTERNET hOpenRequest = HttpOpenRequest(   hInternetConnect,

                                                "POST",

                                                "/jsp/trcs/portal/kk2.jsp",

                                                HTTP_VERSION,

                                                "",

                                                NULL,

                                                INTERNET_FLAG_SECURE|INTERNET_FLAG_IGNORE_CERT_CN_INVALID|INTERNET_FLAG_IGNORE_CERT_DATE_INVALID,

                                                0);

 /*

    이부분에 internalSetoption을 주셔야합니다.

 

      dwFlags = 0 ;

      dwFlags = SECURITY_FLAG_IGNORE_UNKNOWN_CA   |저장하기

            SECURITY_FLAG_IGNORE_REVOCATION              |

            SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTP   |

            SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPS |

            SECURITY_FLAG_IGNORE_CERT_DATE_INVALID   |

            SECURITY_FLAG_IGNORE_CERT_CN_INVALID;

 

      InternetSetOption (hOpenRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));


위의 코딩을 넣어서 해보심 될겁니다....

관련된 FLAG들은 찾아 보시고요...

즐코 하셈... ^^

*/



    char szPostData[2048] = {0};

    lstrcpy(szPostData, "input1=aaa");


    // post header

    char szLen[MAX_PATH] = {0};

    char szHeader[2048] = {0};


    wsprintf(szLen, "%d", lstrlen(szPostData));

    lstrcpy(szHeader, "Accept: text/*\r\n");

    lstrcat(szHeader, "User-Agent: Mozilla/4.0 (compatible; MSIE 5.0;* Windows NT)\r\n");

    lstrcat(szHeader, "Content-type: application/x-www-form-urlencoded\r\n");

    lstrcat(szHeader, "Content-length: ");

    lstrcat(szHeader, szLen);

    lstrcat(szHeader, "\r\n\n");


    HttpAddRequestHeaders(hOpenRequest, szHeader, -1L, HTTP_ADDREQ_FLAG_ADD);


    BOOL bSendRequest = HttpSendRequest(hOpenRequest,

                                        NULL,

                                        0,

                                        szPostData,

                                        lstrlen(szPostData));


    char szBuf[2048] = {0};

    DWORD dwSize = 0;

    BOOL bRead = InternetReadFile(  hOpenRequest,

                                    szBuf,

                                    sizeof(szBuf),

                                    &dwSize);


    MessageBox(szBuf);


    BOOL bRet = InternetCloseHandle(hOpenRequest);

    bRet = InternetCloseHandle(hInternetConnect);

    bRet = InternetCloseHandle(hInternetRoot);