Skip to content

Commit 9526ef0

Browse files
committed
Implement Disconnect
1 parent 42695dd commit 9526ef0

File tree

2 files changed

+108
-43
lines changed

2 files changed

+108
-43
lines changed

client.go

+28-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import (
1111
)
1212

1313
var (
14-
ErrFailedToConnect = errors.New("Failed to connect")
15-
ErrNoLocationHeader = errors.New("No location header in the response")
14+
ErrFailedToConnect = errors.New("Failed to connect")
15+
ErrNoLocationHeader = errors.New("No location header in the response")
16+
ErrFailedToDisconnect = errors.New("Failed to remove server resource")
1617
)
1718

1819
type Client struct {
@@ -87,6 +88,7 @@ func (client *Client) Connect() error {
8788
if err != nil {
8889
return err
8990
}
91+
defer resp.Body.Close()
9092

9193
body, err := io.ReadAll(resp.Body)
9294
if err != nil {
@@ -109,6 +111,29 @@ func (client *Client) Connect() error {
109111
return nil
110112
}
111113

112-
func (client *Client) Disconnect() {
114+
func (client *Client) Disconnect() error {
115+
err := client.Pc.Close()
116+
if err != nil {
117+
// What should we do when Close returns an error?
118+
// Should this ever happen?
119+
return err
120+
}
121+
122+
req, err := http.NewRequest("DELETE", client.location, nil)
123+
if err != nil {
124+
return ErrFailedToDisconnect
125+
}
113126

127+
httpClient := &http.Client{}
128+
resp, err := httpClient.Do(req)
129+
if err != nil {
130+
return ErrFailedToDisconnect
131+
}
132+
defer resp.Body.Close()
133+
134+
if resp.StatusCode != 200 {
135+
return ErrFailedToDisconnect
136+
}
137+
138+
return nil
114139
}

client_test.go

+80-40
Original file line numberDiff line numberDiff line change
@@ -19,61 +19,101 @@ func TestNew(t *testing.T) {
1919
}
2020

2121
func TestConnect(t *testing.T) {
22-
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
23-
if r.Method != "POST" {
24-
panic(fmt.Sprintf("Invalid request method. Expected POST, got: %s\n", r.Method))
25-
}
22+
ts := newWHEPMockServer()
23+
defer ts.Close()
2624

27-
contentType := r.Header.Get("Content-Type")
28-
if contentType != "application/SDP" {
29-
panic(fmt.Sprintf("Content-Type has to be application/SDP, got: %s\n", contentType))
30-
}
25+
client, err := New(ts.URL, webrtc.Configuration{})
26+
if err != nil {
27+
t.Fatal(err)
28+
}
3129

32-
body, err := io.ReadAll(r.Body)
33-
if err != nil {
34-
panic(err)
35-
}
30+
err = client.Connect()
31+
if err != nil {
32+
t.Fatal(err)
33+
}
34+
}
3635

37-
resourceId := generateResourceId(8)
38-
pc, err := webrtc.NewPeerConnection(webrtc.Configuration{})
39-
if err != nil {
40-
panic(err)
41-
}
36+
func TestDisconnect(t *testing.T) {
37+
ts := newWHEPMockServer()
38+
defer ts.Close()
4239

43-
err = pc.SetRemoteDescription(webrtc.SessionDescription{Type: webrtc.SDPTypeOffer, SDP: string(body)})
44-
if err != nil {
45-
panic(err)
46-
}
40+
client, err := New(ts.URL, webrtc.Configuration{})
41+
if err != nil {
42+
t.Fatal(err)
43+
}
4744

48-
answer, err := pc.CreateAnswer(nil)
49-
if err != nil {
50-
panic(err)
51-
}
45+
err = client.Connect()
46+
if err != nil {
47+
t.Fatal(err)
48+
}
5249

53-
w.Header().Add("location", "http://"+r.Host+"/resource/"+resourceId)
54-
w.Header().Add("Content-Type", "application/SDP")
55-
w.Header().Add("Status Code", "201")
56-
w.WriteHeader(http.StatusCreated)
57-
sent, err := w.Write([]byte(answer.SDP))
58-
if err != nil {
59-
panic(err)
60-
}
50+
err = client.Disconnect()
51+
if err != nil {
52+
t.Fatal(err)
53+
}
54+
}
6155

62-
if sent != len(answer.SDP) {
63-
panic(fmt.Sprintf("Could not write entire answer in response. Answer length: %v, wrote: %v", len(answer.SDP), sent))
56+
func newWHEPMockServer() *httptest.Server {
57+
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
58+
if r.Method == "POST" {
59+
handleSDPOfferRequest(w, r)
60+
} else if r.Method == "DELETE" {
61+
handleTerminateRequest(w, r)
6462
}
6563
}))
66-
defer ts.Close()
64+
}
6765

68-
client, err := New(ts.URL, webrtc.Configuration{})
66+
func handleSDPOfferRequest(w http.ResponseWriter, r *http.Request) {
67+
if r.Method != "POST" {
68+
panic(fmt.Sprintf("SDP offer has to be a POST request, got: %s\n", r.Method))
69+
}
70+
71+
contentType := r.Header.Get("Content-Type")
72+
if contentType != "application/SDP" {
73+
panic(fmt.Sprintf("Content-Type has to be application/SDP, got: %s\n", contentType))
74+
}
75+
76+
body, err := io.ReadAll(r.Body)
6977
if err != nil {
70-
t.Fatal(err)
78+
panic(err)
7179
}
7280

73-
err = client.Connect()
81+
resourceId := generateResourceId(8)
82+
pc, err := webrtc.NewPeerConnection(webrtc.Configuration{})
7483
if err != nil {
75-
t.Fatal(err)
84+
panic(err)
7685
}
86+
87+
err = pc.SetRemoteDescription(webrtc.SessionDescription{Type: webrtc.SDPTypeOffer, SDP: string(body)})
88+
if err != nil {
89+
panic(err)
90+
}
91+
92+
answer, err := pc.CreateAnswer(nil)
93+
if err != nil {
94+
panic(err)
95+
}
96+
97+
w.Header().Add("location", "http://"+r.Host+"/resource/"+resourceId)
98+
w.Header().Add("Content-Type", "application/SDP")
99+
w.Header().Add("Status Code", "201")
100+
w.WriteHeader(http.StatusCreated)
101+
sent, err := w.Write([]byte(answer.SDP))
102+
if err != nil {
103+
panic(err)
104+
}
105+
106+
if sent != len(answer.SDP) {
107+
panic(fmt.Sprintf("Could not write entire answer in response. Answer length: %v, wrote: %v", len(answer.SDP), sent))
108+
}
109+
}
110+
111+
func handleTerminateRequest(w http.ResponseWriter, r *http.Request) {
112+
if r.Method != "DELETE" {
113+
panic(fmt.Sprintf("Terminate session has to be a DELETE request, got: %s\n", r.Method))
114+
}
115+
116+
w.WriteHeader(http.StatusOK)
77117
}
78118

79119
func generateResourceId(n int) string {

0 commit comments

Comments
 (0)