mirror of https://gitee.com/bigwinds/arangodb
Fixed header parsing in SimpleHttpClient for wrongly advanced cursor position in readBuffer
This commit is contained in:
parent
2db7cfb299
commit
61444b6154
|
@ -635,6 +635,13 @@ void SimpleHttpClient::setRequest(
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
void SimpleHttpClient::processHeader() {
|
void SimpleHttpClient::processHeader() {
|
||||||
|
if (_readBufferOffset > _readBuffer.length()) {
|
||||||
|
#warning Forgetmenot
|
||||||
|
|
||||||
|
LOG_TOPIC(WARN, Logger::FIXME)
|
||||||
|
<< _readBufferOffset << " " << _readBuffer.length()
|
||||||
|
<< " " << std::string(_readBuffer.c_str(), _readBuffer.length());
|
||||||
|
}
|
||||||
TRI_ASSERT(_readBufferOffset <= _readBuffer.length());
|
TRI_ASSERT(_readBufferOffset <= _readBuffer.length());
|
||||||
size_t remain = _readBuffer.length() - _readBufferOffset;
|
size_t remain = _readBuffer.length() - _readBufferOffset;
|
||||||
char const* ptr = _readBuffer.c_str() + _readBufferOffset;
|
char const* ptr = _readBuffer.c_str() + _readBufferOffset;
|
||||||
|
@ -658,12 +665,16 @@ void SimpleHttpClient::processHeader() {
|
||||||
if (*ptr == '\r' || *ptr == '\n' || *ptr == '\0') {
|
if (*ptr == '\r' || *ptr == '\n' || *ptr == '\0') {
|
||||||
size_t len = pos - ptr;
|
size_t len = pos - ptr;
|
||||||
_readBufferOffset += len + 1;
|
_readBufferOffset += len + 1;
|
||||||
|
TRI_ASSERT(_readBufferOffset <= _readBuffer.length());
|
||||||
|
|
||||||
ptr += len + 1;
|
ptr += len + 1;
|
||||||
remain -= len + 1;
|
remain -= len + 1;
|
||||||
|
|
||||||
if (*pos == '\r') {
|
if (*pos == '\r') {
|
||||||
// adjust offset if line ended with \r\n
|
// adjust offset if line ended with \r\n
|
||||||
++_readBufferOffset;
|
++_readBufferOffset;
|
||||||
|
TRI_ASSERT(_readBufferOffset <= _readBuffer.length());
|
||||||
|
|
||||||
ptr++;
|
ptr++;
|
||||||
remain--;
|
remain--;
|
||||||
}
|
}
|
||||||
|
@ -729,6 +740,8 @@ void SimpleHttpClient::processHeader() {
|
||||||
|
|
||||||
ptr += len + 1;
|
ptr += len + 1;
|
||||||
_readBufferOffset += len + 1;
|
_readBufferOffset += len + 1;
|
||||||
|
TRI_ASSERT(_readBufferOffset <= _readBuffer.length());
|
||||||
|
|
||||||
remain -= (len + 1);
|
remain -= (len + 1);
|
||||||
|
|
||||||
TRI_ASSERT(_readBufferOffset <= _readBuffer.length());
|
TRI_ASSERT(_readBufferOffset <= _readBuffer.length());
|
||||||
|
@ -738,6 +751,8 @@ void SimpleHttpClient::processHeader() {
|
||||||
|
|
||||||
if (pos == nullptr) {
|
if (pos == nullptr) {
|
||||||
_readBufferOffset++;
|
_readBufferOffset++;
|
||||||
|
TRI_ASSERT(_readBufferOffset <= _readBuffer.length());
|
||||||
|
|
||||||
ptr++;
|
ptr++;
|
||||||
remain--;
|
remain--;
|
||||||
}
|
}
|
||||||
|
@ -783,6 +798,8 @@ void SimpleHttpClient::processBody() {
|
||||||
}
|
}
|
||||||
|
|
||||||
_readBufferOffset += _result->getContentLength();
|
_readBufferOffset += _result->getContentLength();
|
||||||
|
TRI_ASSERT(_readBufferOffset <= _readBuffer.length());
|
||||||
|
|
||||||
_result->setResultType(SimpleHttpResult::COMPLETE);
|
_result->setResultType(SimpleHttpResult::COMPLETE);
|
||||||
_state = FINISHED;
|
_state = FINISHED;
|
||||||
|
|
||||||
|
@ -815,6 +832,8 @@ void SimpleHttpClient::processChunkedHeader() {
|
||||||
// adjust offset if line ended with \r\n
|
// adjust offset if line ended with \r\n
|
||||||
if (*pos == '\r') {
|
if (*pos == '\r') {
|
||||||
++_readBufferOffset;
|
++_readBufferOffset;
|
||||||
|
TRI_ASSERT(_readBufferOffset <= _readBuffer.length());
|
||||||
|
|
||||||
++len;
|
++len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -894,6 +913,7 @@ void SimpleHttpClient::processChunkedBody() {
|
||||||
}
|
}
|
||||||
|
|
||||||
_readBufferOffset += (size_t)_nextChunkedSize + 2;
|
_readBufferOffset += (size_t)_nextChunkedSize + 2;
|
||||||
|
|
||||||
_state = IN_READ_CHUNKED_HEADER;
|
_state = IN_READ_CHUNKED_HEADER;
|
||||||
processChunkedHeader();
|
processChunkedHeader();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue