Update HTTP code to support HTTP/1.0 responses, eg metarproxy

This commit is contained in:
James Turner
2011-08-07 10:49:13 +01:00
parent 55208d7d1f
commit 7525fd5e3e
6 changed files with 179 additions and 52 deletions
+23 -3
View File
@@ -18,9 +18,11 @@ extern const int DEFAULT_HTTP_PORT;
Request::Request(const string& url, const string method) :
_method(method),
_url(url),
_responseVersion(HTTP_VERSION_UNKNOWN),
_responseStatus(0),
_responseLength(0),
_receivedBodyBytes(0)
_receivedBodyBytes(0),
_willClose(false)
{
}
@@ -52,17 +54,21 @@ void Request::responseStart(const string& r)
string_list parts = strutils::split(r, NULL, maxSplit);
if (parts.size() != 3) {
SG_LOG(SG_IO, SG_WARN, "HTTP::Request: malformed response start:" << r);
_responseStatus = 400;
_responseReason = "bad HTTP response header";
setFailure(400, "malformed HTTP response header");
return;
}
_responseVersion = decodeVersion(parts[0]);
_responseStatus = strutils::to_int(parts[1]);
_responseReason = parts[2];
}
void Request::responseHeader(const string& key, const string& value)
{
if (key == "connection") {
_willClose = (value.find("close") >= 0);
}
_responseHeaders[key] = value;
}
@@ -185,6 +191,20 @@ void Request::failed()
// no-op in base class
}
Request::HTTPVersion Request::decodeVersion(const string& v)
{
if (v == "HTTP/1.1") return HTTP_1_1;
if (v == "HTTP/1.0") return HTTP_1_0;
if (strutils::starts_with(v, "HTTP/0.")) return HTTP_0_x;
return HTTP_VERSION_UNKNOWN;
}
bool Request::closeAfterComplete() const
{
// for non HTTP/1.1 connections, assume server closes
return _willClose || (_responseVersion != HTTP_1_1);
}
} // of namespace HTTP
} // of namespace simgear