我正在尝试使用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)