PsychichHTTP v2-dev
This commit is contained in:
@@ -1,63 +1,62 @@
|
||||
#include "PsychicStreamResponse.h"
|
||||
#include "PsychicResponse.h"
|
||||
#include "PsychicRequest.h"
|
||||
#include "PsychicResponse.h"
|
||||
|
||||
PsychicStreamResponse::PsychicStreamResponse(PsychicRequest *request, const String& contentType)
|
||||
: PsychicResponse(request), _buffer(NULL) {
|
||||
PsychicStreamResponse::PsychicStreamResponse(PsychicResponse* response, const String& contentType)
|
||||
: PsychicResponseDelegate(response), _buffer(NULL)
|
||||
{
|
||||
|
||||
//setContentType(contentType.c_str());
|
||||
//addHeader("Content-Disposition", "inline");
|
||||
setContentType(contentType.c_str());
|
||||
addHeader("Content-Disposition", "inline");
|
||||
}
|
||||
|
||||
|
||||
PsychicStreamResponse::PsychicStreamResponse(PsychicRequest *request, const String& contentType, const String& name)
|
||||
: PsychicResponse(request), _buffer(NULL) {
|
||||
PsychicStreamResponse::PsychicStreamResponse(PsychicResponse* response, const String& contentType, const String& name)
|
||||
: PsychicResponseDelegate(response), _buffer(NULL)
|
||||
{
|
||||
|
||||
setContentType(contentType.c_str());
|
||||
|
||||
char buf[26+name.length()];
|
||||
snprintf(buf, sizeof (buf), "attachment; filename=\"%s\"", name.c_str());
|
||||
char buf[26 + name.length()];
|
||||
snprintf(buf, sizeof(buf), "attachment; filename=\"%s\"", name.c_str());
|
||||
addHeader("Content-Disposition", buf);
|
||||
}
|
||||
|
||||
|
||||
PsychicStreamResponse::~PsychicStreamResponse()
|
||||
{
|
||||
endSend();
|
||||
}
|
||||
|
||||
|
||||
esp_err_t PsychicStreamResponse::beginSend()
|
||||
{
|
||||
if(_buffer)
|
||||
if (_buffer)
|
||||
return ESP_OK;
|
||||
|
||||
//Buffer to hold ChunkPrinter and stream buffer. Using placement new will keep us at a single allocation.
|
||||
// Buffer to hold ChunkPrinter and stream buffer. Using placement new will keep us at a single allocation.
|
||||
_buffer = (uint8_t*)malloc(STREAM_CHUNK_SIZE + sizeof(ChunkPrinter));
|
||||
|
||||
if(!_buffer)
|
||||
|
||||
if (!_buffer)
|
||||
{
|
||||
/* Respond with 500 Internal Server Error */
|
||||
httpd_resp_send_err(_request->request(), HTTPD_500_INTERNAL_SERVER_ERROR, "Unable to allocate memory.");
|
||||
ESP_LOGE(PH_TAG, "Unable to allocate %" PRIu32 " bytes to send chunk", STREAM_CHUNK_SIZE + sizeof(ChunkPrinter));
|
||||
httpd_resp_send_err(request(), HTTPD_500_INTERNAL_SERVER_ERROR, "Unable to allocate memory.");
|
||||
return ESP_FAIL;
|
||||
}
|
||||
|
||||
_printer = new (_buffer) ChunkPrinter(this, _buffer + sizeof(ChunkPrinter), STREAM_CHUNK_SIZE);
|
||||
_printer = new (_buffer) ChunkPrinter(_response, _buffer + sizeof(ChunkPrinter), STREAM_CHUNK_SIZE);
|
||||
|
||||
sendHeaders();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
|
||||
esp_err_t PsychicStreamResponse::endSend()
|
||||
{
|
||||
esp_err_t err = ESP_OK;
|
||||
|
||||
if(!_buffer)
|
||||
|
||||
if (!_buffer)
|
||||
err = ESP_FAIL;
|
||||
else
|
||||
{
|
||||
_printer->~ChunkPrinter(); //flushed on destruct
|
||||
_printer->~ChunkPrinter(); // flushed on destruct
|
||||
err = finishChunking();
|
||||
free(_buffer);
|
||||
_buffer = NULL;
|
||||
@@ -65,29 +64,25 @@ esp_err_t PsychicStreamResponse::endSend()
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
void PsychicStreamResponse::flush()
|
||||
{
|
||||
if(_buffer)
|
||||
if (_buffer)
|
||||
_printer->flush();
|
||||
}
|
||||
|
||||
|
||||
size_t PsychicStreamResponse::write(uint8_t data)
|
||||
{
|
||||
return _buffer ? _printer->write(data) : 0;
|
||||
}
|
||||
|
||||
|
||||
size_t PsychicStreamResponse::write(const uint8_t *buffer, size_t size)
|
||||
size_t PsychicStreamResponse::write(const uint8_t* buffer, size_t size)
|
||||
{
|
||||
return _buffer ? _printer->write(buffer, size) : 0;
|
||||
}
|
||||
|
||||
|
||||
size_t PsychicStreamResponse::copyFrom(Stream &stream)
|
||||
size_t PsychicStreamResponse::copyFrom(Stream& stream)
|
||||
{
|
||||
if(_buffer)
|
||||
if (_buffer)
|
||||
return _printer->copyFrom(stream);
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user