Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

ericCui97/mini-httpserver

Open more actions menu

Repository files navigation

mini-http-server

1. 需求文档

2.完成情况

  • 支持tcp server
  • http get
  • io 多路复用
  • 单线程 单机下载带宽
  • 无资源泄露
  • chunk
  • 长连接
  • pipline
  • 一个请求下载完100m
  • range
  • 302

运行方式

cd build
cmake ..
make

./epollserver

测试结果

下载带宽换算约为350mbps

详细情况

可扩展性,可维护性:

实现了如下图的调用方式,需要添加接口只需要确定uri和回调函数,不需要关心epoll socket的问题,同时实现了动态路由(trie树)

int main()
{
    HttpServer server;
    server.GET("/hello", [](HttpRequest &req) {
        HttpResponse res(req, HTML_TYPE, "hello.html");
        res.send();
    });
    server.GET("/100M", [](HttpRequest &req) {
        HttpResponse res(req, SOCK_STREAM, "100M");
       res.send();
    });
    server.Run();
}

本项目的简要uml设计: h8jXKf.md.png](https://imgtu.com/i/h8jXKf)

解析http请求

使用fsm进行解析,具体参考了这篇文章的思路,在httprequest类中的trydecode方法中实现

一个连接下载100M

完成此需求也就意味着完成了1-4的基础需求。 测试用的下载文件就是100m的文件

30分钟压测结果下载带宽约为350mbps。

分chunk下载

简单的实现了chunked,逻辑为判断请求头是否含有tranfer-encoding:chunked 若有则传输文件使用以下函数

测试方式:在postman或者curl中设置chunked请求头 具体实现见file_service/file_service.h

range 和 chunk在file_service 下均有单元测试

目前的实现只支持tranfer-encoding:chunked和固定chunk大小 hGkYcQ.md.png

range下载

目前只支持单一范围的range,也就是Range: bytes=0-1023这种形式 实现代码如下

测试方式:在postman或者curl中设置range请求头 hGFoOs.md.png

长链接

测试:请求头中加入connection:keep-alive 字段 实现如下:

/**
 * @brief
 *
 * @param _fd  操作的socket的文件描述符
 * @param idle 出发保活机制的时间
 * @param intv 如果没有收到回应,intv秒后重发
 * @param cnt  连续cnt没有收到保活包,则连接失效
 * @return int
 */
inline static int setKeepALive(int _fd, int idle, int intv, int cnt)
{

    int alive = 1;
    if (setsockopt(_fd, SOL_SOCKET, SO_KEEPALIVE, &alive, sizeof alive) != 0) {
        log_err("set keep alive error");
        return -1;
    }

    if (setsockopt(_fd, SOL_TCP, TCP_KEEPINTVL, &intv, sizeof intv) != 0) {
        log_err("set keep alive error");
        return -1;
    }

    if (setsockopt(_fd, SOL_TCP, TCP_KEEPIDLE, &idle, sizeof idle) != 0) {
        log_err("set keep alive error");
        return -1;
    }
    if (setsockopt(_fd, SOL_TCP, TCP_KEEPCNT, &cnt, sizeof cnt) != 0) {
        log_err("set keep alive error");
        return -1;
    }
    return 0;
}

302 重定向

运行之后输入不存在的url路由,会返回302响应,重定向到302 页面

使用access 函数实现

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
Morty Proxy This is a proxified and sanitized view of the page, visit original site.