HttpRequest: more small fixes and cleanups

* Remove unneeded field fOutputHeaders and convert it to a local for the
only method that uses it,
* Don't return EOVERFLOW when flushing data from ZLib (the ZLib
decompressor returns this, but zlib docs states that this is NOT an
error condition).
* Replace unneeded temporary BNetBuffer of fixed size with BStackOrHeapArray.
This commit is contained in:
Adrien Destugues
2014-07-28 15:02:17 +02:00
parent 4359643ed4
commit a1cce97050
2 changed files with 29 additions and 23 deletions
-1
View File
@@ -98,7 +98,6 @@ private:
// Request status // Request status
BHttpHeaders fOutputHeaders;
BHttpResult fResult; BHttpResult fResult;
// Request state/events // Request state/events
+29 -22
View File
@@ -317,7 +317,6 @@ BHttpRequest::_ProtocolLoop()
newRequest = false; newRequest = false;
// Result reset // Result reset
fOutputHeaders.Clear();
fHeaders.Clear(); fHeaders.Clear();
_ResultHeaders().Clear(); _ResultHeaders().Clear();
@@ -487,6 +486,8 @@ BHttpRequest::_MakeRequest()
_SendPostData(); _SendPostData();
fRequestStatus = kRequestInitialState; fRequestStatus = kRequestInitialState;
// Receive loop // Receive loop
bool receiveEnd = false; bool receiveEnd = false;
bool parseEnd = false; bool parseEnd = false;
@@ -507,8 +508,8 @@ BHttpRequest::_MakeRequest()
while (!fQuit && !(receiveEnd && parseEnd)) { while (!fQuit && !(receiveEnd && parseEnd)) {
if (!receiveEnd) { if (!receiveEnd) {
fSocket->WaitForReadable(); fSocket->WaitForReadable();
BNetBuffer chunk(kHttpBufferSize); BStackOrHeapArray<char, 4096> chunk(kHttpBufferSize);
bytesRead = fSocket->Read(chunk.Data(), kHttpBufferSize); bytesRead = fSocket->Read(chunk, kHttpBufferSize);
if (bytesRead < 0) { if (bytesRead < 0) {
readError = bytesRead; readError = bytesRead;
@@ -516,7 +517,7 @@ BHttpRequest::_MakeRequest()
} else if (bytesRead == 0) } else if (bytesRead == 0)
receiveEnd = true; receiveEnd = true;
fInputBuffer.AppendData(chunk.Data(), bytesRead); fInputBuffer.AppendData(chunk, bytesRead);
} else } else
bytesRead = 0; bytesRead = 0;
@@ -677,7 +678,11 @@ BHttpRequest::_MakeRequest()
if (decompress && receiveEnd) { if (decompress && receiveEnd) {
readError = decompressingStream->Flush(); readError = decompressingStream->Flush();
if (readError != B_OK && readError != B_BUFFER_OVERFLOW)
if (readError == B_BUFFER_OVERFLOW)
readError = B_OK;
if (readError != B_OK)
break; break;
ssize_t size = decompressorStorage.Size(); ssize_t size = decompressorStorage.Size();
@@ -813,31 +818,33 @@ BHttpRequest::_SendRequest()
void void
BHttpRequest::_SendHeaders() BHttpRequest::_SendHeaders()
{ {
BHttpHeaders outputHeaders;
// HTTP 1.1 additional headers // HTTP 1.1 additional headers
if (fHttpVersion == B_HTTP_11) { if (fHttpVersion == B_HTTP_11) {
BString host = Url().Host(); BString host = Url().Host();
if (Url().HasPort() && !_IsDefaultPort()) if (Url().HasPort() && !_IsDefaultPort())
host << ':' << Url().Port(); host << ':' << Url().Port();
fOutputHeaders.AddHeader("Host", host); outputHeaders.AddHeader("Host", host);
fOutputHeaders.AddHeader("Accept", "*/*"); outputHeaders.AddHeader("Accept", "*/*");
fOutputHeaders.AddHeader("Accept-Encoding", "gzip,deflate"); outputHeaders.AddHeader("Accept-Encoding", "gzip,deflate");
// Allow the remote server to send dynamic content by chunks // Allow the remote server to send dynamic content by chunks
// rather than waiting for the full content to be generated and // rather than waiting for the full content to be generated and
// sending us data. // sending us data.
fOutputHeaders.AddHeader("Connection", "close"); outputHeaders.AddHeader("Connection", "close");
// Let the remote server close the connection after response since // Let the remote server close the connection after response since
// we don't handle multiple request on a single connection // we don't handle multiple request on a single connection
} }
// Classic HTTP headers // Classic HTTP headers
if (fOptUserAgent.CountChars() > 0) if (fOptUserAgent.CountChars() > 0)
fOutputHeaders.AddHeader("User-Agent", fOptUserAgent.String()); outputHeaders.AddHeader("User-Agent", fOptUserAgent.String());
if (fOptReferer.CountChars() > 0) if (fOptReferer.CountChars() > 0)
fOutputHeaders.AddHeader("Referer", fOptReferer.String()); outputHeaders.AddHeader("Referer", fOptReferer.String());
// Authentication // Authentication
if (fContext != NULL) { if (fContext != NULL) {
@@ -849,7 +856,7 @@ BHttpRequest::_SendHeaders()
} }
BString request(fRequestMethod); BString request(fRequestMethod);
fOutputHeaders.AddHeader("Authorization", outputHeaders.AddHeader("Authorization",
authentication.Authorization(fUrl, request)); authentication.Authorization(fUrl, request));
} }
} }
@@ -869,16 +876,16 @@ BHttpRequest::_SendHeaders()
break; break;
} }
fOutputHeaders.AddHeader("Content-Type", contentType); outputHeaders.AddHeader("Content-Type", contentType);
fOutputHeaders.AddHeader("Content-Length", outputHeaders.AddHeader("Content-Length",
fOptPostFields->ContentLength()); fOptPostFields->ContentLength());
} else if (fOptInputData != NULL } else if (fOptInputData != NULL
&& (fRequestMethod == B_HTTP_POST && (fRequestMethod == B_HTTP_POST
|| fRequestMethod == B_HTTP_PUT)) { || fRequestMethod == B_HTTP_PUT)) {
if (fOptInputDataSize >= 0) if (fOptInputDataSize >= 0)
fOutputHeaders.AddHeader("Content-Length", fOptInputDataSize); outputHeaders.AddHeader("Content-Length", fOptInputDataSize);
else else
fOutputHeaders.AddHeader("Transfer-Encoding", "chunked"); outputHeaders.AddHeader("Transfer-Encoding", "chunked");
} }
// Optional headers specified by the user // Optional headers specified by the user
@@ -886,14 +893,14 @@ BHttpRequest::_SendHeaders()
for (int32 headerIndex = 0; headerIndex < fOptHeaders->CountHeaders(); for (int32 headerIndex = 0; headerIndex < fOptHeaders->CountHeaders();
headerIndex++) { headerIndex++) {
BHttpHeader& optHeader = (*fOptHeaders)[headerIndex]; BHttpHeader& optHeader = (*fOptHeaders)[headerIndex];
int32 replaceIndex = fOutputHeaders.HasHeader(optHeader.Name()); int32 replaceIndex = outputHeaders.HasHeader(optHeader.Name());
// Add or replace the current option header to the // Add or replace the current option header to the
// output header list // output header list
if (replaceIndex == -1) if (replaceIndex == -1)
fOutputHeaders.AddHeader(optHeader.Name(), optHeader.Value()); outputHeaders.AddHeader(optHeader.Name(), optHeader.Value());
else else
fOutputHeaders[replaceIndex].SetValue(optHeader.Value()); outputHeaders[replaceIndex].SetValue(optHeader.Value());
} }
} }
@@ -913,16 +920,16 @@ BHttpRequest::_SendHeaders()
cookieString << "; "; cookieString << "; ";
} }
fOutputHeaders.AddHeader("Cookie", cookieString); outputHeaders.AddHeader("Cookie", cookieString);
} }
} }
// Write output headers to output stream // Write output headers to output stream
BString headerData; BString headerData;
for (int32 headerIndex = 0; headerIndex < fOutputHeaders.CountHeaders(); for (int32 headerIndex = 0; headerIndex < outputHeaders.CountHeaders();
headerIndex++) { headerIndex++) {
const char* header = fOutputHeaders.HeaderAt(headerIndex).Header(); const char* header = outputHeaders.HeaderAt(headerIndex).Header();
headerData << header; headerData << header;
headerData << "\r\n"; headerData << "\r\n";