如何用c++解析http请求

2024-01-24

我正在尝试编写一个小型 C++ Web 服务器来处理 GET、POST、HEAD 请求。我的问题是我不知道如何解析标头、消息正文等。它正在监听套接字,我什至可以将内容写入浏览器,但我很好奇我应该如何在 C++ 中执行此操作。

据我所知,标准的 GET/POST 请求应该如下所示:

GET /index HTTP/1.1
Host: 192.168.0.199:80
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko)     Chrome/25.0.1364.97 Safari/537.22
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

this is the message body

所有行均以“\r\n”结尾。

我应该在“\n”处拆分请求并修剪它们(如果是的话如何修剪)? 另外如何处理帖子数据中的文件?

我想要实现的主要目标是获取一个包含标头 key=>value 对的向量、带有请求方法的字符串、发布数据(如在 PHP 中,如果存在的话)和查询字符串(例如 /index)作为字符串或由“/”分割的向量。

Thanks!


在你自己做所有事情之前,我先介绍一下你Poco https://pocoproject.org/:

class MyHTTPRequestHandler : public HTTPRequestHandler
{
public:
    virtual void handleRequest(HTTPServerRequest & request,
                               HTTPServerResponse & response) {
        // Write your HTML response in res object
    }
};

class MyRequestHandlerFactory : public HTTPRequestHandlerFactory
{
    MyHTTPRequestHandler handler;

public:
    MyRequestHandlerFactory(){}
    HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request)
    {
        const string method = request.getMethod();
        if (method == "get" || method == "post")
            return &handler;
        return 0;
    }
};

int main()
{
    HTTPServerParams params;
    params.setMaxQueued(100);
    params.setMaxThreads(16);
    ServerSocket svs(80);
    MyRequestHandlerFactory factory;
    HTTPServer srv(&factory, svs, &params);
    srv.start();
    while (true)
        Thread::sleep(1000);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用c++解析http请求 的相关文章

随机推荐

  • 如何舍入到某个浮点精度?

    我认为这是一个简单的问题 我想 a 1 154648126486416 成为 a 1 154 and not a 1 15000000000 在不使用的情况下我该如何做到这一点format bank 你可以这样做 a floor a 100
  • WPF 装饰器有什么意义?

    我最近为我的公司开发了一个绘图组件 其中包含一个画布 您可以在上面通过单击并拖动来绘制某些形状 对于每个形状 我在其 AdornerLayer 上放置了两个装饰器 一个用于增加命中检测 基本上是一个会超出形状边界几个像素的透明矩形 另一个用
  • 什么是

    我对 Vue js 完全陌生 我想我对路由器如何处理以下内容有一些了解
  • 使用 dateutil 解析器从字符串中解析日期

    我正在尝试解析字符串格式的日期 u 2015 年 6 月 11 日 12 26 小时 美国标准时间 但是当我使用 dateutil 解析器来解析时出现错误 from dateutil parser import parse parse u
  • SQL:NOLOCK 导致查询速度变慢

    向查询添加 nolock 是否有任何原因会导致执行时间增加 UPDATE TargetTable SET col1 c1 RowCnt col2 c2 RowCnt from TargetTable tt join select col3
  • 为什么在快速排序中选择随机主元

    So choosing a pivot at random has O n2 running at worst case but when the pivot is chosen as the average of min value an
  • 如何在 JPopupMenu 中获得焦点

    我是一名经验丰富的 Java 程序员 但还是一名 Swing 新手 所以请耐心等待 我希望有一个具有键盘焦点的 JPopupWindow 我想响应箭头键 Escape 关闭菜单 和 Enter 调用该项目 我是否必须在菜单中添加一个 Key
  • 如何使用 MS Ole DB 提供程序在两个 FoxPro 数据库之间创建联接?

    问题 我正在使用现有的商业 MS Visual Foxpro 应用程序 并且需要使用 C 应用程序直接从数据库中提取数据 不幸的是 并非所有表都存储在同一个数据库中 一些记录存储在按年份细分的数据库中 如何使用单个联接创建针对这两个数据库的
  • 这是检测反应组件中第一次渲染的正确方法

    我有一个场景 我需要检测组件的第一次渲染 我在这里构建了一个小例子 有人可以向我解释什么是正确的方法吗 为什么大多数人建议使用ref而不是一个简单的状态 https codesandbox io s condescending burnel
  • struct String() 实现导致堆栈溢出并带有 Sprintf“+”标志

    Golang菜鸟问题 为什么我可以not使用 v String 实现方法中结构的标志 我有一个结构 我想在其中实现String 漂亮打印的方法 我喜欢给出的答案here https stackoverflow com a 33252434
  • 错误的状态类——在带有自定义视图的 Android 1.5 中期望视图状态异常

    当我切换到横向模式时 以下自定义视图在 Android 1 5r3 cupcake 中引发异常 java lang RuntimeException Unable to start activity ComponentInfo com op
  • 重写 git 历史记录,替换每个文件中的一个单词

    我想用 git filter branch 重写我的存储库的 git 历史记录 以将所有文件中所有出现的 foo bar 替换为 bar foo 我怎样才能实现这个目标 Update 我一直在使用 tree filter 参数 并且我已经能
  • 映射到任一左侧

    在我的应用程序中的某个地方我收到Either ParserError MyParseResult从秒差距 在下游 此结果通过使用其他库完成了一些其他解析 在解析的第二阶段 也可能会发生某种错误 我想将其作为Left String 但为此我需
  • 即使捕获错误,Observable 也会停止触发

    我在我的项目中遇到了一个非常奇怪的行为 我有一个简单的 Angular 服务 代码如下 seatClick new Subject
  • 求 hh:mm:ss 的时间平均值

    我有这个小提琴可以计算以毫秒为单位的平均时间 但是 我的数据库以 hh mm ss 格式存储数据 fiddle http jsfiddle net 3yVMK 1 var times 00 00 03 00 00 00 05 00 00 0
  • Sys.WebForms.PageRequestManagerServerErrorException:输入字符串的格式不正确

    嗨 我收到错误 Sys WebForms PageRequestManagerServerErrorException 输入字符串的格式不正确 当按下删除按钮时 但此错误仅出现在一台 Web 服务器中 在其他服务器上它工作正常 同样 当本地
  • !!布尔值表达式

    我正在读约翰 雷西格的书JavaScript 忍者的秘密并看到了这段代码 function Ninja this swung false Should return true this swingSword function return
  • Microsoft Graph APi 未返回“已取消”事件

    我正在尝试使用 Microsoft 图形 API 获取会议室日历中的所有事件 给定 startDateTime 和 endDateTime 我尝试了以下 API 1 https graph microsoft com v1 0 users
  • 如何获取 Python 多处理池剩余的“工作”量?

    到目前为止 每当我需要使用multiprocessing http docs python org 2 library multiprocessing htm我通过手动创建 进程池 并与所有子进程共享工作队列来完成此操作 例如 from m
  • 如何用c++解析http请求

    我正在尝试编写一个小型 C Web 服务器来处理 GET POST HEAD 请求 我的问题是我不知道如何解析标头 消息正文等 它正在监听套接字 我什至可以将内容写入浏览器 但我很好奇我应该如何在 C 中执行此操作 据我所知 标准的 GET