Слушай на конкретном хосте используя warp

При запуске приложения деформации с помощью run Слушает на всех IP-адресах.

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

Как мне нужно позвонить run слушать только на определенном хосте /IP?

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

2 ответа

Решение

В настоящее время принятый ответ был нарушен из-за изменений в канале и / или деформации. Деформация больше не экспортирует 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!"

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

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

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

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

Обратите внимание, что аксессоры любят settingsHost помечены как устаревшие, но официальная документация для деформации 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!" 
Другие вопросы по тегам