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:
@@ -130,7 +130,7 @@ public:
|
|||||||
{
|
{
|
||||||
assert(!sentRequests.empty());
|
assert(!sentRequests.empty());
|
||||||
|
|
||||||
activeRequest = sentRequests.front();
|
activeRequest = sentRequests.front();
|
||||||
activeRequest->responseStart(buffer);
|
activeRequest->responseStart(buffer);
|
||||||
state = STATE_GETTING_HEADERS;
|
state = STATE_GETTING_HEADERS;
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
@@ -169,9 +169,10 @@ public:
|
|||||||
|
|
||||||
Request_ptr r = queuedRequests.front();
|
Request_ptr r = queuedRequests.front();
|
||||||
requestBodyBytesToSend = r->requestBodyLength();
|
requestBodyBytesToSend = r->requestBodyLength();
|
||||||
|
|
||||||
stringstream headerData;
|
stringstream headerData;
|
||||||
string path = r->path();
|
string path = r->path();
|
||||||
|
assert(!path.empty());
|
||||||
string query = r->query();
|
string query = r->query();
|
||||||
string bodyData;
|
string bodyData;
|
||||||
|
|
||||||
@@ -179,7 +180,7 @@ public:
|
|||||||
path = r->scheme() + "://" + r->host() + r->path();
|
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";
|
headerData << r->method() << " " << path << " HTTP/1.1\r\n";
|
||||||
bodyData = query.substr(1); // URL-encode, drop the leading '?'
|
bodyData = query.substr(1); // URL-encode, drop the leading '?'
|
||||||
headerData << "Content-Type:" << CONTENT_TYPE_URL_ENCODED << "\r\n";
|
headerData << "Content-Type:" << CONTENT_TYPE_URL_ENCODED << "\r\n";
|
||||||
@@ -429,7 +430,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
bool connectToHost()
|
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()) {
|
if (!open()) {
|
||||||
SG_LOG(SG_ALL, SG_WARN, "HTTP::Connection: connectToHost: open() failed");
|
SG_LOG(SG_ALL, SG_WARN, "HTTP::Connection: connectToHost: open() failed");
|
||||||
@@ -657,7 +658,6 @@ void Client::update(int waitTimeout)
|
|||||||
_connections.erase(del);
|
_connections.erase(del);
|
||||||
} else {
|
} else {
|
||||||
if (it->second->shouldStartNext()) {
|
if (it->second->shouldStartNext()) {
|
||||||
SG_LOG(SG_IO, SG_INFO, "should start next, hmm");
|
|
||||||
it->second->tryStartNextRequest();
|
it->second->tryStartNextRequest();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,8 +112,10 @@ string Request::path() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
int hostEnd = u.find('/', schemeEnd + 3);
|
int hostEnd = u.find('/', schemeEnd + 3);
|
||||||
if (hostEnd < 0) {
|
if (hostEnd < 0) {
|
||||||
return ""; // couldn't parse host
|
// 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);
|
int query = u.find('?', hostEnd + 1);
|
||||||
@@ -203,6 +205,7 @@ void Request::setFailure(int code, const std::string& reason)
|
|||||||
void Request::failed()
|
void Request::failed()
|
||||||
{
|
{
|
||||||
// no-op in base class
|
// no-op in base class
|
||||||
|
SG_LOG(SG_IO, SG_INFO, "request failed:" << url());
|
||||||
}
|
}
|
||||||
|
|
||||||
Request::HTTPVersion Request::decodeVersion(const string& v)
|
Request::HTTPVersion Request::decodeVersion(const string& v)
|
||||||
|
|||||||
Reference in New Issue
Block a user