13
13
#include " mozilla/dom/ContentParent.h"
14
14
#include " mozilla/dom/InternalResponse.h"
15
15
#include " mozilla/ipc/IPCStreamUtils.h"
16
+ #include " mozilla/net/NeckoParent.h"
17
+ #include " mozilla/net/IPCTransportProvider.h"
16
18
#include " mozilla/ErrorResult.h"
17
19
#include " mozilla/Preferences.h"
18
20
#include " mozilla/unused.h"
21
+ #include " nsCharSeparatedTokenizer.h"
19
22
#include " nsGlobalWindow.h"
20
23
#include " WebSocketChannel.h"
21
24
@@ -295,6 +298,26 @@ FlyWebPublishedServerChild::RecvFetchRequest(const IPCInternalRequest& aRequest,
295
298
return true ;
296
299
}
297
300
301
+ bool
302
+ FlyWebPublishedServerChild::RecvWebSocketRequest (const IPCInternalRequest& aRequest,
303
+ const uint64_t & aRequestId,
304
+ PTransportProviderChild* aProvider)
305
+ {
306
+ LOG_I (" FlyWebPublishedServerChild::RecvWebSocketRequest(%p)" , this );
307
+
308
+ RefPtr<InternalRequest> request = new InternalRequest (aRequest);
309
+ mPendingRequests .Put (request, aRequestId);
310
+
311
+ // Not addreffing here. The addref was already done when the
312
+ // PTransportProvider child constructor original ran.
313
+ mPendingTransportProviders .Put (aRequestId,
314
+ dont_AddRef (static_cast <TransportProviderChild*>(aProvider)));
315
+
316
+ FireWebsocketEvent (request);
317
+
318
+ return true ;
319
+ }
320
+
298
321
void
299
322
FlyWebPublishedServerChild::ActorDestroy (ActorDestroyReason aWhy)
300
323
{
@@ -328,21 +351,70 @@ FlyWebPublishedServerChild::OnFetchResponse(InternalRequest* aRequest,
328
351
}
329
352
330
353
already_AddRefed<nsITransportProvider>
331
- FlyWebPublishedServerChild::OnWebSocketAcceptInternal (InternalRequest* aConnectRequest ,
354
+ FlyWebPublishedServerChild::OnWebSocketAcceptInternal (InternalRequest* aRequest ,
332
355
const Optional<nsAString>& aProtocol,
333
356
ErrorResult& aRv)
334
357
{
335
358
LOG_I (" FlyWebPublishedServerChild::OnWebSocketAcceptInternal(%p)" , this );
336
359
337
- aRv.Throw (NS_ERROR_NOT_IMPLEMENTED);
338
- return nullptr ;
360
+ if (mActorDestroyed ) {
361
+ LOG_I (" FlyWebPublishedServerChild::OnWebSocketAcceptInternal(%p) - No actor!" , this );
362
+ return nullptr ;
363
+ }
364
+
365
+ uint64_t id = mPendingRequests .Get (aRequest);
366
+ MOZ_ASSERT (id);
367
+ mPendingRequests .Remove (aRequest);
368
+
369
+ RefPtr<TransportProviderChild> provider;
370
+ mPendingTransportProviders .Remove (id, getter_AddRefs (provider));
371
+
372
+ nsString protocol;
373
+ if (aProtocol.WasPassed ()) {
374
+ protocol = aProtocol.Value ();
375
+
376
+ nsAutoCString reqProtocols;
377
+ aRequest->Headers ()->
378
+ Get (NS_LITERAL_CSTRING(" Sec-WebSocket-Protocol" ), reqProtocols, aRv);
379
+ if (!ContainsToken (reqProtocols, NS_ConvertUTF16toUTF8(protocol))) {
380
+ // Should throw a better error here
381
+ aRv.Throw (NS_ERROR_FAILURE);
382
+ return nullptr ;
383
+ }
384
+ } else {
385
+ protocol.SetIsVoid (true );
386
+ }
387
+
388
+ Unused << SendWebSocketAccept (protocol, id);
389
+
390
+ return provider.forget ();
339
391
}
340
392
341
393
void
342
- FlyWebPublishedServerChild::OnWebSocketResponse (InternalRequest* aConnectRequest ,
394
+ FlyWebPublishedServerChild::OnWebSocketResponse (InternalRequest* aRequest ,
343
395
InternalResponse* aResponse)
344
396
{
345
- // Send ipdl message to parent
397
+ LOG_I (" FlyWebPublishedServerChild::OnFetchResponse(%p)" , this );
398
+
399
+ if (mActorDestroyed ) {
400
+ LOG_I (" FlyWebPublishedServerChild::OnFetchResponse(%p) - No actor!" , this );
401
+ return ;
402
+ }
403
+
404
+ uint64_t id = mPendingRequests .Get (aRequest);
405
+ MOZ_ASSERT (id);
406
+ mPendingRequests .Remove (aRequest);
407
+
408
+ mPendingTransportProviders .Remove (id);
409
+
410
+ IPCInternalResponse ipcResp;
411
+ UniquePtr<mozilla::ipc::AutoIPCStream> autoStream;
412
+ aResponse->ToIPC (&ipcResp, Manager (), autoStream);
413
+
414
+ Unused << SendWebSocketResponse (ipcResp, id);
415
+ if (autoStream) {
416
+ autoStream->TakeOptionalValue ();
417
+ }
346
418
}
347
419
348
420
void
@@ -397,6 +469,8 @@ FlyWebPublishedServerParent::FlyWebPublishedServerParent(const nsAString& aName,
397
469
398
470
mPublishedServer ->AddEventListener (NS_LITERAL_STRING(" fetch" ),
399
471
this , false , false , 2 );
472
+ mPublishedServer ->AddEventListener (NS_LITERAL_STRING(" websocket" ),
473
+ this , false , false , 2 );
400
474
mPublishedServer ->AddEventListener (NS_LITERAL_STRING(" close" ),
401
475
this , false , false , 2 );
402
476
Unused << SendServerReady (NS_OK);
@@ -435,6 +509,24 @@ FlyWebPublishedServerParent::HandleEvent(nsIDOMEvent* aEvent)
435
509
return NS_OK;
436
510
}
437
511
512
+ if (type.EqualsLiteral (" websocket" )) {
513
+ RefPtr<InternalRequest> request =
514
+ static_cast <FlyWebWebSocketEvent*>(aEvent)->Request ()->GetInternalRequest ();
515
+ uint64_t id = mNextRequestId ++;
516
+ mPendingRequests .Put (id, request);
517
+
518
+ RefPtr<TransportProviderParent> provider =
519
+ static_cast <TransportProviderParent*>(
520
+ mozilla::net::gNeckoParent ->SendPTransportProviderConstructor ());
521
+
522
+ IPCInternalRequest ipcReq;
523
+ request->ToIPC (&ipcReq);
524
+ Unused << SendWebSocketRequest (ipcReq, id, provider);
525
+
526
+ mPendingTransportProviders .Put (id, provider.forget ());
527
+ return NS_OK;
528
+ }
529
+
438
530
MOZ_CRASH (" Unknown event type" );
439
531
440
532
return NS_OK;
444
536
FlyWebPublishedServerParent::RecvFetchResponse (const IPCInternalResponse& aResponse,
445
537
const uint64_t & aRequestId)
446
538
{
447
- RefPtr<InternalRequest> request = mPendingRequests . GetWeak (aRequestId) ;
448
- mPendingRequests .Remove (aRequestId);
539
+ RefPtr<InternalRequest> request;
540
+ mPendingRequests .Remove (aRequestId, getter_AddRefs (request) );
449
541
if (!request) {
450
542
static_cast <ContentParent*>(Manager ())->KillHard (" unknown request id" );
451
543
return false ;
@@ -458,6 +550,58 @@ FlyWebPublishedServerParent::RecvFetchResponse(const IPCInternalResponse& aRespo
458
550
return true ;
459
551
}
460
552
553
+ bool
554
+ FlyWebPublishedServerParent::RecvWebSocketResponse (const IPCInternalResponse& aResponse,
555
+ const uint64_t & aRequestId)
556
+ {
557
+ mPendingTransportProviders .Remove (aRequestId);
558
+
559
+ RefPtr<InternalRequest> request;
560
+ mPendingRequests .Remove (aRequestId, getter_AddRefs (request));
561
+ if (!request) {
562
+ static_cast <ContentParent*>(Manager ())->KillHard (" unknown websocket request id" );
563
+ return false ;
564
+ }
565
+
566
+ RefPtr<InternalResponse> response = InternalResponse::FromIPC (aResponse);
567
+
568
+ mPublishedServer ->OnWebSocketResponse (request, response);
569
+
570
+ return true ;
571
+ }
572
+
573
+ bool
574
+ FlyWebPublishedServerParent::RecvWebSocketAccept (const nsString& aProtocol,
575
+ const uint64_t & aRequestId)
576
+ {
577
+ RefPtr<TransportProviderParent> providerIPC;
578
+ mPendingTransportProviders .Remove (aRequestId, getter_AddRefs (providerIPC));
579
+
580
+ RefPtr<InternalRequest> request;
581
+ mPendingRequests .Remove (aRequestId, getter_AddRefs (request));
582
+
583
+ if (!request || !providerIPC) {
584
+ static_cast <ContentParent*>(Manager ())->KillHard (" unknown websocket request id" );
585
+ return false ;
586
+ }
587
+
588
+ Optional<nsAString> protocol;
589
+ if (!aProtocol.IsVoid ()) {
590
+ protocol = &aProtocol;
591
+ }
592
+
593
+ ErrorResult result;
594
+ nsCOMPtr<nsITransportProvider> providerServer =
595
+ mPublishedServer ->OnWebSocketAcceptInternal (request, protocol, result);
596
+ if (result.Failed ()) {
597
+ return false ;
598
+ }
599
+
600
+ providerServer->SetListener (providerIPC);
601
+
602
+ return true ;
603
+ }
604
+
461
605
void
462
606
FlyWebPublishedServerParent::ActorDestroy (ActorDestroyReason aWhy)
463
607
{
@@ -474,6 +618,8 @@ FlyWebPublishedServerParent::Recv__delete__()
474
618
if (mPublishedServer ) {
475
619
mPublishedServer ->RemoveEventListener (NS_LITERAL_STRING(" fetch" ),
476
620
this , false );
621
+ mPublishedServer ->RemoveEventListener (NS_LITERAL_STRING(" websocket" ),
622
+ this , false );
477
623
mPublishedServer ->RemoveEventListener (NS_LITERAL_STRING(" close" ),
478
624
this , false );
479
625
mPublishedServer ->Close ();
0 commit comments