如何使用Network.HTTP.receiveHTTP在Haskell中编写简单的HTTP服务器

如何使用Network.HTTP.receiveHTTP在Haskell中编写简单的HTTP服务器,http,haskell,Http,Haskell,模块 公开我想用于非常基本的web服务器的函数receiveHTTP和respondHTTP。我编写了一个只等待客户端的存根: {-# LANGUAGE OverloadedStrings #-} module Main where import Network.HTTP import Network import Control.Monad main = withSocketsDo $ do socket <- listenOn $ PortNumber 8080 forev

模块 公开我想用于非常基本的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)
{-#语言重载字符串}
模块主要在哪里
导入网络.HTTP
导入网络
进口管制
main=带库存的订单$do

socket也许它希望您使用而不是
网络
?这将为您提供一个
套接字
,而不是
句柄
,您应该能够将其转换为
receiveHTTP
可以使用的表单

通常,直接使用
句柄
会更好,但在这里,HTTP库为您处理它,因此它希望使用较低级别的接口


编辑:进一步查看后,似乎
网络中的
socketConnection
功能可以满足您的需要。有趣的是,它实际上是在内部将套接字制作成
句柄
,然后再从中读取,但似乎没有提供从外部提供的
句柄
读取的方法。函数的字符串参数应该是远程主机的名称,但它看起来只是作为参考保存的;它实际上并没有启动到该主机的连接或其他任何操作。

您可以这样做,但我真的认为您不应该这样做
HTTP
可以用作服务器,但设计用于客户端。我在谷歌上搜索了一下,没有找到任何人实际使用
respondHTTP
的例子。如果您在2016年使用客户端HTTP,请使用。在服务器端,或者依赖于它的东西可能就是您想要的

不过,代码是这样的

#!/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,0) "OK" [] "Hello HTTP"
                              Network.HTTP.close hs
                            else do
                              respondHTTP hs $
                                Response (4,0,4) "Not found" [] "Nothing here"
                              Network.HTTP.close hs
#/usr/bin/env堆栈
--堆栈--解析器lts-6.3--安装ghc runghc--包HTTP
{-#语言记录通配符}
进口管制
将限定数据.ByteString作为B导入
导入网络.HTTP
导入网络套接字
导入Network.URI
main=do

lsock我不能直接回答这个问题,但是你可以找到一些有用的例子。