use dispatch 0.9.5 behind proxy?

2019-04-07 14:29发布

问题:

I'm trying to execute (in IntelliJ IDE or from sbt command-line) this very basic dispatch snippet from behind a proxy :

import dispatch._
val svc = url("http://api.hostip.info/country.php")
val country = Http(svc > as.String)
println(country())

and all I can get is an exception :

java.net.ConnectException: Connection timed out: no further information to
    http://api.hostip.info/country.php java.util.concurrent.ExecutionException:
       java.net.ConnectException: Connection timed out: no further information 
            to http://api.hostip.info/country.php

I tried with no conclusive result to set the usual vm parameters : -Dhttp.proxyHost=_my_proxy_host_ -Dhttp.proxyPort=80 and still got the same exception.

On the other hand, the following snippet does work well :

import dispatch._
val svc = url("http://api.hostip.info/country.php") setProxyServer(new com.ning.http.client.ProxyServer(myproxyhost,80))
val country = Http(svc > as.String)
println(country())

Since it does not seem quite aesthetic nor scala-ish, I wonder if it is really what I am supposed to do in such a case.

Any help would be welcome, thanks in advance.

回答1:

http.proxyHost and http.proxyPort will be used if you set this parameter:

-Dcom.ning.http.client.AsyncHttpClientConfig.useProxyProperties=true

Additionaly there are parameters:

-Dcom.ning.http.client.AsyncHttpClientConfig.proxy.user=user
-Dcom.ning.http.client.AsyncHttpClientConfig.proxy.password=password
-Dcom.ning.http.client.AsyncHttpClientConfig.proxy.protocol=NTLM


回答2:

Looks like my question wasn't very inspiring.

I did a little exercie in the pimp my library style :

package dispatch

package object ext {
    import com.ning.http.client.ProxyServer

  class DefaultPoxyVerbs(override val subject: Req) extends  ProxyVerbs

  object NoProxy extends ProxyServer("",0)

  object Proxy {
    def apply(host: String,port: Int) = new ProxyServer(host,port)
  }

  trait ProxyVerbs extends RequestVerbs {

    def through(proxy : ProxyServer) =
      if (NoProxy == proxy) subject else subject.setProxyServer(proxy)

    def ||>(proxy : ProxyServer) = through(proxy)

  }

  implicit def implyProxyVerbs(builder: Req) =
    new DefaultPoxyVerbs(builder)
}

Now I can write :

  import dispatch._
  import dispatch.ext._

  val svc = url("http://api.hostip.info/country.php") through Proxy("blah blah blah",80)

  val country = Http(svc > as.String)
  println(country())

which is a little bit more eye pleasing and coherent regarding dispatch api style.

While it was an interesting exercise, I still don't know by now if i was originally using the api the way I was supposed to nor why setting http.proxyHost and http.proxyPort properties didn't work since it seems to work for others.