Network.HTTP.Proxy有一个很好的函数fetchProxy
fetchProxy :: Bool -> IO ProxyfetchProxy flg获取本地代理设置,并将字符串解析为代理值。如果您希望了解格式不正确的代理配置字符串,请为flg提供True。代理设置来自HTTP_PROXY环境变量.
我希望通过从Proxy导入Wreq库来使用以这种方式获得的Wreq库,该库具有自己的Proxy 定义如下:
import Network.HTTP.Client.Internal (Proxy(..), Response)在Network.HTTP.Proxy.Proxy和Network.Wreq.Proxy之间似乎存在一种类型不匹配,我认为它们必须是相同的。
我是这样进口的:
import Network.Wreq
import Network.HTTP.Proxy (fetchProxy)我如何在Wreq中使用HTTP.Proxy.Proxy,为什么GHC将它们视为不同的类型?
发布于 2016-04-18 23:25:04
Wreq作者可能只是不知道其他的Proxy,因为他们似乎在存储同等的信息。但是,让他们彼此交谈是很棘手的,因为fetchProxy将主机:端口存储为字符串,而Wreq的Proxy需要单独的主机和端口。您必须执行一些URI解析:
import Control.Lens
import Data.Text.Strict.Lens
import Network.HTTP.Proxy
import Network.Wreq
import URI.ByteString
main :: IO ()
main = do
Network.HTTP.Proxy.Proxy host _ <- fetchProxy True
case parseURI strictURIParserOptions (host ^. packed . re utf8) of
Left e -> do
putStrLn "uh oh"
print e
Right uri ->
case ( uri ^? uriAuthorityL . _Just . authorityHostL . hostBSL
, uri ^? uriAuthorityL . _Just . authorityPortL . _Just . portNumberL) of
(Just host_, Just port_) -> do
let opts = defaults & proxy ?~ httpProxy host_ port_
response <- getWith opts "http://example.com"
print response
_ ->
putStrLn "uh oh"我在这里使用lens来完成打包/解压缩字符串、编码UTF8和与uri-bytestring包对话以获得URI解析的繁琐部分。但是总的思想是,Haskell中的数据类型可以简单地通过构造函数上的模式匹配进行切片和切分;一旦提取,这里的host:string就会向下插入到httpProxy调用中,该调用返回Wreq的Proxy类型。通过对构造函数(Newtork.HTTP.Proxy.Proxy)的名称进行限定,我已经让编译器知道我想要哪个模块的名称。
手动解析来自环境变量的代理信息也不会太困难,而且可能会减少启动代码。您甚至可以为主机和端口设置一个单独的环境变量,这将避免URI解析的需要。URI具有极大的低熵,因此它们是存储配置信息的糟糕格式。
https://stackoverflow.com/questions/36705065
复制相似问题