clientRequest.set(i->first, i->second);
clientRequest.set("X-Sogou-Auth", authToken);
clientRequest.set("X-Sogou-Tag", tag);
clientRequest.set("X-Sogou-Timestamp", timestamp);
ostream& os = client.sendRequest(clientRequest);
os.flush();
if (toUpper(request.getMethod()) == "POST")
{
write(request.stream(), os);
os.flush();
}
HTTPResponse clientResponse;
istream& is = client.receiveResponse(clientResponse);
response.setStatusAndReason(clientResponse.getStatus(), clientResponse.getReason());
for (Nameva lueCollection::ConstIterator i = clientResponse.begin(); i != clientResponse.end(); ++i)
response.set(i->first, i->second);
ostream& out = response.send();
out.flush();
if (toUpper(request.getMethod()) == "CONNECT" && clientResponse.getStatus() == HTTPResponse::HTTP_OK)
{
char buffer[BUFFER_SIZE];
int sz;
istream &in = request.stream();
sz = (int)is.readsome(buffer, sizeof(buffer));
if (sz > 0)
{
out.write(buffer, sz);
out.flush();
}
sz = (int)in.readsome(buffer, sizeof(buffer));
if (sz > 0)
{
os.write(buffer, sz);
os.flush();
}
StreamSocket s1 = client.socket();
StreamSocket s2 = ((HTTPServerRequestImpl*)&request)->socket();
vector
while (true)
{
list.clear();
list.push_back(s1);
Socket::select(list, l2, l3, Timespan(20, 0));
if (list.empty())
break;
if (list[0] == s2)
{
sz = s2.receiveBytes(buffer, sizeof(buffer));
if (sz <= 0)
break;
s1.sendBytes(buffer, sz);
}
else
{
sz = s1.receiveBytes(buffer, sizeof(buffer));
if (sz <= 0)
break;
s2.sendBytes(buffer, sz);
}
}
}
else
{
write(is, out);
out.flush();
}
}
catch (const Exception &)
{
client.reset();
}
}
};
class ProxyRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler *createRequestHandler(const HTTPServerRequest & request)
{
return new ProxyService;
}
};
int main(int argc, char **argv)
{
ThreadPool::defaultPool().addCapacity(128 - ThreadP