获取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);