void RequestHeader::ParseHeaders(int fd) { int line_count = 0; // Loop through request headers. while (true) { if (!fd_util::WaitUntilReady(fd, 5.0)) { // Wait max 5 secs. // Timed out or error. ok = false; return; } char buffer[1024]; fd_util::ReadLine(fd, buffer, 1023); StringTrimEndNonAlphaNum(buffer); if (buffer[0] == '\0') break; ParseHttpHeader(buffer); line_count++; if (type == SIMPLE) { // Done! ILOG("Simple: Done parsing http request."); break; } } ILOG("finished parsing request."); ok = line_count > 1; }
void RequestHeader::ParseHeaders(net::InputSink *sink) { int line_count = 0; std::string line; while (sink->ReadLine(line)) { if (line.length() == 0) { // Blank line, this means end of headers. break; } ParseHttpHeader(line.c_str()); line_count++; if (type == SIMPLE) { // Done! ILOG("Simple: Done parsing http request."); break; } } ILOG("finished parsing request."); ok = line_count > 1; }
//*************************************** //Method: ProxyThread //FullName: ProxyThread //Access: public //Returns: unsigned int __stdcall //Qualifier: 线程执行函数 //Parameter: LPVOID lpParameter //**************************************** unsigned int __stdcall ProxyThread(LPVOID lpParameter) { char Buffer[MAXSIZE]; char *CacheBuffer; ZeroMemory(Buffer, MAXSIZE); SOCKADDR_IN clientAddr; int length = sizeof(SOCKADDR_IN); int recvSize; int ret; recvSize = recv(((ProxyParam*)lpParameter)->clientSocket, Buffer, MAXSIZE, 0); if (recvSize <= 0) { goto error; } HttpHeader* httpHeader = new HttpHeader(); CacheBuffer = new char[recvSize + 1]; ZeroMemory(CacheBuffer, recvSize + 1); memcpy(CacheBuffer, Buffer, recvSize); ParseHttpHeader(CacheBuffer, httpHeader); delete CacheBuffer; // 网址过滤 if (!strcmp(httpHeader->host, "donghua.dmzj.com")) { printf("网站过滤\n"); goto error; } /* if (!strcmp(httpHeader->host, "www.sohu.com")) { memcpy(httpHeader->host, "donghua.dmzj.com", MAXSIZE); } */ if (!ConnectToServer(&((ProxyParam*)lpParameter)->serverSocket, httpHeader->host)) { goto error; } printf("代理连接主机 %s 成功\n", httpHeader->host); //将客户端发送的HTTP数据报文直接转发给目标服务器 ret = send(((ProxyParam*)lpParameter)->serverSocket, Buffer, strlen(Buffer) + 1, 0); //等待目标服务器返回数据 recvSize = recv(((ProxyParam*)lpParameter)->serverSocket, Buffer, MAXSIZE, 0); FILE *stream; fopen_s(&stream, "cache.txt", "w+"); fprintf(stream, "%s", Buffer); fclose(stream); if (recvSize <= 0) { goto error; } //将目标服务器返回的数据直接转发给客户端 ret = send(((ProxyParam*)lpParameter)->clientSocket, Buffer, sizeof(Buffer), 0); //错误处理 error: printf("关闭套接字\n"); Sleep(200); closesocket(((ProxyParam*)lpParameter)->clientSocket); closesocket(((ProxyParam*)lpParameter)->serverSocket); delete lpParameter; //_endthreadex(0); return 0; }