[tor-commits] [snowflake/master] Add an HTTP signaling receiver in the server.

dcf at torproject.org dcf at torproject.org
Tue Jan 19 06:36:43 UTC 2016


commit ff7cc926f76913cdf1e061b78282499b0553bd25
Author: David Fifield <david at bamsoftware.com>
Date:   Mon Jan 18 21:24:18 2016 -0800

    Add an HTTP signaling receiver in the server.
    
    This is a stand-in for some kind of faciliator that is separate from the
    server transport plugin.
---
 server/http.go      |   67 +++++++++++++++++++++++++++++++++++++++++++++++++++
 server/snowflake.go |   15 ++++++++++++
 server/torrc        |    2 +-
 3 files changed, 83 insertions(+), 1 deletion(-)

diff --git a/server/http.go b/server/http.go
new file mode 100644
index 0000000..99e03d0
--- /dev/null
+++ b/server/http.go
@@ -0,0 +1,67 @@
+// An HTTP-based signaling channel for the WebRTC server. It imitates the
+// facilitator as seen by clients, but it doesn't connect them to an
+// intermediate WebRTC proxy, rather connects them directly to this WebRTC
+// server. This code should be deleted when we have proxies in place.
+
+package main
+
+import (
+	"fmt"
+	"io/ioutil"
+	"log"
+	"net/http"
+
+	"github.com/keroserene/go-webrtc"
+)
+
+type httpHandler struct {
+	config *webrtc.Configuration
+}
+
+func (h *httpHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+	switch req.Method {
+	case "GET":
+		w.Header().Set("Content-Type", "text/plain; charset=utf-8")
+		w.WriteHeader(http.StatusOK)
+		w.Write([]byte(`HTTP signaling channel
+
+Send a POST request containing an SDP offer. The response will
+contain an SDP answer.
+`))
+		return
+	case "POST":
+		break
+	default:
+		http.Error(w, "Bad request.", http.StatusBadRequest)
+		return
+	}
+
+	// POST handling begins here.
+	body, err := ioutil.ReadAll(http.MaxBytesReader(w, req.Body, 100000))
+	if err != nil {
+		http.Error(w, "Bad request.", http.StatusBadRequest)
+		return
+	}
+	offer := webrtc.DeserializeSessionDescription(string(body))
+	if offer == nil {
+		http.Error(w, "Bad request.", http.StatusBadRequest)
+		return
+	}
+
+	pc, err := makePeerConnectionFromOffer(offer, h.config)
+	if err != nil {
+		http.Error(w, fmt.Sprintf("Cannot create offer: %s", err), http.StatusInternalServerError)
+		return
+	}
+
+	log.Println("answering HTTP POST")
+
+	w.WriteHeader(http.StatusOK)
+	w.Write([]byte(pc.LocalDescription().Serialize()))
+}
+
+func receiveSignalsHTTP(addr string, config *webrtc.Configuration) error {
+	http.Handle("/", &httpHandler{config})
+	log.Printf("listening HTTP on %s", addr)
+	return http.ListenAndServe(addr, nil)
+}
diff --git a/server/snowflake.go b/server/snowflake.go
index 88a07d8..88eecca 100644
--- a/server/snowflake.go
+++ b/server/snowflake.go
@@ -2,6 +2,7 @@ package main
 
 import (
 	"bufio"
+	"flag"
 	"fmt"
 	"io"
 	"log"
@@ -214,6 +215,10 @@ func receiveSignalsFIFO(filename string, config *webrtc.Configuration) error {
 
 func main() {
 	var err error
+	var httpAddr string
+
+	flag.StringVar(&httpAddr, "http", "", "listen for HTTP signaling")
+	flag.Parse()
 
 	logFile, err = os.OpenFile("snowflake.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
 	if err != nil {
@@ -240,6 +245,16 @@ func main() {
 		}
 	}()
 
+	// Start HTTP-based signaling receiver.
+	if httpAddr != "" {
+		go func() {
+			err := receiveSignalsHTTP(httpAddr, webRTCConfig)
+			if err != nil {
+				log.Printf("receiveSignalsHTTP: %s", err)
+			}
+		}()
+	}
+
 	for _, bindaddr := range ptInfo.Bindaddrs {
 		switch bindaddr.MethodName {
 		case ptMethodName:
diff --git a/server/torrc b/server/torrc
index 44b5964..db54242 100644
--- a/server/torrc
+++ b/server/torrc
@@ -5,4 +5,4 @@ SocksPort 0
 ExitPolicy reject *:*
 DataDirectory datadir
 
-ServerTransportPlugin snowflake exec ./server
+ServerTransportPlugin snowflake exec ./server -http 127.0.0.1:8080



More information about the tor-commits mailing list