diff --git a/internal/webrtc/server.go b/internal/webrtc/server.go index f7365afa..c73d67eb 100644 --- a/internal/webrtc/server.go +++ b/internal/webrtc/server.go @@ -1,9 +1,11 @@ package webrtc import ( + "encoding/base64" "encoding/json" "io" "net/http" + "net/url" "strconv" "strings" "time" @@ -62,8 +64,8 @@ func syncHandler(w http.ResponseWriter, r *http.Request) { // 2. application/sdp - receive/response SDP via WebRTC-HTTP Egress Protocol (WHEP) // 3. other - receive/response raw SDP func outputWebRTC(w http.ResponseWriter, r *http.Request) { - url := r.URL.Query().Get("src") - stream := streams.Get(url) + uri := r.URL.Query().Get("src") + stream := streams.Get(uri) if stream == nil { http.Error(w, api.StreamNotFound, http.StatusNotFound) return @@ -87,6 +89,28 @@ func outputWebRTC(w http.ResponseWriter, r *http.Request) { } offer = desc.SDP + case "application/x-www-form-urlencoded": + body, err := io.ReadAll(r.Body) + if err != nil { + log.Error().Err(err).Caller().Send() + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + values, err := url.ParseQuery(string(body)) + if err != nil { + log.Error().Err(err).Caller().Send() + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + encodedOffer := values.Get("data") + decodedOffer, err := base64.StdEncoding.DecodeString(encodedOffer) + if err != nil { + log.Error().Err(err).Caller().Send() + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + offer = string(decodedOffer) + default: body, err := io.ReadAll(r.Body) if err != nil { @@ -124,6 +148,11 @@ func outputWebRTC(w http.ResponseWriter, r *http.Request) { } err = json.NewEncoder(w).Encode(v) + case "application/x-www-form-urlencoded": + w.Header().Set("Content-Type", mediaType) + encodedAnswer := base64.StdEncoding.EncodeToString([]byte(answer)) + _, err = w.Write([]byte(encodedAnswer)) + case MimeSDP: w.Header().Set("Content-Type", mediaType) w.WriteHeader(http.StatusCreated)