mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-13 20:11:19 -04:00
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.
This commit is contained in:
parent
ac8669b38f
commit
ff7cc926f7
3 changed files with 83 additions and 1 deletions
67
server/http.go
Normal file
67
server/http.go
Normal file
|
@ -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)
|
||||
}
|
|
@ -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:
|
||||
|
|
|
@ -5,4 +5,4 @@ SocksPort 0
|
|||
ExitPolicy reject *:*
|
||||
DataDirectory datadir
|
||||
|
||||
ServerTransportPlugin snowflake exec ./server
|
||||
ServerTransportPlugin snowflake exec ./server -http 127.0.0.1:8080
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue