gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:07:33 27 4
gpt4 key购买 nike

模块Network.HTTP公开函数 receiveHTTPrespondHTTP 我想将其用于非常基本的 Web 服务器。我写了一个只等待客户的 stub :

{-# 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,现在我不知道如何使用 handlereceiveHTTP.

我找到了 an example与谷歌,但它是从 2008 年开始的,不再工作了。而且我无法移植它。

有什么想法吗?

最佳答案

你可以这样做,但我真的认为你不应该这样做。 HTTP 可以充当服务器,但设计用于客户端。我用 Google 搜索了一下,但找不到任何实际使用 respondHTTP 的示例。如果您在 2016 年使用客户端 HTTP,请使用 http-conduit .在服务器端,warp或者依赖于它的东西可能就是你想要的。

不过,这是代码。

#!/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

上面使用了 Stack 对 shebang 脚本的支持。 chmod +x 或使用 stack foo.hs 运行它。

Network 模块已弃用。如果您需要套接字 API,请始终使用 Network.Socket。对于更高级别的内容,请使用 connection .

您执行正常的 POSIX 套接字操作,然后使用 socketConnection 将连接的套接字转换为 HandleStream 并运行 respondHTTPreceiveHTTP 就可以了。 socketConnection 是一个奇怪的函数。前两个参数是主机名和端口,AFAICT 在运行服务器时不使用它们。

我使用了 RecordWildCards 扩展。它让我可以在模式中编写 Right (Request {..}) 并在右侧范围内包含记录的所有字段。

关于http - 如何使用 Network.HTTP.receiveHTTP 在 Haskell 中编写一个简单的 HTTP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6157256/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com