Merge commit '227425b90e9a671118026689dd30967e127a1090' as 'external/toxcore/c-toxcore'
This commit is contained in:
17
external/toxcore/c-toxcore/other/proxy/BUILD.bazel
vendored
Normal file
17
external/toxcore/c-toxcore/other/proxy/BUILD.bazel
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
|
||||
|
||||
package(features = ["layering_check"])
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["proxy_server.go"],
|
||||
importpath = "github.com/TokTok/c-toxcore/other/proxy",
|
||||
visibility = ["//visibility:private"],
|
||||
deps = ["@com_github_things_go_go_socks5//:go_default_library"],
|
||||
)
|
||||
|
||||
go_binary(
|
||||
name = "proxy",
|
||||
embed = [":go_default_library"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
5
external/toxcore/c-toxcore/other/proxy/go.mod
vendored
Normal file
5
external/toxcore/c-toxcore/other/proxy/go.mod
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
module github.com/TokTok/c-toxcore/other/proxy
|
||||
|
||||
go 1.16
|
||||
|
||||
require github.com/things-go/go-socks5 v0.0.2
|
14
external/toxcore/c-toxcore/other/proxy/go.sum
vendored
Normal file
14
external/toxcore/c-toxcore/other/proxy/go.sum
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/things-go/go-socks5 v0.0.2 h1:dFi5iZ/LqgHRTQ6n3XlipTLDWHAQsejvJ300bH2VFWo=
|
||||
github.com/things-go/go-socks5 v0.0.2/go.mod h1:dhnDTBbIg31cbJdROP4/Zz6Iw7JPEpiMvOl2LdHSSjE=
|
||||
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
85
external/toxcore/c-toxcore/other/proxy/proxy_server.go
vendored
Normal file
85
external/toxcore/c-toxcore/other/proxy/proxy_server.go
vendored
Normal file
@ -0,0 +1,85 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"encoding/hex"
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/things-go/go-socks5"
|
||||
)
|
||||
|
||||
const (
|
||||
debug = false
|
||||
httpAddr = ":8080"
|
||||
socks5Addr = ":8081"
|
||||
)
|
||||
|
||||
func handleTunneling(w http.ResponseWriter, r *http.Request) {
|
||||
log.Printf("opening tunnel to %q", r.Host)
|
||||
destConn, err := net.DialTimeout("tcp", r.Host, 10*time.Second)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusServiceUnavailable)
|
||||
return
|
||||
}
|
||||
log.Printf("responding OK")
|
||||
w.WriteHeader(http.StatusOK)
|
||||
hijacker, ok := w.(http.Hijacker)
|
||||
if !ok {
|
||||
http.Error(w, "Hijacking not supported", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
log.Printf("hijacking HTTP connection")
|
||||
clientConn, _, err := hijacker.Hijack()
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusServiceUnavailable)
|
||||
}
|
||||
log.Printf("starting data transfer")
|
||||
go transfer(">", destConn, clientConn)
|
||||
go transfer("<", clientConn, destConn)
|
||||
}
|
||||
|
||||
func transfer(direction string, destination io.WriteCloser, source io.ReadCloser) {
|
||||
defer destination.Close()
|
||||
defer source.Close()
|
||||
var buf [2048]byte
|
||||
for {
|
||||
n, err := source.Read(buf[:])
|
||||
if err != nil {
|
||||
log.Printf("error: %s", err)
|
||||
break
|
||||
}
|
||||
if debug {
|
||||
log.Printf("%s %02x", direction, hex.EncodeToString(buf[:n]))
|
||||
}
|
||||
destination.Write(buf[:n])
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
log.Printf("starting HTTP proxy server on %s", httpAddr)
|
||||
httpServer := &http.Server{
|
||||
Addr: httpAddr,
|
||||
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method == http.MethodConnect {
|
||||
handleTunneling(w, r)
|
||||
} else {
|
||||
panic("invalid method, only CONNECT is allowed")
|
||||
}
|
||||
}),
|
||||
// Disable HTTP/2.
|
||||
TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)),
|
||||
}
|
||||
|
||||
log.Printf("starting SOCKS5 proxy server on %s", socks5Addr)
|
||||
socks5Server := socks5.NewServer(
|
||||
socks5.WithLogger(socks5.NewLogger(log.New(os.Stdout, "socks5: ", log.LstdFlags))),
|
||||
)
|
||||
|
||||
go socks5Server.ListenAndServe("tcp", socks5Addr)
|
||||
log.Fatal(httpServer.ListenAndServe())
|
||||
}
|
Reference in New Issue
Block a user