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