1 设计
HttpRequest 类,是解析完毕的请求体所存放的地方,被关联在 HttpConnext中.
2 源码
#ifndef MUDUO_NET_HTTP_HTTPREQUEST_H #define MUDUO_NET_HTTP_HTTPREQUEST_H #include <muduo/base/copyable.h> #include <muduo/base/Timestamp.h> #include <muduo/base/Types.h> #include <map> #include <assert.h> #include <stdio.h> namespace muduo { namespace net { // HttpContext 类只是负责解析的,请求的 // 解析出来的数据是存放在 HttpRequest 类中的 class HttpRequest : public muduo::copyable { public: // 解析出来的 请求方法 enum Method { kInvalid, kGet, kPost, kHead, kPut, kDelete }; // http版本 enum Version { kUnknown, kHttp10, kHttp11 }; HttpRequest() : method_(kInvalid), version_(kUnknowkExpectBodyn) { } // 设置的 void setVersion(Version v) { version_ = v; } Version getVersion() const { return version_; } bool setMethod(const char* start, const char* end) { assert(method_ == kInvalid); string m(start, end); if (m == "GET") { method_ = kGet; } else if (m == "POST") { method_ = kPost; } else if (m == "HEAD") { method_ = kHead; } else if (m == "PUT") { method_ = kPut; } else if (m == "DELETE") { method_ = kDelete; } else { method_ = kInvalid; } return method_ != kInvalid; } Method method() const { return method_; } const char* methodString() const { const char* result = "UNKNOWN"; switch(method_) { case kGet: result = "GET"; break; case kPost: result = "POST"; break; case kHead: result = "HEAD"; break; case kPut: result = "PUT"; break; case kDelete: result = "DELETE"; break; default: break; } return result; } void setPath(const char* start, const char* end) { path_.assign(start, end); } const string& path() const { return path_; } void setQuery(const char* start, const char* end) { query_.assign(start, end); } const string& query() const { return query_; } void setReceiveTime(Timestamp t) { receiveTime_ = t; } Timestamp receiveTime() const { return receiveTime_; } // 世界上解析请求头中字段的 void addHeader(const char* start, const char* colon, const char* end) { string field(start, colon); // 先去头尾空格 ++colon; while (colon < end && isspace(*colon)) { ++colon; } string value(colon, end); while (!value.empty() && isspace(value[value.size()-1])) { value.resize(value.size()-1); } // 设置保存 headers_[field] = value; } string getHeader(const string& field) const { string result; std::map<string, string>::const_iterator it = headers_.find(field); if (it != headers_.end()) { result = it->second; } return result; } const std::map<string, string>& headers() const { return headers_; } void swap(HttpRequest& that) { std::swap(method_, that.method_); std::swap(version_, that.version_); path_.swap(that.path_); query_.swap(that.query_); receiveTime_.swap(that.receiveTime_); headers_.swap(that.headers_); } private: Method method_; Version version_; string path_; string query_; Timestamp receiveTime_; std::map<string, string> headers_; }; } } #endif // MUDUO_NET_HTTP_HTTPREQUEST_H
#ifndefMUDUO_NET_HTTP_HTTPREQUEST_H
#defineMUDUO_NET_HTTP_HTTPREQUEST_H
#include<muduo/base/copyable.h>
#include<muduo/base/Timestamp.h>
#include<muduo/base/Types.h>
#include<map>
#include<assert.h>
#include<stdio.h>
namespacemuduo
{
namespacenet
{
// HttpContext 类只是负责解析的,请求的
// 解析出来的数据是存放在 HttpRequest 类中的
classHttpRequest : publicmuduo::copyable
{
public:
// 解析出来的 请求方法
enum Method
{
kInvalid, kGet, kPost, kHead, kPut, kDelete
};
// http版本
enum Version
{
kUnknown, kHttp10, kHttp11
};
HttpRequest()
: method_(kInvalid),
version_(kUnknowkExpectBodyn)
{
}
// 设置的
voidsetVersion(Version v)
{
version_ = v;
}
Version getVersion() const
{ return version_; }
boolsetMethod(constchar* start, constchar* end)
{
assert(method_ == kInvalid);
string m(start, end);
if (m =="GET")
{
method_ = kGet;
}
elseif (m =="POST")
{
method_ = kPost;
}
elseif (m =="HEAD")
{
method_ = kHead;
}
elseif (m =="PUT")
{
method_ = kPut;
}
elseif (m =="DELETE")
{
method_ = kDelete;
}
else
{
method_ = kInvalid;
}
return method_ != kInvalid;
}
Method method() const
{ return method_; }
constchar*methodString() const
{
constchar* result ="UNKNOWN";
switch(method_)
{
case kGet:
result ="GET";
break;
case kPost:
result ="POST";
break;
case kHead:
result ="HEAD";
break;
case kPut:
result ="PUT";
break;
case kDelete:
result ="DELETE";
break;
default:
break;
}
return result;
}
voidsetPath(constchar* start, constchar* end)
{
path_.assign(start, end);
}
const string&path() const
{ return path_; }
voidsetQuery(constchar* start, constchar* end)
{
query_.assign(start, end);
}
const string&query() const
{ return query_; }
voidsetReceiveTime(Timestamp t)
{ receiveTime_ = t; }
Timestamp receiveTime() const
{ return receiveTime_; }
// 世界上解析请求头中字段的
voidaddHeader(constchar* start, constchar* colon, constchar* end)
{
string field(start, colon);
// 先去头尾空格
++colon;
while (colon < end &&isspace(*colon))
{
++colon;
}
string value(colon, end);
while (!value.empty() &&isspace(value[value.size()-1]))
{
value.resize(value.size()-1);
}
// 设置保存
headers_[field] = value;
}
string getHeader(const string& field) const
{
string result;
std::map<string, string>::const_iterator it = headers_.find(field);
if (it != headers_.end())
{
result = it->second;
}
return result;
}
const std::map<string, string>&headers() const
{ return headers_; }
voidswap(HttpRequest& that)
{
std::swap(method_, that.method_);
std::swap(version_, that.version_);
path_.swap(that.path_);
query_.swap(that.query_);
receiveTime_.swap(that.receiveTime_);
headers_.swap(that.headers_);
}
private:
Method method_;
Version version_;
string path_;
string query_;
Timestamp receiveTime_;
std::map<string, string> headers_;
};
}
}
#endif// MUDUO_NET_HTTP_HTTPREQUEST_H
原文地址:https://www.cnblogs.com/perfy576/p/8669035.html