我正在尝试使用Haskell和Pipes库实现一个简单的Web服务器.我现在明白管道不可能使用循环或钻石拓扑,但我认为我想要的是.因此我想要的拓扑结构是:
-GET--> handleGET >-> packRequest >-> socketWriteD
|
socketReadS >-> parseRequest >-routeRequest
|
-POST-> handlePOST >-> packRequest >-> socketWriteD
Run Code Online (Sandbox Code Playgroud)
我有HTTPRequest RequestLine Headers Message
和HTTPResponse StatusLine Headers Message
链中使用的类型.socketReadS
从套接字中获取字节并将它们转发给它parseRequest
,它使用Attoparsec将字节解析为一个HTTPRequest
对象.然后,我希望管道分支至少两次,可能更多,具体取决于我实现的HTTP方法数量.每个handle<method>
函数都应该接收HTTPRequest
来自上游和前向HTTPResponse
对象的对象packRequest
,这些对象只是将HTTPResponse对象打包成一个ByteString
随时可以发送的对象socketWriteS
.
如果我让GHC推断出类型,那么下面的代码可以检查routeRequest'''
(我的某种方式似乎有些偏差).但是之后似乎没有任何事情在执行parseRequest
.任何人都可以帮我找出原因吗?
我有以下代码routeRequest
应该处理分支.
routeRequest''' ::
(Monad m, Proxy p1, Proxy p2, Proxy p3)
=> () -> Consumer p1 HTTPRequest (Pipe p2 HTTPRequest HTTPRequest (Pipe p3 …
Run Code Online (Sandbox Code Playgroud)