get proxy working
This commit is contained in:
		
							
								
								
									
										3
									
								
								TODO.md
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								TODO.md
									
									
									
									
									
								
							@@ -8,6 +8,9 @@
 | 
			
		||||
* Posting to telegram
 | 
			
		||||
* Storage csv
 | 
			
		||||
 | 
			
		||||
## MVP 2
 | 
			
		||||
* Podcasts
 | 
			
		||||
 | 
			
		||||
## 1.0
 | 
			
		||||
* concurrent processing
 | 
			
		||||
    * Telegram rate limit
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								exp/proxy/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								exp/proxy/main.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"log"
 | 
			
		||||
 | 
			
		||||
	"go.balki.me/tss/proxy"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	client, err := proxy.GetClient("socks5://unix/run/tor/socks")
 | 
			
		||||
	res, err := client.Get("https://ip.balki.me")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Panicln(err)
 | 
			
		||||
	}
 | 
			
		||||
	data, err := io.ReadAll(res.Body)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Panicln(err)
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Printf("status: %v, data: %s\n", res.Status, data)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								exp/tor/proxy.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								exp/tor/proxy.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/url"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	//proxyUrl, err := url.Parse("socks5://unix//run/tor/socks")
 | 
			
		||||
	proxyUrl, err := url.Parse("socks5://127.0.0.1:9050/#Foo")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Panicln(err)
 | 
			
		||||
	}
 | 
			
		||||
	log.Println(len(proxyUrl.Path))
 | 
			
		||||
	client := http.Client{
 | 
			
		||||
		Transport: &http.Transport{
 | 
			
		||||
			Proxy: func(*http.Request) (*url.URL, error) { return proxyUrl, nil },
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	// res, err := client.Get("http://hz3ppwwc55ccokb63r4ou7za45c5raodu23absuregtqo5ha3h37gfyd.onion")
 | 
			
		||||
	res, err := client.Get("https://ip.balki.me")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Panicln(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	data, err := io.ReadAll(res.Body)
 | 
			
		||||
	log.Printf("data: %s, status: %s\n", data, res.Status)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							@@ -6,6 +6,7 @@ require (
 | 
			
		||||
	github.com/robfig/cron/v3 v3.0.1
 | 
			
		||||
	github.com/stretchr/testify v1.7.1
 | 
			
		||||
	go.uber.org/zap v1.21.0
 | 
			
		||||
	golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.sum
									
									
									
									
									
								
							@@ -35,6 +35,7 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
 | 
			
		||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										47
									
								
								proxy/proxy.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								proxy/proxy.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
package proxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/url"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/net/proxy"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func GetClient(proxy string) (*http.Client, error) {
 | 
			
		||||
	proxyUrl, err := url.Parse(proxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("failed to parse proxyUrl, url:%s, err: %w", proxy, err)
 | 
			
		||||
	}
 | 
			
		||||
	if proxyUrl.Host == "unix" && proxyUrl.Scheme == "socks5" &&
 | 
			
		||||
		len(proxyUrl.Path) > 1 /* Path cannot be empty or just / */ {
 | 
			
		||||
		return unixSocks5Proxy(proxyUrl.Path)
 | 
			
		||||
	}
 | 
			
		||||
	return proxyHttp(proxyUrl)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func unixSocks5Proxy(path string) (*http.Client, error) {
 | 
			
		||||
	// TODO: Auth?
 | 
			
		||||
	dialer, err := proxy.SOCKS5("unix", path, nil /*auth*/, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("failed to make socks proxy, path: %s, err: %w", path, err)
 | 
			
		||||
	}
 | 
			
		||||
	ctxDialer, ok := dialer.(proxy.ContextDialer)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("proxy.SOCKS5 did not return a ContextDialer") // This should never happen
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &http.Client{
 | 
			
		||||
		Transport: &http.Transport{
 | 
			
		||||
			DialContext: ctxDialer.DialContext,
 | 
			
		||||
		},
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func proxyHttp(proxyUrl *url.URL) (*http.Client, error) {
 | 
			
		||||
	return &http.Client{
 | 
			
		||||
		Transport: &http.Transport{
 | 
			
		||||
			Proxy: http.ProxyURL(proxyUrl),
 | 
			
		||||
		},
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user