muduo源码-HttpRequest.h

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

时间: 2024-10-12 08:04:23

muduo源码-HttpRequest.h的相关文章

muduo源码-EpollPoller.h

0 设计 EpollPoller继承自Poller,为的是能够使用epoll和poll两种io函数.(这貌似是策略模式?记不清了) 1 源码 EpollPoller.h #ifndef MUDUO_NET_POLLER_EPOLLPOLLER_H #define MUDUO_NET_POLLER_EPOLLPOLLER_H #include <muduo/net/Poller.h> #include <vector> struct epoll_event; namespace mu

muduo源码-HttpResponse.h

1 设计 HttpResponse类用来,存放需要发送给客户端的数据. 这些数据是一些原始的数据.并没有合成完整的报文. 但是提供一个接口,可以填充传入的 buffer 对象,合成完整的响应报文. 2 源码 #ifndef MUDUO_NET_HTTP_HTTPRESPONSE_H #define MUDUO_NET_HTTP_HTTPRESPONSE_H #include <muduo/base/copyable.h> #include <muduo/base/Types.h>

muduo源码-EventLoop.h

0 设计 EventLoop 类,主要是用来管理一个进程中的channel.计时器.以及epoll 的类. 每个类只有一个,(因为如果有两个,那么一个eventloop 在loop()的时候,另一个eventloop 得不到执行). 每一个channel或者说是每一个文件描述符都必须属于eventloop,换句话说,每一个文件描述符属于一个线程.(这是必然的,因为eventloop在代表了一个线程) eventloop 类的主要工作,就是wait epoll,然后执行channel 的事件处理函

muduo源码分析--我对muduo的理解

分为几个模块 EventLoop.TcpServer.Acceptor.TcpConnection.Channel等 对于EventLoop来说: 他只关注里面的主驱动力,EventLoop中只关注poll,这类系统调用使得其成为Reactor模式,EventLoop中有属于这个loop的所有Channel,这个loop属于哪一个Server. 几个类存在的意义: 从应用层使用的角度来看,用户需要初始化一个EventLoop,然后初始化一个TcpServer(当然也可以自定义个TcpServer

muduo源码分析--Reactor模式在muduo中的使用

一. Reactor模式简介 Reactor释义"反应堆",是一种事件驱动机制.和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为"回调函数". 二. moduo库Reactor模式的实现 muduo主要通过3个类来实现Reactor模式:EventLoop,Chann

muduo源码分析--Reactor模式的在muduo中的使用(二)

一. TcpServer类: 管理所有的TCP客户连接,TcpServer供用户直接使用,生命期由用户直接控制.用户只需设置好相应的回调函数(如消息处理messageCallback)然后TcpServer::start()即可. 主要数据成员: boost::scoped_ptr<Accepter> acceptor_; 用来接受连接 std::map<string,TcpConnectionPtr> connections_; 用来存储所有连接 connectonCallbac

SGI STL源码stl_bvector.h分析

前言 上篇文章讲了 STL vector 泛化版本的实现,其采用普通指针作为迭代器,可以接受任何类型的元素.但如果用来存储 bool 类型的数据,可以实现功能,但每一个 bool 占一个字节(byte),而一个字节有 8 位(bit),这样就有点浪费了.所以 SGI STL 设计了一个特化版本的位向量容器 bit_vector 来节省空间内存.bit_vector 是一个 bit 位元素的序列容器,具有 vector 容器一样的成员函数,常用于硬件端口的控制. 原文地址:https://www.

(素材源码)猫猫学IOS(二十六)UI之iOS抽屉效果小Demo

猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8635679 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果 源码 NYDrawViewController.h // // NYDrawViewController.h // 06-抽屉效果 // // Created by apple on 14-9-1. /

h5微信房卡牛牛源码学习讲解

h5微信房卡牛牛源码Q 2171793408 官网地址: http://wowotouba.com/h5 比较仔细的学习了<c++primer>,并对每个习题都自己写代码实现了一遍,包括稍微复杂一点的例子. 认真读完了<effective c++>,<effective stl>. 比较仔细的学完了<数据结构与算法分析>,并把其中的每种数据结构和算法都用c++实现了一遍.包括各种线性表,树(二叉树.AVL树.RB树的各种操作),图(BFS.DFS.prim.