如何在Servant中删除“服务器”标头?

时间:2019-06-15 06:18:23

标签: haskell servant

我正在使用服务方库。我尝试修改某些博客文章中的方法,但是在删除“服务器”标头的情况下它什么也没做。 (仅适用于添加自定义标头。)

removeServerHeaderMiddleware :: Middleware
removeServerHeaderMiddleware baseApp = \req responseFunc -> baseApp req (newResponseFunc responseFunc)
  where
    newResponseFunc :: (Response -> IO ResponseReceived) -> Response -> IO ResponseReceived
    newResponseFunc responseFunc = removeServerHeader >>> responseFunc
    removeServerHeader :: Response -> Response
    removeServerHeader r = trace (show $ responseHeaders r) $ mapResponseHeaders (filter (\(k, _) -> k /= "Server")) r

app1 :: Application
app1 = serve imageAPI1 server1

main :: IO ()
main = do
  let port = 8080
  putStrLn $ "Starting server on port " <> show port <> "."
  run port $ removeServerHeaderMiddleware app1

响应:

$ http :8080/images
HTTP/1.1 200 OK
Content-Type: application/json;charset=utf-8
Date: Sat, 15 Jun 2019 06:12:58 GMT
Server: Warp/3.2.27
Transfer-Encoding: chunked

看着痕迹,也许标题会在以后添加?

[("Content-Type","application/json;charset=utf-8")]

我在经线中发现了setServerName,但是我不知道如何将它与仆人合并。

1 个答案:

答案 0 :(得分:3)

setServerName的文档说明:

  

如果应用程序未设置默认服务器名称,则将其作为“服务器:”标头发送。如果设置了空字符串,则不会发送“ Server:”头。即使应用程序设置了一个也是如此。

来自http://hackage.haskell.org/package/warp-3.2.27/docs/Network-Wai-Handler-Warp.html

因此要禁用服务器标头setServerName(带有空字符串)。

要使用此选项,请用

替换run port
runSettings (setPort port (setServerName "" defaultSettings))