67 lines
2.3 KiB
Go
67 lines
2.3 KiB
Go
package tests
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.openprivacy.ca/openprivacy/bine/tor"
|
|
"git.openprivacy.ca/openprivacy/bine/torutil"
|
|
)
|
|
|
|
func TestListenSimpleHTTPV2(t *testing.T) {
|
|
ctx := GlobalEnabledNetworkContext(t)
|
|
// Create an onion service to listen on random port but show as 80
|
|
conf := &tor.ListenConf{RemotePorts: []int{80}}
|
|
client, server, onion := startHTTPServer(ctx, conf, "/test", func(w http.ResponseWriter, r *http.Request) {
|
|
_, err := w.Write([]byte("Test Content"))
|
|
ctx.Require.NoError(err)
|
|
})
|
|
// Check the service ID
|
|
ctx.Require.Equal(torutil.OnionServiceIDFromPrivateKey(onion.Key), onion.ID)
|
|
defer server.Shutdown(ctx)
|
|
// Call /test
|
|
byts := httpGet(ctx, client, "http://"+onion.ID+".onion/test")
|
|
ctx.Require.Equal("Test Content", string(byts))
|
|
}
|
|
|
|
func TestListenSimpleHTTPV3(t *testing.T) {
|
|
ctx := GlobalEnabledNetworkContext(t)
|
|
// Create an onion service to listen on random port but show as 80
|
|
conf := &tor.ListenConf{RemotePorts: []int{80}, Version3: true}
|
|
// _, conf.Key, _ = ed25519.GenerateKey(nil)
|
|
client, server, onion := startHTTPServer(ctx, conf, "/test", func(w http.ResponseWriter, r *http.Request) {
|
|
_, err := w.Write([]byte("Test Content"))
|
|
ctx.Require.NoError(err)
|
|
})
|
|
defer server.Shutdown(ctx)
|
|
// Check the service ID
|
|
ctx.Require.Equal(torutil.OnionServiceIDFromPrivateKey(onion.Key), onion.ID)
|
|
// Call /test
|
|
byts := httpGet(ctx, client, "http://"+onion.ID+".onion/test")
|
|
ctx.Require.Equal("Test Content", string(byts))
|
|
}
|
|
|
|
// Only have to shutdown the HTTP server
|
|
func startHTTPServer(
|
|
ctx *TestContext,
|
|
listenConf *tor.ListenConf,
|
|
handlePattern string,
|
|
handler func(http.ResponseWriter, *http.Request),
|
|
) (*http.Client, *http.Server, *tor.OnionService) {
|
|
httpClient := httpClient(ctx, nil)
|
|
// Wait at most a few minutes for the entire test
|
|
listenCtx, listenCancel := context.WithTimeout(context.Background(), 4*time.Minute)
|
|
defer listenCancel()
|
|
// Create an onion service to listen on random port but show as 80
|
|
onion, err := ctx.Listen(listenCtx, listenConf)
|
|
ctx.Require.NoError(err)
|
|
// Make HTTP server
|
|
mux := http.NewServeMux()
|
|
mux.HandleFunc(handlePattern, handler)
|
|
httpServer := &http.Server{Handler: mux}
|
|
go func() { ctx.Require.Equal(http.ErrServerClosed, httpServer.Serve(onion)) }()
|
|
return httpClient, httpServer, onion
|
|
}
|