diff --git a/src/Http/HttpBody.cpp b/src/Http/HttpBody.cpp index cbada40f..58b7b0b7 100644 --- a/src/Http/HttpBody.cpp +++ b/src/Http/HttpBody.cpp @@ -181,6 +181,10 @@ int HttpFileBody::sendFile(int fd) { #endif } +bool HttpFileBody::isMem(){ + return false; +} + class BufferMmap : public Buffer { public: using Ptr = std::shared_ptr; diff --git a/src/Http/HttpBody.h b/src/Http/HttpBody.h index 3ba60565..76b46edd 100644 --- a/src/Http/HttpBody.h +++ b/src/Http/HttpBody.h @@ -44,6 +44,12 @@ public: */ virtual toolkit::Buffer::Ptr readData(size_t size) { return nullptr;}; + /** + * 判断数据是否在内存里,默认是在内存里 + * @return 默认返回true + */ + virtual bool isMem(){return true;}; + /** * 异步请求读取一定字节数,返回大小可能小于size * @param size 请求大小 @@ -117,10 +123,11 @@ public: * @param max_size 最大读取字节数 */ void setRange(uint64_t offset, uint64_t max_size); - + int64_t remainSize() override; toolkit::Buffer::Ptr readData(size_t size) override; int sendFile(int fd) override; + bool isMem() override; private: int64_t _read_to = 0; diff --git a/src/Http/HttpSession.cpp b/src/Http/HttpSession.cpp index 38eb5473..a0d98b8a 100644 --- a/src/Http/HttpSession.cpp +++ b/src/Http/HttpSession.cpp @@ -141,12 +141,12 @@ ssize_t HttpSession::onRecvHeader(const char *header, size_t len) { _parser.clear(); // 后续是header - setContentLen(0); + //setContentLen(0); return false; }; // 声明后续都是body;Http body在本对象缓冲,不通过HttpRequestSplitter保存 - return -1; + return content_len; } void HttpSession::onRecvContent(const char *data, size_t len) { @@ -687,6 +687,14 @@ void HttpSession::sendResponse(int code, setSocketFlags(); } + if(body->isMem()){ + send(body->readData(body->remainSize())); + if(bClose){ + shutdown(SockException(Err_shutdown, StrPrinter << "close connection after send http body")); + } + return; + } + // 发送http body AsyncSenderData::Ptr data = std::make_shared(static_pointer_cast(shared_from_this()), body, bClose); getSock()->setOnFlush([data]() { return AsyncSender::onSocketFlushed(data); });