Как удалить заголовок «Сервер» в Servant? - PullRequest
1 голос
/ 15 июня 2019

Я использую библиотеку слуг. Я попытался изменить подход из некоторого сообщения в блоге, но он ничего не делает в случае удаления заголовка «Сервер». (Работает только для добавления пользовательских заголовков.)

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 Ответ

3 голосов
/ 15 июня 2019

Документация для setServerName гласит:

Имя сервера по умолчанию для отправки в качестве заголовка «Server:», если приложение не устанавливает его.Если задана пустая строка, заголовок «Server:» не отправляется.Это верно, даже если приложение установило единицу.

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

Таким образом, чтобы отключить заголовок Сервера один setServerName с пустой строкой.

Чтобы использовать это заменяет run port на

runSettings (setPort port (setServerName "" defaultSettings))
...