int HttpRequest::Request(const void* data,int len,Memory<char>& html,String* retHead){ if(!hRequest) return -1; if(!::HttpSendRequest(hRequest,NULL,0,(LPVOID)data,len)) return -1; DWORD dwSize = 0; if(retHead){ HttpQueryInfo(hRequest,HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &dwSize, NULL); if(dwSize!=0){ retHead->SetCubage(dwSize/2); if(HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, (LPVOID)retHead->Handle(), &dwSize, NULL)){ //安全起见,实际上数据已经是一个NULL结尾的字串。 (*retHead)[dwSize/2-1] = 0; retHead->Realize(); } } } int offset = 0; for(;;){ char szData[1024]; DWORD dwByteRead = 0; ::InternetReadFile(hRequest,szData,sizeof(szData),&dwByteRead); if(!dwByteRead) break; if(html.Length()<dwByteRead+offset+1){ if(!html.SetLength(dwByteRead+offset+1)){ Print(L"html alloc failed"); break; } } html.CopyFrom(szData,dwByteRead,offset); offset += dwByteRead; } if(offset!=0) html[offset] = 0; ::InternetCloseHandle(hConnect); hConnect = 0; ::InternetCloseHandle(hRequest); hRequest = 0; return offset; }