首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Network.Wreq.Proxy到Network.HTTP.Proxy.Proxy

从Network.Wreq.Proxy到Network.HTTP.Proxy.Proxy
EN

Stack Overflow用户
提问于 2016-04-18 22:02:13
回答 1查看 83关注 0票数 0

Network.HTTP.Proxy有一个很好的函数fetchProxy

代码语言:javascript
复制
fetchProxy :: Bool -> IO Proxy

fetchProxy flg获取本地代理设置,并将字符串解析为代理值。如果您希望了解格式不正确的代理配置字符串,请为flg提供True。代理设置来自HTTP_PROXY环境变量.

我希望通过从Proxy导入Wreq库来使用以这种方式获得的Wreq库,该库具有自己的Proxy 定义如下

代码语言:javascript
复制
import Network.HTTP.Client.Internal (Proxy(..), Response)

Network.HTTP.Proxy.ProxyNetwork.Wreq.Proxy之间似乎存在一种类型不匹配,我认为它们必须是相同的。

我是这样进口的:

代码语言:javascript
复制
import           Network.Wreq
import           Network.HTTP.Proxy (fetchProxy)

我如何在Wreq中使用HTTP.Proxy.Proxy,为什么GHC将它们视为不同的类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-18 23:25:04

Wreq作者可能只是不知道其他的Proxy,因为他们似乎在存储同等的信息。但是,让他们彼此交谈是很棘手的,因为fetchProxy将主机:端口存储为字符串,而Wreq的Proxy需要单独的主机和端口。您必须执行一些URI解析:

代码语言:javascript
复制
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具有极大的低熵,因此它们是存储配置信息的糟糕格式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36705065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档