BOOL UseHttpSendReqEx(HINTERNET hConnect, TCHAR *upFile)
{
INTERNET_BUFFERS BufferIn = {0};
DWORD dwBytesRead;
DWORD dwBytesWritten;
BYTE pBuffer[1024]; // Read from file in 1K chunks
BOOL bRead, bRet;
BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS );
HINTERNET hRequest = HttpOpenRequest (hConnect, "PUT",
"/test/page.htm", NULL, NULL, NULL, 0, 0);
if (!hRequest)
{
printf("Failed to open request handle: %lu\n", GetLastError ());
return FALSE;
}
HANDLE hFile = CreateFile (upFile, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("\nFailed to open local file %s.", upFile);
return FALSE;
}
BufferIn.dwBufferTotal = GetFileSize (hFile, NULL);
printf ("File size is %d\n", BufferIn.dwBufferTotal );
if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, HSR_INITIATE, 0))
{
printf( "Error on HttpSendRequestEx %lu\n",GetLastError() );
return FALSE;
}
DWORD sum = 0;
do
{
if (!(bRead = ReadFile (hFile, pBuffer, sizeof(pBuffer),
&dwBytesRead, NULL)))
{
printf ("\nReadFile failed on buffer %lu.",GetLastError());
break;
}
if (!(bRet=InternetWriteFile( hRequest, pBuffer, dwBytesRead,
&dwBytesWritten)))
{
printf ("\nInternetWriteFile failed %lu", GetLastError());
break;
}
sum += dwBytesWritten;
}
while (dwBytesRead == sizeof(pBuffer)) ;
CloseHandle (hFile);
printf ("Actual written bytes: %d\n", sum);
if(!HttpEndRequest(hRequest, NULL, 0, 0))
{
printf( "Error on HttpEndRequest %lu \n", GetLastError());
return FALSE;
}
return TRUE;
}
WinInet: upload progress
возник вопрос: как наблюдать прогресс отправки файла через WinInet?
ума не приложу... копался в MSDN нашел решение, но использовать у меня его не получилось... поэтому решил спросить здесь :)
может кто знает? :)
Цитата: Тень Пса
ума не приложу... копался в MSDN нашел решение, но использовать у меня его не получилось...
Решение в студию, будем разбираться:)
Код:
вот, но здесь метод PUT, а у меня POST, и вместо самого файла есть просто массив byte'ов =)
вчера уже весь день бился над этим... и никак...
GLOBAL_SERVER - это адрес, или ip сервера (host.com например);
GLOBAL_SCRIPT_PATH - это уже путь до скрипта куда делаем запрос ("/" или "/cgi-bin/xml.cgi" ну и тд);
эти переменные уже определены.
Код:
AnsiString TForm1::Post(AnsiString header, const void * data2, const int content_length)
{
DWORD dwServiceType;
DWORD buffsize=0;
AnsiString strData;
HINTERNET hSession=NULL;
HINTERNET hConnect=NULL;
HINTERNET hHTTPReq=NULL;
hSession=InternetOpen("Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hSession)
{
hConnect=InternetConnect(hSession, GLOBAL_SERVER, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if (hConnect)
{
hHTTPReq=HttpOpenRequest(hConnect, "POST", GLOBAL_SCRIPT_PATH, NULL, NULL, NULL,
INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_KEEP_CONNECTION
|INTERNET_FLAG_IGNORE_CERT_CN_INVALID,0);
if(hHTTPReq)
{
int TryCounts=1;
while (1)
{
BOOL resReq=HttpSendRequest( hHTTPReq, header.c_str(), header.Length(), (LPVOID)data2, content_length );
if (!resReq)
{
DWORD dwError = GetLastError();
if (dwError != ERROR_INTERNET_INVALID_CA)
{
break;
}
else
{
DWORD dwFlags;
DWORD dwBuffLen = sizeof(dwFlags);
InternetQueryOption(hHTTPReq, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
InternetSetOption(hHTTPReq, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));
continue;
}
}
else
{
DWORD dwStatusCode=0;
GetStatusCodeFormHTTPReq(hHTTPReq, &dwStatusCode);
if ((dwStatusCode==200 && data2!=NULL) || (dwStatusCode>=200 && dwStatusCode<=299))
{
char rBuffer[1024];
DWORD rBytes=0;
while (1)
{
InternetReadFile(hHTTPReq, rBuffer, 1023, &rBytes);
if (rBytes==0) break;
rBuffer[rBytes]=0;
strData+=(TCHAR *)rBuffer;
}
}
else
{
if (TryCounts==0) //Может сказать об ошибке???
break;
}
break;
}
}
InternetCloseHandle(hHTTPReq);
}
InternetCloseHandle(hConnect);
}
InternetCloseHandle(hSession);
}
return strData;
}
{
DWORD dwServiceType;
DWORD buffsize=0;
AnsiString strData;
HINTERNET hSession=NULL;
HINTERNET hConnect=NULL;
HINTERNET hHTTPReq=NULL;
hSession=InternetOpen("Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hSession)
{
hConnect=InternetConnect(hSession, GLOBAL_SERVER, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if (hConnect)
{
hHTTPReq=HttpOpenRequest(hConnect, "POST", GLOBAL_SCRIPT_PATH, NULL, NULL, NULL,
INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_KEEP_CONNECTION
|INTERNET_FLAG_IGNORE_CERT_CN_INVALID,0);
if(hHTTPReq)
{
int TryCounts=1;
while (1)
{
BOOL resReq=HttpSendRequest( hHTTPReq, header.c_str(), header.Length(), (LPVOID)data2, content_length );
if (!resReq)
{
DWORD dwError = GetLastError();
if (dwError != ERROR_INTERNET_INVALID_CA)
{
break;
}
else
{
DWORD dwFlags;
DWORD dwBuffLen = sizeof(dwFlags);
InternetQueryOption(hHTTPReq, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
InternetSetOption(hHTTPReq, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));
continue;
}
}
else
{
DWORD dwStatusCode=0;
GetStatusCodeFormHTTPReq(hHTTPReq, &dwStatusCode);
if ((dwStatusCode==200 && data2!=NULL) || (dwStatusCode>=200 && dwStatusCode<=299))
{
char rBuffer[1024];
DWORD rBytes=0;
while (1)
{
InternetReadFile(hHTTPReq, rBuffer, 1023, &rBytes);
if (rBytes==0) break;
rBuffer[rBytes]=0;
strData+=(TCHAR *)rBuffer;
}
}
else
{
if (TryCounts==0) //Может сказать об ошибке???
break;
}
break;
}
}
InternetCloseHandle(hHTTPReq);
}
InternetCloseHandle(hConnect);
}
InternetCloseHandle(hSession);
}
return strData;
}
Цитата: Тень Пса
а вот функция, которая POST посылает, ей я и передаю byte [] в котором лежит всё тело запроса, в параметр header - соответсвенно отдаю заголовки...
я так предполагаю, что мне это тело запроса и надо использовать как "файл" в предыдущем примере, но что-то пока что не получилось....
я так предполагаю, что мне это тело запроса и надо использовать как "файл" в предыдущем примере, но что-то пока что не получилось....
посмотри INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallback(
HINTERNET hInternet,
INTERNET_STATUS_CALLBACK lpfnInternetCallback
);
не уверен, но может это то, что нужно.