Commit ff7cc926 authored by David Fifield's avatar David Fifield
Browse files

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.
parent ac8669b3
Loading
Loading
Loading
Loading

server/http.go

0 → 100644
+67 −0
Original line number Diff line number Diff line
// 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)
}
+15 −0
Original line number Diff line number Diff line
@@ -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:
+1 −1
Original line number Diff line number Diff line
@@ -5,4 +5,4 @@ SocksPort 0
ExitPolicy reject *:*
DataDirectory datadir

ServerTransportPlugin snowflake exec ./server
ServerTransportPlugin snowflake exec ./server -http 127.0.0.1:8080