mirror of
https://github.com/SagerNet/sing-box.git
synced 2026-04-13 20:28:32 +10:00
Cover direct cloudflare origin services
This commit is contained in:
120
protocol/cloudflare/direct_origin_test.go
Normal file
120
protocol/cloudflare/direct_origin_test.go
Normal file
@@ -0,0 +1,120 @@
|
||||
//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)
|
||||
}
|
||||
Reference in New Issue
Block a user