diff options
-rw-r--r-- | fastlib/src/vespa/fastlib/io/bufferedinputstream.cpp | 177 | ||||
-rw-r--r-- | fastlib/src/vespa/fastlib/io/bufferedinputstream.h | 50 | ||||
-rw-r--r-- | fastlib/src/vespa/fastlib/net/httpheaderparser.cpp | 86 | ||||
-rw-r--r-- | fastlib/src/vespa/fastlib/net/httpheaderparser.h | 49 |
4 files changed, 103 insertions, 259 deletions
diff --git a/fastlib/src/vespa/fastlib/io/bufferedinputstream.cpp b/fastlib/src/vespa/fastlib/io/bufferedinputstream.cpp index 9b761d2e272..7b1da7b3293 100644 --- a/fastlib/src/vespa/fastlib/io/bufferedinputstream.cpp +++ b/fastlib/src/vespa/fastlib/io/bufferedinputstream.cpp @@ -1,24 +1,8 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -//************************************************************************ -/** - * Implmentation of Fast_BufferedInputStream - * - * @author Markus Bjartveit Kr�ger - * @version $Id$ - */ - /* - * Creation date : 2001-10-29 - * Copyright (c) : 1997-2002 Fast Search & Transfer ASA - * ALL RIGHTS RESERVED - *************************************************************************/ #include <vespa/fastos/fastos.h> #include "bufferedinputstream.h" - - - -Fast_BufferedInputStream::Fast_BufferedInputStream(Fast_InputStream &in, - size_t bufferSize) +Fast_BufferedInputStream::Fast_BufferedInputStream(Fast_InputStream &in, size_t bufferSize) : Fast_FilterInputStream(in), _buffer(new char[bufferSize]), _bufferSize((_buffer != NULL) ? bufferSize : 0), @@ -28,89 +12,70 @@ Fast_BufferedInputStream::Fast_BufferedInputStream(Fast_InputStream &in, { } - - -Fast_BufferedInputStream::~Fast_BufferedInputStream(void) +Fast_BufferedInputStream::~Fast_BufferedInputStream() { delete [] _buffer; -}; - - +} -ssize_t Fast_BufferedInputStream::Available(void) +ssize_t +Fast_BufferedInputStream::Available() { return _in->Available() + _bufferUsed - _bufferRead; } - - -bool Fast_BufferedInputStream::Close(void) +bool +Fast_BufferedInputStream::Close() { return _in->Close(); } - - -ssize_t Fast_BufferedInputStream::Skip(size_t skipNBytes) +ssize_t +Fast_BufferedInputStream::Skip(size_t skipNBytes) { ssize_t numBytesSkipped = 0; - if (_nextWillFail) - { + if (_nextWillFail) { _nextWillFail = false; return -1; } - if (skipNBytes > _bufferUsed - _bufferRead) - { + if (skipNBytes > _bufferUsed - _bufferRead) { // First, skip all bytes in buffer numBytesSkipped = _bufferUsed - _bufferRead; _bufferUsed = _bufferRead = 0; // Skip rest of bytes in slave stream ssize_t slaveSkipped = _in->Skip(skipNBytes - numBytesSkipped); - if (slaveSkipped < 0) - { - if (numBytesSkipped > 0) - { + if (slaveSkipped < 0) { + if (numBytesSkipped > 0) { _nextWillFail = true; - } - else - { + } else { numBytesSkipped = slaveSkipped; } - } - else - { + } else { numBytesSkipped += slaveSkipped; } - } - else - { + } else { // Skip all skipNBytes in buffer _bufferRead += skipNBytes; - if (_bufferRead == _bufferUsed) - { + if (_bufferRead == _bufferUsed) { _bufferUsed = _bufferRead = 0; } numBytesSkipped = skipNBytes; } - return numBytesSkipped; } - - -ssize_t Fast_BufferedInputStream::Read(void *targetBuffer, size_t length) +ssize_t +Fast_BufferedInputStream::Read(void *targetBuffer, size_t length) { // This function will under no circumstance read more than once from // its slave stream, in order to prevent blocking on input. - if (_nextWillFail) - { + if (_nextWillFail) { _nextWillFail = false; return -1; } @@ -119,22 +84,17 @@ ssize_t Fast_BufferedInputStream::Read(void *targetBuffer, size_t length) char* to = static_cast<char*>(targetBuffer); size_t bufferRemain = _bufferUsed - _bufferRead; - if (length <= bufferRemain) - { + if (length <= bufferRemain) { memcpy(to, &_buffer[_bufferRead], length); numBytesRead += length; _bufferRead += length; - if (_bufferRead == _bufferUsed) - { + if (_bufferRead == _bufferUsed) { _bufferRead = _bufferUsed = 0; } - } - else - { + } else { // Use the data currently in the buffer, then read from slave stream. - if (bufferRemain > 0) - { + if (bufferRemain > 0) { memcpy(to, &_buffer[_bufferRead], bufferRemain); numBytesRead += bufferRemain; length -= bufferRemain; @@ -146,54 +106,37 @@ ssize_t Fast_BufferedInputStream::Read(void *targetBuffer, size_t length) // If remaining data to be read can fit in the buffer, put it // there, otherwise read directly to receiver and empty the buffer. - if (length < _bufferSize) - { + if (length < _bufferSize) { slaveRead = Fast_FilterInputStream::Read(_buffer, _bufferSize); - } - else - { + } else { slaveRead = Fast_FilterInputStream::Read(to, length); } - if (slaveRead > 0) - { - if (length < _bufferSize) - { + if (slaveRead > 0) { + if (length < _bufferSize) { // We read to buffer, so copy from buffer to receiver. - if (length < static_cast<size_t>(slaveRead)) - { + if (length < static_cast<size_t>(slaveRead)) { memcpy(to, _buffer, length); numBytesRead += length; _bufferUsed = slaveRead; _bufferRead = length; - } - else - { + } else { memcpy(to, _buffer, slaveRead); numBytesRead += slaveRead; } - } - else - { + } else { // We read directly to receiver, no need to copy. numBytesRead += slaveRead; } - } - else if (slaveRead == 0) - { + } else if (slaveRead == 0) { // Do nothing - } - else - { + } else { // slaveRead < 0, so an error occurred while reading from the // slave. If there was data in the buffer, report success and // fail on next operation instead. - if (numBytesRead > 0) - { + if (numBytesRead > 0) { _nextWillFail = true; - } - else - { + } else { numBytesRead = slaveRead; } } @@ -203,10 +146,8 @@ ssize_t Fast_BufferedInputStream::Read(void *targetBuffer, size_t length) return numBytesRead; } - -ssize_t Fast_BufferedInputStream::ReadBufferFullUntil(void *targetBuffer, - size_t maxlength, - char stopChar) +ssize_t +Fast_BufferedInputStream::ReadBufferFullUntil(void *targetBuffer, size_t maxlength, char stopChar) { if (maxlength > _bufferSize) @@ -215,8 +156,7 @@ ssize_t Fast_BufferedInputStream::ReadBufferFullUntil(void *targetBuffer, // This function will under no circumstance read more than once from // its slave stream, in order to prevent blocking on input. - if (_nextWillFail) - { + if (_nextWillFail) { _nextWillFail = false; return -1; } @@ -239,22 +179,17 @@ ssize_t Fast_BufferedInputStream::ReadBufferFullUntil(void *targetBuffer, } } - if (maxlength <= bufferRemain) - { + if (maxlength <= bufferRemain) { memcpy(to, &_buffer[_bufferRead], maxlength); numBytesRead += maxlength; _bufferRead += maxlength; - if (_bufferRead == _bufferUsed) - { + if (_bufferRead == _bufferUsed) { _bufferRead = _bufferUsed = 0; } - } - else - { + } else { // Use the data currently in the buffer, then read from slave stream. - if (bufferRemain > 0) - { + if (bufferRemain > 0) { memcpy(to, &_buffer[_bufferRead], bufferRemain); numBytesRead += bufferRemain; maxlength -= bufferRemain; @@ -265,8 +200,7 @@ ssize_t Fast_BufferedInputStream::ReadBufferFullUntil(void *targetBuffer, ssize_t slaveRead; slaveRead = Fast_FilterInputStream::Read(_buffer, _bufferSize); - if (slaveRead > 0) - { + if (slaveRead > 0) { for (offset = 0; offset < static_cast<uint32_t>(slaveRead); offset++) { if(_buffer[offset] == stopChar) { break; @@ -276,42 +210,31 @@ ssize_t Fast_BufferedInputStream::ReadBufferFullUntil(void *targetBuffer, if (offset >= maxlength) { // Discard data if character was not present numBytesRead = -1; - } - else { + } else { // Found character in buffer if (offset < static_cast<uint32_t>(slaveRead)) { maxlength = offset + 1; } // We read to buffer, so copy from buffer to receiver. - if (maxlength < static_cast<size_t>(slaveRead)) - { + if (maxlength < static_cast<size_t>(slaveRead)) { memcpy(to, _buffer, maxlength); numBytesRead += maxlength; _bufferUsed = slaveRead; _bufferRead = maxlength; - } - else - { + } else { memcpy(to, _buffer, slaveRead); numBytesRead += slaveRead; } } - } - else if (slaveRead == 0) - { + } else if (slaveRead == 0) { // Do nothing - } - else - { + } else { // slaveRead < 0, so an error occurred while reading from the // slave. If there was data in the buffer, report success and // fail on next operation instead. - if (numBytesRead > 0) - { + if (numBytesRead > 0) { _nextWillFail = true; - } - else - { + } else { numBytesRead = slaveRead; } } diff --git a/fastlib/src/vespa/fastlib/io/bufferedinputstream.h b/fastlib/src/vespa/fastlib/io/bufferedinputstream.h index 183e3494215..b102bd98abc 100644 --- a/fastlib/src/vespa/fastlib/io/bufferedinputstream.h +++ b/fastlib/src/vespa/fastlib/io/bufferedinputstream.h @@ -1,61 +1,37 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -//************************************************************************ -/** - * Class definitions for Fast_BufferedInputStream - * - * @author Markus Bjartveit Kr�ger - * @version $Id$ - */ - /* - * Creation date : 2001-10-29 - * Copyright (c) : 1997-2002 Fast Search & Transfer ASA - * ALL RIGHTS RESERVED - *************************************************************************/ #pragma once #include <vespa/fastlib/io/filterinputstream.h> - - - - class Fast_BufferedInputStream : public Fast_FilterInputStream { - private: - - // Prevent use of: - Fast_BufferedInputStream(const Fast_BufferedInputStream &); - Fast_BufferedInputStream & operator=(const Fast_BufferedInputStream &); - - protected: - // Buffer attributes - char *_buffer; - size_t _bufferSize; - size_t _bufferUsed; // Amount of buffer currently holding data - size_t _bufferRead; // How far buffer has been read - bool _nextWillFail; + char *_buffer; + const size_t _bufferSize; + size_t _bufferUsed; // Amount of buffer currently holding data + size_t _bufferRead; // How far buffer has been read + bool _nextWillFail; public: + Fast_BufferedInputStream(const Fast_BufferedInputStream &) = delete; + Fast_BufferedInputStream & operator = (const Fast_BufferedInputStream &) = delete; // Constructor Fast_BufferedInputStream(Fast_InputStream &in, size_t bufferSize = 1024); // Destructor - virtual ~Fast_BufferedInputStream(void); + virtual ~Fast_BufferedInputStream(); // Subclassed methods - virtual ssize_t Available(void); - virtual bool Close(void); - virtual ssize_t Skip(size_t skipNBytes); - virtual ssize_t Read(void *targetBuffer, size_t length); + ssize_t Available() override; + bool Close() override; + ssize_t Skip(size_t skipNBytes) override; + ssize_t Read(void *targetBuffer, size_t length) override; // Additional methods - ssize_t ReadBufferFullUntil(void *targetBuffer, - size_t maxlength, - char stopChar); + ssize_t ReadBufferFullUntil(void *targetBuffer, size_t maxlength, char stopChar); }; diff --git a/fastlib/src/vespa/fastlib/net/httpheaderparser.cpp b/fastlib/src/vespa/fastlib/net/httpheaderparser.cpp index 22174acfec9..360ac4fb0b5 100644 --- a/fastlib/src/vespa/fastlib/net/httpheaderparser.cpp +++ b/fastlib/src/vespa/fastlib/net/httpheaderparser.cpp @@ -3,50 +3,40 @@ #include <vespa/fastlib/io/bufferedinputstream.h> #include <vespa/fastlib/net/httpheaderparser.h> - - Fast_HTTPHeaderParser::Fast_HTTPHeaderParser(Fast_BufferedInputStream &in) : _pushBack(0), _isPushBacked(false), + _bufferSize(16384), + _lineBuffer(new char[_bufferSize]), _input(&in) { } - - Fast_HTTPHeaderParser::~Fast_HTTPHeaderParser(void) { + delete [] _lineBuffer; } - - -bool Fast_HTTPHeaderParser::ReadRequestLine(const char *&method, - const char *&url, - int &versionMajor, - int &versionMinor) +bool +Fast_HTTPHeaderParser::ReadRequestLine(const char *&method, const char *&url, int &versionMajor, int &versionMinor) { // Read a single line from input. Repeat if line is blank, to cope // with buggy HTTP/1.1 clients that print extra empty lines at the // end of requests. - do - { + do { int idx = 0; - size_t readLen = - _input->ReadBufferFullUntil(_lineBuffer, - static_cast<size_t> - (HTTPHEADERPARSER_LINE_BUFFER_SIZE), - '\n'); + size_t readLen = _input->ReadBufferFullUntil(_lineBuffer, _bufferSize, '\n'); if (readLen <= 0) { return false; } idx = readLen-1; - if (idx == 0 || _lineBuffer[idx] != '\n') + if (idx == 0 || _lineBuffer[idx] != '\n') { return false; + } _lineBuffer[idx--] = '\0'; - if (_lineBuffer[idx] == '\r') - { + if (_lineBuffer[idx] == '\r') { _lineBuffer[idx] = '\0'; } } while (_lineBuffer[0] == '\0'); @@ -58,20 +48,17 @@ bool Fast_HTTPHeaderParser::ReadRequestLine(const char *&method, method = p; p = strchr(p, ' '); - if (p != NULL) - { + if (p != NULL) { *p++ = '\0'; url = p; p = strchr(p, ' '); - if (p != NULL) - { + if (p != NULL) { *p++ = '\0'; version = p; } } - if (sscanf(version, "HTTP/%d.%d", &versionMajor, &versionMinor) != 2) - { + if (sscanf(version, "HTTP/%d.%d", &versionMajor, &versionMinor) != 2) { versionMajor = versionMinor = -1; return false; } @@ -79,37 +66,30 @@ bool Fast_HTTPHeaderParser::ReadRequestLine(const char *&method, return true; } -bool Fast_HTTPHeaderParser::ReadHeader(const char *&name, const char *&value) +bool +Fast_HTTPHeaderParser::ReadHeader(const char *&name, const char *&value) { - int idx = 0; + size_t idx = 0; name = NULL; value = NULL; - if (_isPushBacked) - { + if (_isPushBacked) { idx = 0; _lineBuffer[idx] = _pushBack; _isPushBacked = false; idx++; } - while (idx<HTTPHEADERPARSER_LINE_BUFFER_SIZE-1) - { - - size_t readLen = - _input->ReadBufferFullUntil(&_lineBuffer[idx], - static_cast<size_t> - (HTTPHEADERPARSER_LINE_BUFFER_SIZE), - '\n'); + while (idx < (_bufferSize-1)) { + size_t readLen = _input->ReadBufferFullUntil(&_lineBuffer[idx], _bufferSize - idx - 1, '\n'); if (readLen <= 0) { return false; } idx += readLen - 1; // Empty line == end of headers. // handle case with \r\n as \n - if (idx == 0 || (_lineBuffer[0] == '\r' && idx == 1)) - { + if (idx == 0 || (_lineBuffer[0] == '\r' && idx == 1)) { idx = 0; break; } @@ -123,52 +103,44 @@ bool Fast_HTTPHeaderParser::ReadHeader(const char *&name, const char *&value) } // Check if header continues on next line. - if (_input->Read(&_pushBack, 1) != 1) + if (_input->Read(&_pushBack, 1) != 1) { break; - if (_pushBack == ' ' || _pushBack == '\t') - { + } + if (_pushBack == ' ' || _pushBack == '\t') { // Header does continue on next line. // Replace newline with horizontal whitespace. _lineBuffer[idx] = _pushBack; idx++; - } - else - { + } else { _isPushBacked = true; // break out of while loop break; } - } - if (idx != 0) - { + if (idx != 0) { _lineBuffer[idx] = '\0'; char *p = _lineBuffer; name = p; // Find end of header name. - while (*p != ':' && *p != '\0') - { + while (*p != ':' && *p != '\0') { p++; } // If end of header name is not end of header, parse header value. - if (*p != '\0') - { + if (*p != '\0') { // Terminate header name. *p++ = '\0'; // Skip leading whitespace before header value. - while (*p == ' ' || *p == '\t') - { + while (*p == ' ' || *p == '\t') { p++; } value = p; // Strip trailing whitespace. p += strlen(p); - while (p > value && (*(p-1) == ' ' || *(p-1) == '\t')) - { + while (p > value && (*(p-1) == ' ' || *(p-1) == '\t')) { p--; } *p = '\0'; diff --git a/fastlib/src/vespa/fastlib/net/httpheaderparser.h b/fastlib/src/vespa/fastlib/net/httpheaderparser.h index 5bb41e787a7..643d8252d52 100644 --- a/fastlib/src/vespa/fastlib/net/httpheaderparser.h +++ b/fastlib/src/vespa/fastlib/net/httpheaderparser.h @@ -1,53 +1,26 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -/** -******************************************************************************* -* -* @author Markus Bjartveit Kr�ger -* @date Creation date: 2000-11-22 -* @version $Id$ -* -* @file -* -* HTTP header parser. -* -* Copyright (c) : 2001 Fast Search & Transfer ASA -* ALL RIGHTS RESERVED -* -******************************************************************************/ - #pragma once - +#include <vector> class Fast_BufferedInputStream; - -#define HTTPHEADERPARSER_LINE_BUFFER_SIZE 4096 - - class Fast_HTTPHeaderParser { - private: - // Prevent use of: - Fast_HTTPHeaderParser(const Fast_HTTPHeaderParser &); - Fast_HTTPHeaderParser & operator=(const Fast_HTTPHeaderParser &); - protected: - char _pushBack; - bool _isPushBacked; - char _lineBuffer[HTTPHEADERPARSER_LINE_BUFFER_SIZE]; - Fast_BufferedInputStream *_input; - public: + Fast_HTTPHeaderParser(const Fast_HTTPHeaderParser &) = delete; + Fast_HTTPHeaderParser & operator = (const Fast_HTTPHeaderParser &) = delete; Fast_HTTPHeaderParser(Fast_BufferedInputStream &in); - virtual ~Fast_HTTPHeaderParser(void); - + ~Fast_HTTPHeaderParser(); // Methods - bool ReadRequestLine(const char *&method, const char *&url, - int &versionMajor, int &versionMinor); + bool ReadRequestLine(const char *&method, const char *&url, int &versionMajor, int &versionMinor); bool ReadHeader(const char *&name, const char *&value); + private: + char _pushBack; + bool _isPushBacked; + const size_t _bufferSize; + char *_lineBuffer; + Fast_BufferedInputStream *_input; }; - - - |