Web服务器 - 如何解析请求?异步流标记器?

Jas*_*ban 5 parsing asynchronous http stream tokenize

我试图用异步套接字编程风格在C#中创建一个简单的Web服务器.目的非常狭窄 - 一个Comet服务器(http长轮询).

我已经运行了Windows服务,接受连接,将请求信息转储到控制台并将简单的固定内容返回给客户端.

现在,我无法找到一种可管理的策略来异步安全地解析请求数据.我以前写过同步LL1解析器.我不确定LL1 Parser对HTTP是否合适或必要.我不知道如何异步地标记输入流.我能想到的是每个客户端都有一个输入缓冲区,读入它,然后将其复制到StringBuilder并定期检查是否有完整的请求.但这似乎效率低下,可能导致难以调试/维护代码.

此外,完全接收请求和发送响应的连接有两个阶段 - 在这种情况下,在一些延迟之后.一旦请求得到验证并可操作,我才计划在长轮询管理器中注册连接.但是,行为不端的客户端可能会继续发送数据并填充缓冲区,因此我认为我需要在响应阶段继续监视并清空输入流,对吧?

对此有任何指导意见.

我想第一步是知道是否有可能异步地有效地标记网络流并且没有大的中间缓冲区.即使没有合适的解析器,创建令牌化器的相同挑战也适用于一次读取输入的"行",甚至读取直到双空行(一个大的令牌).我不想一次从网络读取一个字节,但我也不想读取太多字节而必须将它们存储在某个中间缓冲区中,对吧?

Thi*_*ter 2

对于 HTTP,最好的方法是完全读取内存中的标头(直到收到\r\n\r\n),然后简单地分割以\r\n获取标头,并按每个标头来:分隔名称和值。

无需为此使用复杂的解析器。