summaryrefslogtreecommitdiffstats
path: root/fastlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2016-09-27 07:33:15 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2016-09-27 07:33:15 +0000
commitea9879e7d84c28bb670ef29bf3bdffa70e5109f2 (patch)
tree45c0d9e6c147319ad29a978f42a590367613ba26 /fastlib
parent9bf07559625d9c600f38956bf0316307ebe62dbb (diff)
- Bracing and style
- Buffer on heap, not stack. - Do not read past buffer.
Diffstat (limited to 'fastlib')
-rw-r--r--fastlib/src/vespa/fastlib/io/bufferedinputstream.cpp177
-rw-r--r--fastlib/src/vespa/fastlib/io/bufferedinputstream.h50
-rw-r--r--fastlib/src/vespa/fastlib/net/httpheaderparser.cpp86
-rw-r--r--fastlib/src/vespa/fastlib/net/httpheaderparser.h49
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;
};
-
-
-