【muduo】http server 提取body内容到HttpRequest

获取moduo源码,想使用其中的http server,并且使用其中的post method。结果发现没有提取其中的body内容,在源码的基础上进行了扩展。

patch如下:
 

diff --git a/muduo/net/http/HttpContext.cc b/muduo/net/http/HttpContext.cc
index bef3a80..2e043e4 100644
--- a/muduo/net/http/HttpContext.cc
+++ b/muduo/net/http/HttpContext.cc
@@ -6,7 +6,7 @@
 
 // Author: Shuo Chen (chenshuo at chenshuo dot com)
 //
-
+#include <iostream>
 #include "muduo/net/Buffer.h"
 #include "muduo/net/http/HttpContext.h"
 
@@ -99,8 +99,15 @@ bool HttpContext::parseRequest(Buffer* buf, Timestamp receiveTime)
         {
           // empty line, end of header
           // FIXME:
-          state_ = kGotAll;
-          hasMore = false;
+          if (request_.method() == muduo::net::HttpRequest::kPost)
+          {
+            state_ = kExpectBody;
+          }
+          else
+          {
+            state_ = kGotAll;
+            hasMore = false;
+          }
         }
         buf->retrieveUntil(crlf + 2);
       }
@@ -112,6 +119,9 @@ bool HttpContext::parseRequest(Buffer* buf, Timestamp receiveTime)
     else if (state_ == kExpectBody)
     {
       // FIXME:
+      request_.setBody(buf->peek());
+      state_ = kGotAll;
+      hasMore = false;
     }
   }
   return ok;
diff --git a/muduo/net/http/HttpRequest.h b/muduo/net/http/HttpRequest.h
index 9c70c5d..76c3473 100644
--- a/muduo/net/http/HttpRequest.h
+++ b/muduo/net/http/HttpRequest.h
@@ -126,6 +126,14 @@ class HttpRequest : public muduo::copyable
   const string& query() const
   { return query_; }
 
+  void setBody(const char* start)
+  {
+    body_ = start;
+  }
+
+  const string& body() const
+  { return body_; }
+
   void setReceiveTime(Timestamp t)
   { receiveTime_ = t; }
 
@@ -177,6 +185,7 @@ class HttpRequest : public muduo::copyable
   Version version_;
   string path_;
   string query_;
+  string body_;
   Timestamp receiveTime_;
   std::map<string, string> headers_;
 };
diff --git a/muduo/net/http/tests/HttpServer_test.cc b/muduo/net/http/tests/HttpServer_test.cc
index 0ec38fb..84737c3 100644
--- a/muduo/net/http/tests/HttpServer_test.cc
+++ b/muduo/net/http/tests/HttpServer_test.cc
@@ -51,6 +51,24 @@ void onRequest(const HttpRequest& req, HttpResponse* resp)
     resp->addHeader("Server", "Muduo");
     resp->setBody("hello, world!\n");
   }
+  else if (req.path() == "/abc/def")
+  {
+    if (req.method() == muduo::net::HttpRequest::kPost)
+    {
+      std::cout << "request body: " << req.body() << std::endl;
+      resp->setStatusCode(HttpResponse::k200Ok);
+      resp->setStatusMessage("OK");
+      resp->setContentType("application/json");
+      resp->setBody("{\"msg_head\":{\"msg_uuid\":\"045c4faf-4613-4d20-8a10-9d2d82038ad3\",\"cmd_type\":\"PushRequest\"}}");
+    }
+    else
+    {
+      std::cout << "method is invalid. method:" << req.method() << std::endl;
+      resp->setStatusCode(HttpResponse::k404NotFound);
+      resp->setStatusMessage("Not Found");
+      resp->setCloseConnection(true);
+    }
+  }
   else
   {
     resp->setStatusCode(HttpResponse::k404NotFound);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值