码迷,mamicode.com
首页 > Web开发 > 详细

muduo源码分析之HttpServer

时间:2021-06-06 19:11:18      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:inf   ted   auto   post   路径   浏览器   ext   lin   orm   

相关文件

muduo/net/http/*
HttpRequst:http请求类
HttpResponse: http响应类
HttpContext: http协议解析类
HttpServer: http服务器类

作用

解析http请求,用户只需根据http请求类,设置好响应类,http服务器会把响应报文发给客户端(浏览器)。

先备知识

http请求

一个典型的http请求:

    GET /hello HTTP/1.1\r\n
    Host: 192.168.91.129:8000\r\n
    Connection: keep-alive\r\n
    Upgrade-Insecure-Requests: 1\r\n
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Edg/90.0.818.62\r\n
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
    Accept-Encoding: gzip, deflate\r\n
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\r\n
    \r\n

请求报文有请求行line+请求头header+请求实体body。
上面第一行即请求行,下面的是请求头,没有body。
header和body之间有一空行。
请求行
请求方法有Get, Post, Head, Put, Delete等
协议版本:1.0、1.1
请求头
Accept:浏览器可接受的媒体(MIME)类型;
Accept-Language:浏览器所希望的语言种类
Accept-Encoding:浏览器能够解码的编码方法,如gzip,deflate等
User-Agent:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本
Connection:表示是否需要持久连接,Keep-Alive表示长连接,close表示短连接

http应答

由状态行status line+响应头header+实体body组成
一个典型的http应答:

HTTP/1.1 200 OK
Content-Length: 112
Connection: Keep-Alive
Content-Type: text/html
Server: Muduo

<html><head><title>This is title</title></head><body><h1>Hello</h1>Now is 20130611 02:14:31.518462</body></html>

当然每行结尾都是有/r/n的,header和body之间有一空行。
第一行为状态行
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器执行一个有效请求失败

使用

在muduo/net/http/tests中提供了使用示例
HttpServer_test.cc

#include "muduo/net/http/HttpServer.h"
#include "muduo/net/http/HttpRequest.h"
#include "muduo/net/http/HttpResponse.h"
#include "muduo/net/EventLoop.h"
#include "muduo/base/Logging.h"

#include <iostream>
#include <map>

using namespace muduo;
using namespace muduo::net;

extern char favicon[555];
bool benchmark = false;

void onRequest(const HttpRequest& req, HttpResponse* resp)
{
  std::cout << "Headers " << req.methodString() << " " << req.path() << std::endl;
  if (!benchmark)
  {
    const std::map<string, string>& headers = req.headers();
    for (const auto& header : headers)
    {
      std::cout << header.first << ": " << header.second << std::endl;
    }
  }
  //按请求路径
  if (req.path() == "/") //请求行中的路径是 / 时
  {
    resp->setStatusCode(HttpResponse::k200Ok);//设置状态码
    resp->setStatusMessage("OK");
    resp->setContentType("text/html");
    resp->addHeader("Server", "Muduo");
    string now = Timestamp::now().toFormattedString();
	//设置应答实体body
    resp->setBody("<html><head><title>This is title</title></head>"
        "<body><h1>Hello</h1>Now is " + now +
        "</body></html>");
  }
  else if (req.path() == "/favicon.ico")
  {
    resp->setStatusCode(HttpResponse::k200Ok);
    resp->setStatusMessage("OK");
    resp->setContentType("image/png");
    resp->setBody(string(favicon, sizeof favicon));
  }
  else if (req.path() == "/hello")
  {
    resp->setStatusCode(HttpResponse::k200Ok);
    resp->setStatusMessage("OK");
    resp->setContentType("text/plain");
    resp->addHeader("Server", "Muduo");
    resp->setBody("hello, world!\n");
  }
  else
  {
    resp->setStatusCode(HttpResponse::k404NotFound);
    resp->setStatusMessage("Not Found");
    resp->setCloseConnection(true);
  }
}

int main(int argc, char* argv[])
{
  int numThreads = 0;
  if (argc > 1)
  {
    benchmark = true;
    Logger::setLogLevel(Logger::WARN);
    numThreads = atoi(argv[1]);
  }
  EventLoop loop;
  HttpServer server(&loop, InetAddress(8000), "dummy");
  server.setHttpCallback(onRequest);
  server.setThreadNum(numThreads);
  server.start();
  loop.loop();
}

char favicon[555] = {
  ‘\x89‘, ‘P‘, ‘N‘, ‘G‘, ‘\xD‘, ‘\xA‘, ‘\x1A‘, ‘\xA‘,
  //太长,略,是一张图标的数据
};

编译运行该示例,即开启了一个http服务器
技术图片
在浏览器地址栏输出ip地址+端口号+请求地址可访问
技术图片
这里访问的是/地址,返回 "hello" +时间戳。

可使用wireshark抓包查看报文
技术图片

HttpServer源码分析

muduo源码分析之HttpServer

标签:inf   ted   auto   post   路径   浏览器   ext   lin   orm   

原文地址:https://www.cnblogs.com/Lj-ming/p/14854332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!