9
9
"errors"
10
10
"fmt"
11
11
"io"
12
- "math/rand"
13
12
"net"
14
13
"net/http"
15
14
"net/http/pprof"
@@ -143,19 +142,19 @@ func autoupdateHandler(auth Authenticater, connecter Connecter, history History)
143
142
compress = true
144
143
}
145
144
146
- if r .URL .Query ().Has ("single" ) || position != 0 {
147
- handleSingle (ctx , uid , w , r , position , connecter , builder , history , compress )
148
- return
149
- }
150
-
151
- if r .URL .Query ().Has ("websocket" ) {
145
+ if r .Header .Get ("upgrade" ) != "" {
152
146
if err := sendMessagesWebsocket (ctx , w , r , uid , builder , connecter , compress ); err != nil {
153
147
handleErrorWithoutStatus (w , err )
154
148
return
155
149
}
156
150
return
157
151
}
158
152
153
+ if r .URL .Query ().Has ("single" ) || position != 0 {
154
+ handleSingle (ctx , uid , w , r , position , connecter , builder , history , compress )
155
+ return
156
+ }
157
+
159
158
if err := sendMessages (ctx , w , uid , builder , connecter , compress ); err != nil {
160
159
handleErrorWithoutStatus (w , err )
161
160
return
@@ -353,12 +352,24 @@ func sendMessages(ctx context.Context, w http.ResponseWriter, uid int, kb autoup
353
352
return ctx .Err ()
354
353
}
355
354
356
- func sendMessagesWebsocket (ctx context.Context , w http.ResponseWriter , r * http.Request , uid int , kb autoupdate. KeysBuilder , connecter Connecter , compress bool ) error {
357
- c , err := websocket .Accept (w , r , nil )
355
+ func sendMessagesWebsocket (ctx context.Context , w http.ResponseWriter , r * http.Request , uid int , kb * keysbuilder. Builder , connecter Connecter , compress bool ) error {
356
+ conn , err := websocket .Accept (w , r , nil )
358
357
if err != nil {
359
358
return fmt .Errorf ("accept websocket: %w" , err )
360
359
}
361
- defer c .CloseNow ()
360
+ defer conn .CloseNow ()
361
+
362
+ _ , reader , err := conn .Reader (ctx )
363
+ if err != nil {
364
+ return fmt .Errorf ("reading first message" )
365
+ }
366
+
367
+ newKB , err := keysbuilder .ManyFromJSON (reader )
368
+ if err != nil {
369
+ return fmt .Errorf ("parsing websocket body: %w" , err )
370
+ }
371
+
372
+ kb = keysbuilder .FromBuilders (kb , newKB )
362
373
363
374
next , err := connecter .Connect (ctx , uid , kb )
364
375
if err != nil {
@@ -373,11 +384,7 @@ func sendMessagesWebsocket(ctx context.Context, w http.ResponseWriter, r *http.R
373
384
return fmt .Errorf ("getting next message: %w" , err )
374
385
}
375
386
376
- if err := c .Write (r .Context (), websocket .MessageText , []byte (fmt .Sprintf (`<div id="websocket">Websocket works: %d.</div>` , rand .Intn (1000 )))); err != nil {
377
- return fmt .Errorf ("write data: %w" , err )
378
- }
379
-
380
- wr , err := c .Writer (ctx , websocket .MessageText )
387
+ wr , err := conn .Writer (ctx , websocket .MessageText )
381
388
if err != nil {
382
389
return fmt .Errorf ("create writer: %w" , err )
383
390
}
0 commit comments