Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl

pull/509/head
orignal 8 years ago
commit e2c192d254

@ -253,21 +253,12 @@ namespace http {
if (pos >= eoh) if (pos >= eoh)
break; break;
} }
auto it = headers.find("Host");
if (it != headers.end ()) {
host = it->second;
} else if (version == "HTTP/1.1") {
return -1; /* 'Host' header required for HTTP/1.1 */
} else if (url.host != "") {
host = url.host;
}
return eoh + strlen(HTTP_EOH); return eoh + strlen(HTTP_EOH);
} }
std::string HTTPReq::to_string() { std::string HTTPReq::to_string() {
std::stringstream ss; std::stringstream ss;
ss << method << " " << uri << " " << version << CRLF; ss << method << " " << uri << " " << version << CRLF;
ss << "Host: " << host << CRLF;
for (auto & h : headers) { for (auto & h : headers) {
ss << h.first << ": " << h.second << CRLF; ss << h.first << ": " << h.second << CRLF;
} }

@ -69,7 +69,6 @@ namespace http {
std::string version; std::string version;
std::string method; std::string method;
std::string uri; std::string uri;
std::string host;
HTTPReq (): version("HTTP/1.0"), method("GET"), uri("/") {}; HTTPReq (): version("HTTP/1.0"), method("GET"), uri("/") {};

@ -137,8 +137,24 @@ namespace proxy {
void HTTPReqHandler::SanitizeHTTPRequest(i2p::http::HTTPReq & req) void HTTPReqHandler::SanitizeHTTPRequest(i2p::http::HTTPReq & req)
{ {
req.del_header("Referer"); req.del_header("Referer");
req.add_header("Connection", "close", true); req.del_header("Via");
req.add_header("User-Agent", "MYOB/6.66 (AN/ON)", true); req.del_header("Forwarded");
std::vector<std::string> toErase;
for (auto it : req.headers) {
if (it.first.compare(0, 12, "X-Forwarded-")) {
toErase.push_back(it.first);
} else if (it.first.compare(0, 6, "Proxy-")) {
toErase.push_back(it.first);
} else {
/* allow this header */
}
}
for (auto header : toErase) {
req.headers.erase(header);
}
/* replace headers */
req.add_header("Connection", "close", true); /* keep-alive conns not supported yet */
req.add_header("User-Agent", "MYOB/6.66 (AN/ON)", true); /* privacy */
} }
/** /**
@ -192,9 +208,28 @@ namespace proxy {
std::string dest_host = url.host; std::string dest_host = url.host;
uint16_t dest_port = url.port; uint16_t dest_port = url.port;
/* convert proxy-style http req to ordinary one: */ /* set proper 'Host' header in upstream request */
/* 1) replace Host header, 2) make relative url */ auto h = req.headers.find("Host");
req.add_header("Host", url.host, true); if (dest_host != "") {
/* absolute url, replace 'Host' header */
std::string h = dest_host;
if (dest_port != 0 && dest_port != 80)
h += ":" + std::to_string(dest_port);
req.add_header("Host", h, true);
} else if (h != req.headers.end()) {
/* relative url and 'Host' header provided. transparent proxy mode? */
i2p::http::URL u;
std::string t = "http://" + h->second;
u.parse(t);
dest_host = u.host;
dest_port = u.port;
} else {
/* relative url and missing 'Host' header */
std::string message = "Can't detect destination host from request";
HTTPRequestFailed(message.c_str());
return true;
}
/* make relative url */
url.schema = ""; url.schema = "";
url.host = ""; url.host = "";
req.uri = url.to_string(); req.uri = url.to_string();
@ -224,8 +259,10 @@ namespace proxy {
return; return;
} }
if (HandleRequest(len)) if (HandleRequest(len)) {
m_recv_buf.clear();
return; /* request processed */ return; /* request processed */
}
AsyncSockRead(); AsyncSockRead();
} }

@ -58,7 +58,11 @@ All options below still possible in cmdline, but better write it in config file:
* --bob.address= - The address to listen on (BOB command channel) * --bob.address= - The address to listen on (BOB command channel)
* --bob.port= - Port of BOB command channel. Usually 2827. BOB is off if not specified * --bob.port= - Port of BOB command channel. Usually 2827. BOB is off if not specified
* --sam.enabled= - If BOB is enabled. false by default * --bob.enabled= - If BOB is enabled. false by default
* --i2cp.address= - The address to listen on
* --i2cp.port= - Port of I2CP server. Usually 7654. IPCP is off if not specified
* --i2cp.enabled= - If I2CP is enabled. false by default. Other services don't requeire I2CP
* --i2pcontrol.address= - The address to listen on (I2P control service) * --i2pcontrol.address= - The address to listen on (I2P control service)
* --i2pcontrol.port= - Port of I2P control service. Usually 7650. I2PControl is off if not specified * --i2pcontrol.port= - Port of I2P control service. Usually 7650. I2PControl is off if not specified

Loading…
Cancel
Save