mirror of https://github.com/aria2/aria2
Eliminated SocketCore::peekData() from HttpServer.
parent
d030dd5a3f
commit
629099d40d
|
@ -47,6 +47,7 @@
|
||||||
#include "Base64.h"
|
#include "Base64.h"
|
||||||
#include "a2functional.h"
|
#include "a2functional.h"
|
||||||
#include "fmt.h"
|
#include "fmt.h"
|
||||||
|
#include "SocketRecvBuffer.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -54,6 +55,7 @@ HttpServer::HttpServer
|
||||||
(const SharedHandle<SocketCore>& socket,
|
(const SharedHandle<SocketCore>& socket,
|
||||||
DownloadEngine* e)
|
DownloadEngine* e)
|
||||||
: socket_(socket),
|
: socket_(socket),
|
||||||
|
socketRecvBuffer_(new SocketRecvBuffer(socket_)),
|
||||||
socketBuffer_(socket),
|
socketBuffer_(socket),
|
||||||
e_(e),
|
e_(e),
|
||||||
headerProcessor_(new HttpHeaderProcessor()),
|
headerProcessor_(new HttpHeaderProcessor()),
|
||||||
|
@ -67,25 +69,21 @@ HttpServer::~HttpServer() {}
|
||||||
|
|
||||||
SharedHandle<HttpHeader> HttpServer::receiveRequest()
|
SharedHandle<HttpHeader> HttpServer::receiveRequest()
|
||||||
{
|
{
|
||||||
size_t size = 512;
|
if(socketRecvBuffer_->bufferEmpty()) {
|
||||||
unsigned char buf[size];
|
if(socketRecvBuffer_->recv() == 0 &&
|
||||||
socket_->peekData(buf, size);
|
!socket_->wantRead() && !socket_->wantWrite()) {
|
||||||
if(size == 0 && !(socket_->wantRead() || socket_->wantWrite())) {
|
throw DL_ABORT_EX(EX_EOF_FROM_PEER);
|
||||||
throw DL_ABORT_EX(EX_EOF_FROM_PEER);
|
}
|
||||||
}
|
}
|
||||||
headerProcessor_->update(buf, size);
|
headerProcessor_->update(socketRecvBuffer_->getBuffer(),
|
||||||
if(!headerProcessor_->eoh()) {
|
socketRecvBuffer_->getBufferLength());
|
||||||
socket_->readData(buf, size);
|
if(headerProcessor_->eoh()) {
|
||||||
return SharedHandle<HttpHeader>();
|
SharedHandle<HttpHeader> header = headerProcessor_->getHttpRequestHeader();
|
||||||
}
|
size_t putbackDataLength = headerProcessor_->getPutBackDataLength();
|
||||||
size_t putbackDataLength = headerProcessor_->getPutBackDataLength();
|
|
||||||
size -= putbackDataLength;
|
|
||||||
socket_->readData(buf, size);
|
|
||||||
|
|
||||||
SharedHandle<HttpHeader> header = headerProcessor_->getHttpRequestHeader();
|
|
||||||
if(header) {
|
|
||||||
A2_LOG_INFO(fmt("HTTP Server received request\n%s",
|
A2_LOG_INFO(fmt("HTTP Server received request\n%s",
|
||||||
headerProcessor_->getHeaderString().c_str()));
|
headerProcessor_->getHeaderString().c_str()));
|
||||||
|
socketRecvBuffer_->shiftBuffer
|
||||||
|
(socketRecvBuffer_->getBufferLength()-putbackDataLength);
|
||||||
lastRequestHeader_ = header;
|
lastRequestHeader_ = header;
|
||||||
lastBody_.clear();
|
lastBody_.clear();
|
||||||
lastBody_.str("");
|
lastBody_.str("");
|
||||||
|
@ -106,8 +104,11 @@ SharedHandle<HttpHeader> HttpServer::receiveRequest()
|
||||||
acceptsGZip_ =
|
acceptsGZip_ =
|
||||||
std::find(acceptEncodings.begin(), acceptEncodings.end(), "gzip")
|
std::find(acceptEncodings.begin(), acceptEncodings.end(), "gzip")
|
||||||
!= acceptEncodings.end();
|
!= acceptEncodings.end();
|
||||||
|
return header;
|
||||||
|
} else {
|
||||||
|
socketRecvBuffer_->clearBuffer();
|
||||||
|
return SharedHandle<HttpHeader>();
|
||||||
}
|
}
|
||||||
return header;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HttpServer::receiveBody()
|
bool HttpServer::receiveBody()
|
||||||
|
@ -115,16 +116,18 @@ bool HttpServer::receiveBody()
|
||||||
if(lastContentLength_ == 0) {
|
if(lastContentLength_ == 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const size_t BUFLEN = 4096;
|
if(socketRecvBuffer_->bufferEmpty()) {
|
||||||
char buf[BUFLEN];
|
if(socketRecvBuffer_->recv() == 0 &&
|
||||||
size_t length = std::min(BUFLEN,
|
!socket_->wantRead() && !socket_->wantWrite()) {
|
||||||
static_cast<size_t>
|
throw DL_ABORT_EX(EX_EOF_FROM_PEER);
|
||||||
(lastContentLength_-lastBody_.tellg()));
|
}
|
||||||
socket_->readData(buf, length);
|
|
||||||
if(length == 0 && !(socket_->wantRead() || socket_->wantWrite())) {
|
|
||||||
throw DL_ABORT_EX(EX_EOF_FROM_PEER);
|
|
||||||
}
|
}
|
||||||
lastBody_.write(buf, length);
|
size_t length =
|
||||||
|
std::min(socketRecvBuffer_->getBufferLength(),
|
||||||
|
static_cast<size_t>(lastContentLength_-lastBody_.tellg()));
|
||||||
|
lastBody_.write(reinterpret_cast<const char*>(socketRecvBuffer_->getBuffer()),
|
||||||
|
length);
|
||||||
|
socketRecvBuffer_->shiftBuffer(length);
|
||||||
return lastContentLength_ == static_cast<uint64_t>(lastBody_.tellp());
|
return lastContentLength_ == static_cast<uint64_t>(lastBody_.tellp());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,10 +50,12 @@ class SocketCore;
|
||||||
class HttpHeader;
|
class HttpHeader;
|
||||||
class HttpHeaderProcessor;
|
class HttpHeaderProcessor;
|
||||||
class DownloadEngine;
|
class DownloadEngine;
|
||||||
|
class SocketRecvBuffer;
|
||||||
|
|
||||||
class HttpServer {
|
class HttpServer {
|
||||||
private:
|
private:
|
||||||
SharedHandle<SocketCore> socket_;
|
SharedHandle<SocketCore> socket_;
|
||||||
|
SharedHandle<SocketRecvBuffer> socketRecvBuffer_;
|
||||||
SocketBuffer socketBuffer_;
|
SocketBuffer socketBuffer_;
|
||||||
DownloadEngine* e_;
|
DownloadEngine* e_;
|
||||||
SharedHandle<HttpHeaderProcessor> headerProcessor_;
|
SharedHandle<HttpHeaderProcessor> headerProcessor_;
|
||||||
|
|
|
@ -54,6 +54,11 @@ public:
|
||||||
// Shifts buffer by offset bytes. offset must satisfy offset <=
|
// Shifts buffer by offset bytes. offset must satisfy offset <=
|
||||||
// getBufferLength().
|
// getBufferLength().
|
||||||
void shiftBuffer(size_t offset);
|
void shiftBuffer(size_t offset);
|
||||||
|
// Truncates the contents of buffer to 0.
|
||||||
|
void clearBuffer()
|
||||||
|
{
|
||||||
|
bufLen_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
const SharedHandle<SocketCore>& getSocket() const
|
const SharedHandle<SocketCore>& getSocket() const
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue