aboutsummaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
Diffstat (limited to 'backends')
-rw-r--r--backends/networking/sdl_net/localwebserver.cpp3
-rw-r--r--backends/networking/sdl_net/reader.cpp74
-rw-r--r--backends/networking/sdl_net/reader.h20
3 files changed, 78 insertions, 19 deletions
diff --git a/backends/networking/sdl_net/localwebserver.cpp b/backends/networking/sdl_net/localwebserver.cpp
index cac7dab8ac..d8f12b8220 100644
--- a/backends/networking/sdl_net/localwebserver.cpp
+++ b/backends/networking/sdl_net/localwebserver.cpp
@@ -50,7 +50,8 @@ LocalWebserver::LocalWebserver(): _set(nullptr), _serverSocket(nullptr), _timerS
_defaultHandler = _resourceHandler.getHandler();
Reader reader;
- reader.readResponse();
+ reader.setBytesLeft(128);
+ while (!reader.readResponse()) reader.setBytesLeft(20);
}
LocalWebserver::~LocalWebserver() {
diff --git a/backends/networking/sdl_net/reader.cpp b/backends/networking/sdl_net/reader.cpp
index edfaf81874..b6bf9e52ba 100644
--- a/backends/networking/sdl_net/reader.cpp
+++ b/backends/networking/sdl_net/reader.cpp
@@ -28,6 +28,9 @@
namespace Networking {
Reader::Reader() {
+ _state = RS_NONE;
+ _bytesLeft = 0;
+
_contentLength = 0;
_availableBytes = 0;
@@ -35,6 +38,9 @@ Reader::Reader() {
_windowUsed = 0;
_windowSize = 0;
+ _headers = "";
+ _buffer = "";
+
_content =
"POST /upload HTTP/1.1\r\n" \
"Host: 127.0.0.1:12345\r\n" \
@@ -61,10 +67,20 @@ Reader::Reader() {
Reader::~Reader() {}
-void Reader::readResponse() {
+bool Reader::readResponse() {
+ if (_state == RS_NONE) _state = RS_READING_HEADERS;
+
while (true) {
- readHeaders(); //til "\r\n\r\n"
- readContent(); //til "--" + _boundary
+ if (!bytesLeft()) return false;
+
+ if (_state == RS_READING_HEADERS)
+ if (!readHeaders())
+ return false;
+
+ if (_state == RS_READING_CONTENT)
+ if (!readContent())
+ return false;
+
if (_availableBytes >= 2) {
Common::String bts;
bts += readOne();
@@ -79,15 +95,25 @@ void Reader::readResponse() {
}
if (_availableBytes > 0) debug("STRANGE END: %llu bytes left", _availableBytes);
else debug("END");
+
+ return true;
}
-void Reader::readHeaders() {
+bool Reader::readHeaders() {
Common::String boundary = "\r\n\r\n";
- makeWindow(boundary.size());
+ if (_window == nullptr) {
+ makeWindow(boundary.size());
+ _headers = "";
+ }
- Common::String headers = "";
- while (readOneByteInString(headers, boundary));
- handleHeaders(headers);
+ while (readOneByteInString(_headers, boundary)) {
+ if (!bytesLeft()) return false;
+ }
+ handleHeaders(_headers);
+
+ freeWindow();
+ _state = RS_READING_CONTENT;
+ return true;
}
namespace {
@@ -136,9 +162,12 @@ void Reader::handleHeaders(Common::String headers) {
}
}
-void Reader::readContent() {
+bool Reader::readContent() {
Common::String boundary = "--" + _boundary;
- makeWindow(boundary.size());
+ if (_window == nullptr) {
+ makeWindow(boundary.size());
+ _buffer = "";
+ }
/*
if (_fieldIsFile) {
@@ -150,10 +179,15 @@ void Reader::readContent() {
handleFileContent(tempFileName);
} else {
*/
- Common::String buffer = "";
- while (readOneByteInString(buffer, boundary)) ;
- handleValueContent(buffer);
+ while (readOneByteInString(_buffer, boundary)) {
+ if (!bytesLeft()) return false;
+ }
+ handleValueContent(_buffer);
//}
+
+ freeWindow();
+ _state = RS_READING_HEADERS;
+ return true;
}
void Reader::handleFileContent(Common::String filename) {
@@ -166,14 +200,19 @@ void Reader::handleValueContent(Common::String value) {
}
void Reader::makeWindow(uint32 size) {
- delete[] _window;
- _window = nullptr;
+ freeWindow();
_window = new byte[size];
_windowUsed = 0;
_windowSize = size;
}
+void Reader::freeWindow() {
+ delete[] _window;
+ _window = nullptr;
+ _windowUsed = _windowSize = 0;
+}
+
/*
bool Reader::readOneByteInStream(stream) {
b = read(1);
@@ -214,7 +253,12 @@ byte Reader::readOne() {
byte b = _content[0];
_content.deleteChar(0);
--_availableBytes;
+ --_bytesLeft;
return b;
}
+uint32 Reader::bytesLeft() { return _bytesLeft; }
+
+void Reader::setBytesLeft(uint32 b) { _bytesLeft = b; }
+
} // End of namespace Networking
diff --git a/backends/networking/sdl_net/reader.h b/backends/networking/sdl_net/reader.h
index d4f9e11f0b..b91973ea22 100644
--- a/backends/networking/sdl_net/reader.h
+++ b/backends/networking/sdl_net/reader.h
@@ -30,15 +30,26 @@
namespace Networking {
+enum ReaderState {
+ RS_NONE,
+ RS_READING_HEADERS,
+ RS_READING_CONTENT
+};
+
class Reader {
///Common::String _headers;
///Common::String _method, _path, _query, _anchor;
+ ReaderState _state;
Common::String _content;
+ uint32 _bytesLeft;
Common::String _boundary;
uint32 _contentLength;
uint32 _availableBytes;
+ Common::String _headers;
+ Common::String _buffer;
+
Common::String _currentFieldName;
Common::HashMap<Common::String, Common::String> _fields;
Common::HashMap<Common::String, Common::String> _attachedFiles;
@@ -46,23 +57,26 @@ class Reader {
byte *_window;
uint32 _windowUsed, _windowSize;
- void readHeaders();
- void readContent();
+ bool readHeaders(); //true when ended reading
+ bool readContent(); //true when ended reading
void handleHeaders(Common::String headers);
void handleFileContent(Common::String filename);
void handleValueContent(Common::String value);
void makeWindow(uint32 size);
+ void freeWindow();
///bool Reader::readOneByteInStream(stream);
bool Reader::readOneByteInString(Common::String &buffer, const Common::String &boundary);
byte readOne();
+ uint32 bytesLeft();
public:
Reader();
~Reader();
- void readResponse();
+ bool readResponse(); //true when ended reading
+ void setBytesLeft(uint32 b);
};
} // End of namespace Networking