/* */ #include "HttpConnection.h" #include "DlRetryEx.h" #include "DlAbortEx.h" #include "Util.h" #include "Base64.h" #include "message.h" #include "prefs.h" #include "LogFactory.h" #include HttpConnection::HttpConnection(int cuid, const SocketHandle& socket, const Option* op): cuid(cuid), socket(socket), option(op), logger(LogFactory::getInstance()) {} string HttpConnection::eraseConfidentialInfo(const string& request) { istringstream istr(request); ostringstream ostr; string line; while(getline(istr, line)) { if(Util::startsWith(line, "Authorization: Basic")) { ostr << "Authorization: Basic ********\n"; } else if(Util::startsWith(line, "Proxy-Authorization: Basic")) { ostr << "Proxy-Authorization: Basic ********\n"; } else { ostr << line << "\n"; } } return ostr.str(); } void HttpConnection::sendRequest(const HttpRequestHandle& httpRequest) { string request = httpRequest->createRequest(); logger->info(MSG_SENDING_REQUEST, cuid, eraseConfidentialInfo(request).c_str()); socket->writeData(request.c_str(), request.size()); outstandingHttpRequests.push_back(new HttpRequestEntry(httpRequest, new HttpHeaderProcessor())); } void HttpConnection::sendProxyRequest(const HttpRequestHandle& httpRequest) { string request = httpRequest->createProxyRequest(); logger->info(MSG_SENDING_REQUEST, cuid, eraseConfidentialInfo(request).c_str()); socket->writeData(request.c_str(), request.size()); outstandingHttpRequests.push_back(new HttpRequestEntry(httpRequest, new HttpHeaderProcessor())); } HttpResponseHandle HttpConnection::receiveResponse() { if(outstandingHttpRequests.size() == 0) { throw new DlAbortEx(EX_NO_HTTP_REQUEST_ENTRY_FOUND); } HttpRequestEntryHandle entry = outstandingHttpRequests.front(); HttpHeaderProcessorHandle proc = entry->getHttpHeaderProcessor(); char buf[512]; int32_t size = sizeof(buf); socket->peekData(buf, size); if(size == 0) { throw new DlRetryEx(EX_INVALID_RESPONSE); } proc->update(buf, size); if(!proc->eoh()) { socket->readData(buf, size); return 0; } int32_t putbackDataLength = proc->getPutBackDataLength(); size -= putbackDataLength; socket->readData(buf, size); // OK, we got all headers. logger->info(MSG_RECEIVE_RESPONSE, cuid, proc->getHeaderString().c_str()); pair httpStatusHeader = proc->getHttpStatusHeader(); HttpResponseHandle httpResponse = new HttpResponse(); httpResponse->setCuid(cuid); httpResponse->setStatus(strtol(httpStatusHeader.first.c_str(), 0, 10)); httpResponse->setHttpHeader(httpStatusHeader.second); httpResponse->setHttpRequest(entry->getHttpRequest()); outstandingHttpRequests.pop_front(); return httpResponse; }