mirror of
https://github.com/SagerNet/sing-box.git
synced 2026-04-13 20:28:32 +10:00
121 lines
2.9 KiB
Go
121 lines
2.9 KiB
Go
//go:build with_cloudflare_tunnel
|
|
|
|
package cloudflare
|
|
|
|
import (
|
|
stdTLS "crypto/tls"
|
|
"fmt"
|
|
"io"
|
|
"net"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
boxTLS "github.com/sagernet/sing-box/common/tls"
|
|
)
|
|
|
|
func TestNewDirectOriginTransportUnix(t *testing.T) {
|
|
socketPath := fmt.Sprintf("/tmp/cf-origin-%d.sock", time.Now().UnixNano())
|
|
_ = os.Remove(socketPath)
|
|
t.Cleanup(func() { _ = os.Remove(socketPath) })
|
|
listener, err := net.Listen("unix", socketPath)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer listener.Close()
|
|
|
|
go serveTestHTTPOverListener(listener, func(writer http.ResponseWriter, request *http.Request) {
|
|
writer.WriteHeader(http.StatusOK)
|
|
_, _ = writer.Write([]byte("unix-ok"))
|
|
})
|
|
|
|
inboundInstance := &Inbound{}
|
|
transport, cleanup, err := inboundInstance.newDirectOriginTransport(ResolvedService{
|
|
Kind: ResolvedServiceUnix,
|
|
UnixPath: socketPath,
|
|
BaseURL: &url.URL{
|
|
Scheme: "http",
|
|
Host: "localhost",
|
|
},
|
|
}, "")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer cleanup()
|
|
|
|
client := &http.Client{Transport: transport}
|
|
resp, err := client.Get("http://localhost/")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer resp.Body.Close()
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if string(body) != "unix-ok" {
|
|
t.Fatalf("unexpected response body: %q", string(body))
|
|
}
|
|
}
|
|
|
|
func TestNewDirectOriginTransportUnixTLS(t *testing.T) {
|
|
socketPath := fmt.Sprintf("/tmp/cf-origin-tls-%d.sock", time.Now().UnixNano())
|
|
_ = os.Remove(socketPath)
|
|
t.Cleanup(func() { _ = os.Remove(socketPath) })
|
|
listener, err := net.Listen("unix", socketPath)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
certificate, err := boxTLS.GenerateKeyPair(nil, nil, time.Now, "localhost")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
tlsListener := stdTLS.NewListener(listener, &stdTLS.Config{
|
|
Certificates: []stdTLS.Certificate{*certificate},
|
|
})
|
|
defer tlsListener.Close()
|
|
|
|
go serveTestHTTPOverListener(tlsListener, func(writer http.ResponseWriter, request *http.Request) {
|
|
writer.WriteHeader(http.StatusOK)
|
|
_, _ = writer.Write([]byte("unix-tls-ok"))
|
|
})
|
|
|
|
inboundInstance := &Inbound{}
|
|
transport, cleanup, err := inboundInstance.newDirectOriginTransport(ResolvedService{
|
|
Kind: ResolvedServiceUnixTLS,
|
|
OriginRequest: OriginRequestConfig{
|
|
NoTLSVerify: true,
|
|
},
|
|
UnixPath: socketPath,
|
|
BaseURL: &url.URL{
|
|
Scheme: "https",
|
|
Host: "localhost",
|
|
},
|
|
}, "")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer cleanup()
|
|
|
|
client := &http.Client{Transport: transport}
|
|
resp, err := client.Get("https://localhost/")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer resp.Body.Close()
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if string(body) != "unix-tls-ok" {
|
|
t.Fatalf("unexpected response body: %q", string(body))
|
|
}
|
|
}
|
|
|
|
func serveTestHTTPOverListener(listener net.Listener, handler func(http.ResponseWriter, *http.Request)) {
|
|
server := &http.Server{Handler: http.HandlerFunc(handler)}
|
|
_ = server.Serve(listener)
|
|
}
|