summaryrefslogtreecommitdiff
path: root/indra/llmessage
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llmessage')
-rw-r--r--indra/llmessage/llurlrequest.cpp49
-rw-r--r--indra/llmessage/llurlrequest.h13
2 files changed, 22 insertions, 40 deletions
diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp
index d03c8dfd25..6ef97bea58 100644
--- a/indra/llmessage/llurlrequest.cpp
+++ b/indra/llmessage/llurlrequest.cpp
@@ -502,33 +502,25 @@ static size_t headerCallback(void* data, size_t size, size_t nmemb, void* user)
std::string header(header_line, header_len);
// Per HTTP spec the first header line must be the status line.
- if (!complete->haveHTTPStatus())
+ if (header.substr(0,5) == "HTTP/")
{
- if (header.substr(0,5) == "HTTP/")
+ std::string::iterator end = header.end();
+ std::string::iterator pos1 = std::find(header.begin(), end, ' ');
+ if (pos1 != end) ++pos1;
+ std::string::iterator pos2 = std::find(pos1, end, ' ');
+ if (pos2 != end) ++pos2;
+ std::string::iterator pos3 = std::find(pos2, end, '\r');
+
+ std::string version(header.begin(), pos1);
+ std::string status(pos1, pos2);
+ std::string reason(pos2, pos3);
+
+ S32 status_code = atoi(status.c_str());
+ if (status_code > 0)
{
- std::string::iterator end = header.end();
- std::string::iterator pos1 = std::find(header.begin(), end, ' ');
- if (pos1 != end) ++pos1;
- std::string::iterator pos2 = std::find(pos1, end, ' ');
- if (pos2 != end) ++pos2;
- std::string::iterator pos3 = std::find(pos2, end, '\r');
-
- std::string version(header.begin(), pos1);
- std::string status(pos1, pos2);
- std::string reason(pos2, pos3);
-
- int statusCode = atoi(status.c_str());
- if (statusCode >= 300 && statusCode < 400)
- {
- // This is a redirect, ignore it and all headers
- // until we find a normal status code.
- }
- else if (statusCode > 0)
- {
- complete->httpStatus((U32)statusCode, reason);
- }
+ complete->httpStatus((U32)status_code, reason);
+ return header_len;
}
- return header_len;
}
std::string::iterator sep = std::find(header.begin(),header.end(),':');
@@ -593,8 +585,7 @@ LLIOPipe::EStatus LLContextURLExtractor::process_impl(
* LLURLRequestComplete
*/
LLURLRequestComplete::LLURLRequestComplete() :
- mRequestStatus(LLIOPipe::STATUS_ERROR),
- mHaveHTTPStatus(false)
+ mRequestStatus(LLIOPipe::STATUS_ERROR)
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
}
@@ -611,12 +602,6 @@ void LLURLRequestComplete::header(const std::string& header, const std::string&
}
//virtual
-void LLURLRequestComplete::httpStatus(U32 status, const std::string& reason)
-{
- mHaveHTTPStatus = true;
-}
-
-//virtual
void LLURLRequestComplete::complete(const LLChannelDescriptors& channels,
const buffer_ptr_t& buffer)
{
diff --git a/indra/llmessage/llurlrequest.h b/indra/llmessage/llurlrequest.h
index 2a3b463ad3..d1facbff0f 100644
--- a/indra/llmessage/llurlrequest.h
+++ b/indra/llmessage/llurlrequest.h
@@ -287,11 +287,13 @@ class LLURLRequestComplete : public LLIOPipe
{
public:
+ // Called once for each header received, except status lines
virtual void header(const std::string& header, const std::string& value);
- ///< Called once for each header received, prior to httpStatus
- virtual void httpStatus(U32 status, const std::string& reason);
- ///< Always called on request completion, prior to complete
+ // May be called more than once, particularly for redirects and proxy madness.
+ // Ex. a 200 for a connection to https through a proxy, followed by the "real" status
+ // a 3xx for a redirect followed by a "real" status, or more redirects.
+ virtual void httpStatus(U32 status, const std::string& reason) { }
virtual void complete(
const LLChannelDescriptors& channels,
@@ -328,9 +330,6 @@ public:
LLURLRequestComplete();
virtual ~LLURLRequestComplete();
- // The first line of an http response must be the status line
- // true if we have already parsed this line.
- bool haveHTTPStatus() const { return mHaveHTTPStatus; }
protected:
/* @name LLIOPipe virtual implementations
*/
@@ -349,8 +348,6 @@ protected:
// value to note if we actually got the response. This value
// depends on correct useage from the LLURLRequest instance.
EStatus mRequestStatus;
-
- bool mHaveHTTPStatus;
};