Tweak HTTP handling for POST requests.

Tolerate slightly malformed request URLs (no slash following the host specified), and use a better check when POST-ing to decide the request-body data source.
This commit is contained in:
James Turner
2012-11-17 18:08:38 +00:00
parent 9f31addfa5
commit d1af42e9ad
2 changed files with 10 additions and 7 deletions

View File

@@ -130,7 +130,7 @@ public:
{
assert(!sentRequests.empty());
activeRequest = sentRequests.front();
activeRequest = sentRequests.front();
activeRequest->responseStart(buffer);
state = STATE_GETTING_HEADERS;
buffer.clear();
@@ -169,9 +169,10 @@ public:
Request_ptr r = queuedRequests.front();
requestBodyBytesToSend = r->requestBodyLength();
stringstream headerData;
string path = r->path();
assert(!path.empty());
string query = r->query();
string bodyData;
@@ -179,7 +180,7 @@ public:
path = r->scheme() + "://" + r->host() + r->path();
}
if (r->method() == "POST") {
if (r->requestBodyType() == CONTENT_TYPE_URL_ENCODED) {
headerData << r->method() << " " << path << " HTTP/1.1\r\n";
bodyData = query.substr(1); // URL-encode, drop the leading '?'
headerData << "Content-Type:" << CONTENT_TYPE_URL_ENCODED << "\r\n";
@@ -429,7 +430,7 @@ public:
private:
bool connectToHost()
{
SG_LOG(SG_IO, SG_INFO, "HTTP connecting to " << host << ":" << port);
SG_LOG(SG_IO, SG_DEBUG, "HTTP connecting to " << host << ":" << port);
if (!open()) {
SG_LOG(SG_ALL, SG_WARN, "HTTP::Connection: connectToHost: open() failed");
@@ -657,7 +658,6 @@ void Client::update(int waitTimeout)
_connections.erase(del);
} else {
if (it->second->shouldStartNext()) {
SG_LOG(SG_IO, SG_INFO, "should start next, hmm");
it->second->tryStartNextRequest();
}

View File

@@ -112,8 +112,10 @@ string Request::path() const
}
int hostEnd = u.find('/', schemeEnd + 3);
if (hostEnd < 0) {
return ""; // couldn't parse host
if (hostEnd < 0) {
// couldn't parse host, or URL looks like 'http://foo.com' (no trailing '/')
// fixup to root resource path: '/'
return "/";
}
int query = u.find('?', hostEnd + 1);
@@ -203,6 +205,7 @@ void Request::setFailure(int code, const std::string& reason)
void Request::failed()
{
// no-op in base class
SG_LOG(SG_IO, SG_INFO, "request failed:" << url());
}
Request::HTTPVersion Request::decodeVersion(const string& v)