Прослушивание на конкретном хосте с использованием деформации

При запуске приложения warp с использованием run прослушивает все IP-адреса.

Из соображений безопасности я хочу прослушивать только localhost, обрабатывая удаленный доступ с использованием обратного прокси-сервера.

Как мне вызвать run, чтобы прослушивать только определенный хост/IP-адрес?

Примечание. Этот вопрос намеренно не показывает никаких исследований, поскольку на него был дан ответ в стиле вопросов и ответов.


person Uli Köhler    schedule 24.03.2014    source источник


Ответы (2)


Принятый в настоящее время ответ был нарушен из-за изменений в канале и / или деформации. Warp больше не экспортирует конструктор Host. Но вам это не нужно, потому что тип HostPreference поддерживает расширение OverloadedStrings, так что вы можете просто использовать строку напрямую.

В этом примере также устраняются предупреждения об устаревании путем переключения на setPort и setHost.

{-# LANGUAGE OverloadedStrings #-}

import Network.Wai (responseLBS)
import Network.Wai.Handler.Warp
import Network.HTTP.Types (status200)
import Network.HTTP.Types.Header (hContentType)

main = do
    let port = 3000
    putStrLn $ "Listening on port " ++ show port
    let settings = setPort port $ setHost "127.0.0.1" defaultSettings
    runSettings settings app

app req = return $
    responseLBS status200 [(hContentType, "text/plain")] "Hello world!"
person Ed4    schedule 05.05.2014
comment
Спасибо за обновление до последней версии API! На самом деле я давно обновил свой собственный код, но забыл соответствующим образом обновить свой ответ. Я отмечу ваш ответ как принятый! - person Uli Köhler; 06.05.2014
comment
Вы также можете использовать fromString. Странно, read не работает. - person CMCDragonkai; 10.03.2020

run сам не может этого сделать. вам нужно использовать runSettings:

Settings параметр, который вы хотите передать, содержит информацию о хостах, которые он прослушивает.

Соответствующий тип здесь: HostPreference. Хотя он позволяет указывать различные подстановочные знаки, включая IPv6Only, здесь мы будем использовать конструктор Host.

Основываясь на этом ответе, я покажу минимальный пример для прослушивания только на локальном хосте.

Обратите внимание, что такие методы доступа, как settingsHost, помечены как устаревшие, но официальная документация для warp 2.1.2.1 по-прежнему показывает пример использования settingsTimeout здесь.

{-# LANGUAGE OverloadedStrings #-}

import Network.Wai (responseLBS)
import Network.Wai.Handler.Warp
import Network.HTTP.Types (status200)
import Network.HTTP.Types.Header (hContentType)

main = do
    let port = 3000
    putStrLn $ "Listening on port " ++ show port
    let settings = defaultSettings { settingsPort = port,
                                     settingsHost = Host "127.0.0.1" }
    runSettings settings app

app req = return $
    responseLBS status200 [(hContentType, "text/plain")] "Hello world!" 
person Uli Köhler    schedule 24.03.2014
comment
Пожалуйста, объясните отрицательный голос, просто отрицательный голос не сделает пост лучше! - person Uli Köhler; 25.03.2014
comment
Насколько я могу судить, Network.Wai.Handler.Warp не экспортирует конструктор Host, по крайней мере, больше. - person Ed4; 05.05.2014