Golang:Http(s)/ Socks5代理

时间:2016-05-29 14:53:24

标签: go proxy

我想创建一个可以使用socks5(使用tor)和经典代理的代理,然后我的scraper(casperjs)可以通过它发出请求。

我使用http.NewRequest创建了一个代理,这里是简短的代码:

     main(){
        ...        
        // struct to initialise the proxy params
        P = NewProxy(..)
        http.ListenAndServe(":9999", P)
        ... 
    }

   func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        ...
            req, err := http.NewRequest("GET", r.URL.String(), nil)
        ...
    }

我需要获取完整的网址才能拨打电话,因为它可以使用http,但对于https我有 www.example.com:443

首先,我使用tcp代理查看:

listener, err := net.Listen("tcp", p.from)

connection, err := listener.Accept()

remote, err := net.Dial("tcp", p.to)

io.Copy(to, from)将数据从客户端复制到远程服务器,反之亦然我的代码受this gist by vmihailenco

的启发

它适用于http和https,因为听取是在TCP couche但是这个方法的问题我不能使用 socks5 http(s)我必须在通话中设置代理的类型

$casperjs --proxy=127.0.0.1:9999 --proxy-type=socks5 bbuy.js

但我需要的是我的代理可以同时发送多个请求,每个请求使用不同的代理。 要做到这一点,我必须修改每个请求的传输

proxyUrl, err := url.Parse("http://proxyIp:proxyPort")
http.DefaultTransport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}

这就是为什么我选择使用http.NewRequest并做到这一点我必须得到完整的网址然后我可以打电话 这个问题现在正如我之前所说的,当我的刮刀试图刮取例如 https://example.com?a=1&b=2 我使用的结果r.URL.String() example.com:443 但是如果它是http网站我得到了完整的网址

解决此问题的任何建议或想法

0 个答案:

没有答案