Parcourir la source

Eliminated SocketCore::peekData() from HttpServer.

Tatsuhiro Tsujikawa il y a 14 ans
Parent
commit
629099d40d
3 fichiers modifiés avec 36 ajouts et 26 suppressions
  1. 29 26
      src/HttpServer.cc
  2. 2 0
      src/HttpServer.h
  3. 5 0
      src/SocketRecvBuffer.h

+ 29 - 26
src/HttpServer.cc

@@ -47,6 +47,7 @@
 #include "Base64.h"
 #include "a2functional.h"
 #include "fmt.h"
+#include "SocketRecvBuffer.h"
 
 namespace aria2 {
 
@@ -54,6 +55,7 @@ HttpServer::HttpServer
 (const SharedHandle<SocketCore>& socket,
  DownloadEngine* e)
  : socket_(socket),
+   socketRecvBuffer_(new SocketRecvBuffer(socket_)),
    socketBuffer_(socket),
    e_(e),
    headerProcessor_(new HttpHeaderProcessor()),
@@ -67,25 +69,21 @@ HttpServer::~HttpServer() {}
 
 SharedHandle<HttpHeader> HttpServer::receiveRequest()
 {
-  size_t size = 512;
-  unsigned char buf[size];
-  socket_->peekData(buf, size);
-  if(size == 0 && !(socket_->wantRead() || socket_->wantWrite())) {
-    throw DL_ABORT_EX(EX_EOF_FROM_PEER);
-  }
-  headerProcessor_->update(buf, size);
-  if(!headerProcessor_->eoh()) {
-    socket_->readData(buf, size);
-    return SharedHandle<HttpHeader>();
+  if(socketRecvBuffer_->bufferEmpty()) {
+    if(socketRecvBuffer_->recv() == 0 &&
+       !socket_->wantRead() && !socket_->wantWrite()) {
+      throw DL_ABORT_EX(EX_EOF_FROM_PEER);
+    }
   }
-  size_t putbackDataLength = headerProcessor_->getPutBackDataLength();
-  size -= putbackDataLength;
-  socket_->readData(buf, size);
-
-  SharedHandle<HttpHeader> header = headerProcessor_->getHttpRequestHeader();
-  if(header) {
+  headerProcessor_->update(socketRecvBuffer_->getBuffer(),
+                           socketRecvBuffer_->getBufferLength());
+  if(headerProcessor_->eoh()) {
+    SharedHandle<HttpHeader> header = headerProcessor_->getHttpRequestHeader();
+    size_t putbackDataLength = headerProcessor_->getPutBackDataLength();
     A2_LOG_INFO(fmt("HTTP Server received request\n%s",
                     headerProcessor_->getHeaderString().c_str()));
+    socketRecvBuffer_->shiftBuffer
+      (socketRecvBuffer_->getBufferLength()-putbackDataLength);
     lastRequestHeader_ = header;
     lastBody_.clear();
     lastBody_.str("");
@@ -106,8 +104,11 @@ SharedHandle<HttpHeader> HttpServer::receiveRequest()
     acceptsGZip_ =
       std::find(acceptEncodings.begin(), acceptEncodings.end(), "gzip")
       != acceptEncodings.end();
+    return header;
+  } else {
+    socketRecvBuffer_->clearBuffer();
+    return SharedHandle<HttpHeader>();
   }
-  return header;
 }
 
 bool HttpServer::receiveBody()
@@ -115,16 +116,18 @@ bool HttpServer::receiveBody()
   if(lastContentLength_ == 0) {
     return true;
   }
-  const size_t BUFLEN = 4096;
-  char buf[BUFLEN];
-  size_t length = std::min(BUFLEN,
-                           static_cast<size_t>
-                           (lastContentLength_-lastBody_.tellg()));
-  socket_->readData(buf, length);
-  if(length == 0 && !(socket_->wantRead() || socket_->wantWrite())) {
-    throw DL_ABORT_EX(EX_EOF_FROM_PEER);
+  if(socketRecvBuffer_->bufferEmpty()) {
+    if(socketRecvBuffer_->recv() == 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());
 }
 

+ 2 - 0
src/HttpServer.h

@@ -50,10 +50,12 @@ class SocketCore;
 class HttpHeader;
 class HttpHeaderProcessor;
 class DownloadEngine;
+class SocketRecvBuffer;
 
 class HttpServer {
 private:
   SharedHandle<SocketCore> socket_;
+  SharedHandle<SocketRecvBuffer> socketRecvBuffer_;
   SocketBuffer socketBuffer_;
   DownloadEngine* e_;
   SharedHandle<HttpHeaderProcessor> headerProcessor_;

+ 5 - 0
src/SocketRecvBuffer.h

@@ -54,6 +54,11 @@ public:
   // Shifts buffer by offset bytes. offset must satisfy offset <=
   // getBufferLength().
   void shiftBuffer(size_t offset);
+  // Truncates the contents of buffer to 0.
+  void clearBuffer()
+  {
+    bufLen_ = 0;
+  }
 
   const SharedHandle<SocketCore>& getSocket() const
   {