Switch HTTP Server
This commit is contained in:
85
lib/PsychicHttp/src/ChunkPrinter.cpp
Normal file
85
lib/PsychicHttp/src/ChunkPrinter.cpp
Normal file
@@ -0,0 +1,85 @@
|
||||
|
||||
#include "ChunkPrinter.h"
|
||||
|
||||
ChunkPrinter::ChunkPrinter(PsychicResponse *response, uint8_t *buffer, size_t len) :
|
||||
_response(response),
|
||||
_buffer(buffer),
|
||||
_length(len),
|
||||
_pos(0)
|
||||
{}
|
||||
|
||||
ChunkPrinter::~ChunkPrinter()
|
||||
{
|
||||
flush();
|
||||
}
|
||||
|
||||
size_t ChunkPrinter::write(uint8_t c)
|
||||
{
|
||||
esp_err_t err;
|
||||
|
||||
//if we're full, send a chunk
|
||||
if (_pos == _length)
|
||||
{
|
||||
_pos = 0;
|
||||
err = _response->sendChunk(_buffer, _length);
|
||||
|
||||
if (err != ESP_OK)
|
||||
return 0;
|
||||
}
|
||||
|
||||
_buffer[_pos] = c;
|
||||
_pos++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
size_t ChunkPrinter::write(const uint8_t *buffer, size_t size)
|
||||
{
|
||||
size_t written = 0;
|
||||
|
||||
while (written < size)
|
||||
{
|
||||
size_t space = _length - _pos;
|
||||
size_t blockSize = std::min(space, size - written);
|
||||
|
||||
memcpy(_buffer + _pos, buffer + written, blockSize);
|
||||
_pos += blockSize;
|
||||
|
||||
if (_pos == _length)
|
||||
{
|
||||
_pos = 0;
|
||||
|
||||
if (_response->sendChunk(_buffer, _length) != ESP_OK)
|
||||
return written;
|
||||
}
|
||||
written += blockSize; //Update if sent correctly.
|
||||
}
|
||||
return written;
|
||||
}
|
||||
|
||||
void ChunkPrinter::flush()
|
||||
{
|
||||
if (_pos)
|
||||
{
|
||||
_response->sendChunk(_buffer, _pos);
|
||||
_pos = 0;
|
||||
}
|
||||
}
|
||||
|
||||
size_t ChunkPrinter::copyFrom(Stream &stream)
|
||||
{
|
||||
size_t count = 0;
|
||||
|
||||
while (stream.available()){
|
||||
|
||||
if (_pos == _length)
|
||||
{
|
||||
_response->sendChunk(_buffer, _length);
|
||||
_pos = 0;
|
||||
}
|
||||
|
||||
size_t readBytes = stream.readBytes(_buffer + _pos, _length - _pos);
|
||||
_pos += readBytes;
|
||||
count += readBytes;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
Reference in New Issue
Block a user