2014-03-24 13 views
5

Bei der Ausführung einer warp-Anwendung mit run werden alle IP-Adressen abgefragt.Anhören auf einem bestimmten Host mit Warp

Aus Sicherheitsgründen möchte ich nur auf localhost hören, Remote-Zugriff mit einem Reverse-Proxy behandeln.

Wie muss ich run anrufen, um nur auf einem bestimmten Host/IP zu hören?

Hinweis: Diese Frage zeigt absichtlich keine Forschungsanstrengungen, da sie Q & A-Style beantwortet wurde.

Antwort

6

Die derzeit akzeptierte Antwort wurde durch Änderungen an Conduit und/oder Warp unterbrochen. Warp exportiert keinen Host Konstruktor mehr. Aber Sie brauchen es nicht, weil der Typ HostPreference die Erweiterung OverloadedStrings unterstützt, so dass Sie einfach eine Zeichenfolge direkt verwenden können.

In diesem Beispiel werden auch die Verwarnungswarnungen durch Umschalten auf setPort und setHost beseitigt.

{-# 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!" 
+1

Danke für die Aktualisierung auf die neueste API! Ich habe meinen eigenen Code vor langer Zeit aktualisiert, aber vergessen, meine Antwort entsprechend zu aktualisieren. Ich werde deine Antwort als akzeptiert markieren! –

2

run selbst kann das nicht tun. Sie müssen runSettings verwenden:

Der Settings Parameter, den Sie übergeben möchten, enthält die Informationen über die Hosts, die er überwacht.

Der relevante Typ hier ist HostPreference. Obwohl Sie verschiedene Platzhalter angeben können, z. B. IPv6Only, verwenden Sie hier den Konstruktor Host.

Basierend auf this answer, werde ich ein minimales Beispiel zeigen, nur auf localhost zu hören.

Beachten Sie, dass Accessoren wie settingsHost als veraltet markiert sind, aber die offizielle Dokumentation für Warp 2.1.2.1 zeigt noch ein Beispiel mit settingsTimeouthere.

{-# 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!" 
+0

Bitte erklären Sie den Downvote, nur durch das Abstimmen wird dies die Post nicht besser machen! –

+0

Soweit ich das beurteilen kann, exportiert 'Network.Wai.Handler.Warp' den' Host'-Konstruktor nicht, zumindest nicht mehr. – Ed4