안녕하세요
WinINet을 이용하여 HTTPS를 이용하려고 합니다.
InternetConnect의 파라미터중 INTERNET_DEFAULT_HTTPS_PORT가 있어서
사용하려했는데 HTTPS 통신을 하지 않습니다.
InternetOpenUrl을 이용해서 URL에 https://... 를 줘서 해봤는데
HTTPS는 동작하는데 Get 방식으로 동작합니다.
필요한건 HTTPS에서 POST로 데이터를 보내는건데
어떤방법이 있을지 가르쳐주시면 고맙겠습니다...
//---------------------------------------------------------------------------||
//-- 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/*" ,
INTERNET_FLAG_RELOAD,
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;
저는 이렇게 만들어서 썼었는데, 대충 잘 동작하는 것 같습니다.
요구사항에 맞게 수정해서 쓰셔도 될 듯 합니다.
과 같은 것들은 자체 라이브러리이니.. CString 이나 char * 등으로 맞게 변환해서 쓰시면 됩니다.
님이 말씀하신대로 HttpAddRequestHeaders 함수를 추가했는데 제대로 동작을 안합니다.
어디가 틀렸을까요...?
HINTERNET hInternetRoot = InternetOpen( "TestWinINet",
INTERNET_OPEN_TYPE_PRECONFIG,
0);
HINTERNET hInternetConnect = InternetConnect( hInternetRoot,
"211.111.111.111",
INTERNET_DEFAULT_HTTPS_PORT,
"",
INTERNET_SERVICE_HTTP,
0,
HINTERNET hOpenRequest = HttpOpenRequest( hInternetConnect,
"POST",
"/jsp/trcs/portal/kk2.jsp",
HTTP_VERSION,
INTERNET_FLAG_SECURE|INTERNET_FLAG_IGNORE_CERT_CN_INVALID|INTERNET_FLAG_IGNORE_CERT_DATE_INVALID,
char szPostData[2048] = {0};
lstrcpy(szPostData, "input1=aaa");
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,
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);
/*
이부분에 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들은 찾아 보시고요...
즐코 하셈... ^^
*/
Then, my name is
And the password is
In addition, my web site address is
It's SECRET.