From b8390331afdbad1b7289a853ec44fe2e1183b707 Mon Sep 17 00:00:00 2001 From: klutrem Date: Thu, 6 Mar 2025 16:03:44 +0300 Subject: [PATCH 1/3] feat: x-www-form-urlencoded support --- internal/webrtc/server.go | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) 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) From 22bf8163cdb736b8b2d9f148bbe399af3a51b980 Mon Sep 17 00:00:00 2001 From: klutrem Date: Thu, 6 Mar 2025 16:08:43 +0300 Subject: [PATCH 2/3] returned url variable name --- internal/webrtc/server.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/webrtc/server.go b/internal/webrtc/server.go index c73d67eb..a59548b3 100644 --- a/internal/webrtc/server.go +++ b/internal/webrtc/server.go @@ -5,7 +5,7 @@ import ( "encoding/json" "io" "net/http" - "net/url" + urlParser "net/url" "strconv" "strings" "time" @@ -64,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) { - uri := r.URL.Query().Get("src") - stream := streams.Get(uri) + url := r.URL.Query().Get("src") + stream := streams.Get(url) if stream == nil { http.Error(w, api.StreamNotFound, http.StatusNotFound) return @@ -96,7 +96,7 @@ func outputWebRTC(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } - values, err := url.ParseQuery(string(body)) + values, err := urlParser.ParseQuery(string(body)) if err != nil { log.Error().Err(err).Caller().Send() http.Error(w, err.Error(), http.StatusBadRequest) From ccdb1479f7b2444962f1b798266e73eefac08251 Mon Sep 17 00:00:00 2001 From: Alex X Date: Sun, 9 Mar 2025 17:46:13 +0300 Subject: [PATCH 3/3] Code refactoring for RtspToWeb format support #1632 --- internal/webrtc/server.go | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/internal/webrtc/server.go b/internal/webrtc/server.go index a59548b3..51565a74 100644 --- a/internal/webrtc/server.go +++ b/internal/webrtc/server.go @@ -5,7 +5,6 @@ import ( "encoding/json" "io" "net/http" - urlParser "net/url" "strconv" "strings" "time" @@ -64,8 +63,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) + u := r.URL.Query().Get("src") + stream := streams.Get(u) if stream == nil { http.Error(w, api.StreamNotFound, http.StatusNotFound) return @@ -90,26 +89,19 @@ 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 { + if err := r.ParseForm(); err != nil { log.Error().Err(err).Caller().Send() - http.Error(w, err.Error(), http.StatusInternalServerError) + http.Error(w, err.Error(), http.StatusBadRequest) return } - values, err := urlParser.ParseQuery(string(body)) + offerB64 := r.Form.Get("data") + b, err := base64.StdEncoding.DecodeString(offerB64) 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) + offer = string(b) default: body, err := io.ReadAll(r.Body) @@ -150,8 +142,8 @@ func outputWebRTC(w http.ResponseWriter, r *http.Request) { case "application/x-www-form-urlencoded": w.Header().Set("Content-Type", mediaType) - encodedAnswer := base64.StdEncoding.EncodeToString([]byte(answer)) - _, err = w.Write([]byte(encodedAnswer)) + answerB64 := base64.StdEncoding.EncodeToString([]byte(answer)) + _, err = w.Write([]byte(answerB64)) case MimeSDP: w.Header().Set("Content-Type", mediaType)