如何解决如何使用Network.HTTP.receiveHTTP在Haskell中编写简单的HTTP服务器
|| 模块Network.HTTP
公开了我想用于非常基本的Web服务器的功能receiveHTTP
和respondHTTP
。我写了一个存根,只等待客户:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Network.HTTP
import Network
import Control.Monad
main = withSocketsDo $ do
socket <- listenOn $ PortNumber 8080
forever $ do
(handle,host,port) <- accept socket
print (host,port)
这里的accpet
给了我Handle
,现在我不知道如何将Handle
与receiveHTTP
一起使用。
我在Google上找到了一个示例,但这是从2008年开始的,不再起作用。而且我无法移植它。
有任何想法吗?
解决方法
您可以执行此操作,但我真的认为您不应该这样做。
HTTP
可以充当服务器,但旨在用于客户端。我用Google搜索了一下,但找不到任何实际使用respondHTTP
的例子。如果您在2016年使用客户端HTTP,请使用ѭ10。在服务器端,ѭ11或其他依赖于它的东西可能就是您想要的。
不过,这是代码。
#!/usr/bin/env stack
-- stack --resolver lts-6.3 --install-ghc runghc --package HTTP
{-# LANGUAGE RecordWildCards #-}
import Control.Monad
import qualified Data.ByteString as B
import Network.HTTP
import Network.Socket
import Network.URI
main = do
lsock <- socket AF_INET Stream defaultProtocol
bind lsock (SockAddrInet 8080 iNADDR_ANY)
listen lsock 1
forever $ do
(csock,_) <- accept lsock
hs <- socketConnection \"\" 8080 csock
req <- receiveHTTP hs
case req of
Left _ -> error \"Receiving request failed\"
Right (Request {..}) -> if uriPath rqURI == \"/\"
then do
respondHTTP hs $
Response (2,0) \"OK\" [] \"Hello HTTP\"
Network.HTTP.close hs
else do
respondHTTP hs $
Response (4,4) \"Not found\" [] \"Nothing here\"
Network.HTTP.close hs
上面使用了Stack对shebang脚本的支持。 chmod +x
或以stack foo.hs
运行。
ѭ15模块已弃用。如果需要套接字API,请始终使用ѭ16。对于更高级别的内容,请使用connection
。
您可以执行普通的POSIX套接字操作,然后将连接的套接字转换为带有ѭ19的HandleStream
并在其上运行respondHTTP
和receiveHTTP
。 socketConnection
是一个怪异的功能。前两个参数是运行服务器时不使用AFAICT的主机名和端口。
我用RecordWildCards
扩展名。它使我可以用模式写Right (Request {..})
,并将记录的所有字段都放在右侧的范围内。
, 也许它希望您使用Network.Socket
中的accept
函数而不是Network
?这将使您获得一个Socket
而不是Handle
,您应该能够将其转换为receiveHTTP
可以使用的形式。
通常,直接使用ѭ5会更好一些,但是在这里HTTP库为您处理了它,因此它希望使用较低级别的接口。
编辑:进一步研究后,似乎Network.TCP
中的socketConnection
函数可以满足您的需求。有趣的是,它实际上是在从套接字读取之前在内部将其插入一个ѭ5插座,但似乎没有提供从外部提供的read5插座进行读取的方法。该函数的字符串参数应该是远程主机的名称,但看起来只是作为参考;实际上并没有启动与该主机或其他任何设备的连接。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。