mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
Bug 1263991 part 5: Create API on FlyWebPublishedServer for getting back a nsITransport when accepting a websocket request, rather than getting back a WebSocket DOM object. r=djvj
This commit is contained in:
parent
c867263f70
commit
f637a548d5
@ -16,6 +16,7 @@
|
||||
#include "mozilla/Preferences.h"
|
||||
#include "mozilla/unused.h"
|
||||
#include "nsGlobalWindow.h"
|
||||
#include "WebSocketChannel.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
@ -110,6 +111,51 @@ FlyWebPublishedServer::PublishedServerStarted(nsresult aStatus)
|
||||
}
|
||||
}
|
||||
|
||||
already_AddRefed<WebSocket>
|
||||
FlyWebPublishedServer::OnWebSocketAccept(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
MOZ_ASSERT(aConnectRequest);
|
||||
|
||||
LOG_I("FlyWebPublishedServer::OnWebSocketAccept(%p)", this);
|
||||
|
||||
nsCOMPtr<nsITransportProvider> provider =
|
||||
OnWebSocketAcceptInternal(aConnectRequest,
|
||||
aProtocol,
|
||||
aRv);
|
||||
if (aRv.Failed()) {
|
||||
return nullptr;
|
||||
}
|
||||
MOZ_ASSERT(provider);
|
||||
|
||||
nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(GetOwner());
|
||||
AutoJSContext cx;
|
||||
GlobalObject global(cx, nsGlobalWindow::Cast(window)->FastGetGlobalJSObject());
|
||||
|
||||
nsAutoCString extensions, negotiatedExtensions;
|
||||
aConnectRequest->Headers()->
|
||||
Get(NS_LITERAL_CSTRING("Sec-WebSocket-Extensions"), extensions, aRv);
|
||||
mozilla::net::ProcessServerWebSocketExtensions(extensions,
|
||||
negotiatedExtensions);
|
||||
|
||||
nsCString url;
|
||||
aConnectRequest->GetURL(url);
|
||||
Sequence<nsString> protocols;
|
||||
if (aProtocol.WasPassed() &&
|
||||
!protocols.AppendElement(aProtocol.Value(), fallible)) {
|
||||
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return WebSocket::ConstructorCommon(global,
|
||||
NS_ConvertUTF8toUTF16(url),
|
||||
protocols,
|
||||
provider,
|
||||
negotiatedExtensions,
|
||||
aRv);
|
||||
}
|
||||
|
||||
/******** FlyWebPublishedServerImpl ********/
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED0(FlyWebPublishedServerImpl, mozilla::DOMEventTargetHelper)
|
||||
@ -165,52 +211,6 @@ FlyWebPublishedServerImpl::OnFetchResponse(InternalRequest* aRequest,
|
||||
}
|
||||
}
|
||||
|
||||
already_AddRefed<WebSocket>
|
||||
FlyWebPublishedServerImpl::OnWebSocketAccept(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
MOZ_ASSERT(aConnectRequest);
|
||||
|
||||
LOG_I("FlyWebPublishedMDNSServer::OnWebSocketAccept(%p)", this);
|
||||
|
||||
if (!mHttpServer) {
|
||||
aRv.Throw(NS_ERROR_UNEXPECTED);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsAutoCString negotiatedExtensions;
|
||||
nsCOMPtr<nsITransportProvider> provider =
|
||||
mHttpServer->AcceptWebSocket(aConnectRequest,
|
||||
aProtocol,
|
||||
negotiatedExtensions,
|
||||
aRv);
|
||||
if (aRv.Failed()) {
|
||||
return nullptr;
|
||||
}
|
||||
MOZ_ASSERT(provider);
|
||||
|
||||
nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(GetOwner());
|
||||
AutoJSContext cx;
|
||||
GlobalObject global(cx, nsGlobalWindow::Cast(window)->FastGetGlobalJSObject());
|
||||
|
||||
nsCString url;
|
||||
aConnectRequest->GetURL(url);
|
||||
Sequence<nsString> protocols;
|
||||
if (aProtocol.WasPassed() &&
|
||||
!protocols.AppendElement(aProtocol.Value(), fallible)) {
|
||||
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return WebSocket::ConstructorCommon(global,
|
||||
NS_ConvertUTF8toUTF16(url),
|
||||
protocols,
|
||||
provider,
|
||||
negotiatedExtensions,
|
||||
aRv);
|
||||
}
|
||||
|
||||
void
|
||||
FlyWebPublishedServerImpl::OnWebSocketResponse(InternalRequest* aConnectRequest,
|
||||
InternalResponse* aResponse)
|
||||
@ -225,6 +225,23 @@ FlyWebPublishedServerImpl::OnWebSocketResponse(InternalRequest* aConnectRequest,
|
||||
}
|
||||
}
|
||||
|
||||
already_AddRefed<nsITransportProvider>
|
||||
FlyWebPublishedServerImpl::OnWebSocketAcceptInternal(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
LOG_I("FlyWebPublishedServerImpl::OnWebSocketAcceptInternal(%p)", this);
|
||||
|
||||
if (!mHttpServer) {
|
||||
aRv.Throw(NS_ERROR_UNEXPECTED);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return mHttpServer->AcceptWebSocket(aConnectRequest,
|
||||
aProtocol,
|
||||
aRv);
|
||||
}
|
||||
|
||||
/******** FlyWebPublishedServerChild ********/
|
||||
|
||||
FlyWebPublishedServerChild::FlyWebPublishedServerChild(nsPIDOMWindowInner* aOwner,
|
||||
@ -309,12 +326,14 @@ FlyWebPublishedServerChild::OnFetchResponse(InternalRequest* aRequest,
|
||||
}
|
||||
}
|
||||
|
||||
already_AddRefed<WebSocket>
|
||||
FlyWebPublishedServerChild::OnWebSocketAccept(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
ErrorResult& aRv)
|
||||
already_AddRefed<nsITransportProvider>
|
||||
FlyWebPublishedServerChild::OnWebSocketAcceptInternal(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
// Send ipdl message to parent
|
||||
LOG_I("FlyWebPublishedServerChild::OnWebSocketAcceptInternal(%p)", this);
|
||||
|
||||
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -65,12 +65,16 @@ public:
|
||||
|
||||
virtual void OnFetchResponse(InternalRequest* aRequest,
|
||||
InternalResponse* aResponse) = 0;
|
||||
virtual already_AddRefed<WebSocket>
|
||||
already_AddRefed<WebSocket>
|
||||
OnWebSocketAccept(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
ErrorResult& aRv) = 0;
|
||||
ErrorResult& aRv);
|
||||
virtual void OnWebSocketResponse(InternalRequest* aConnectRequest,
|
||||
InternalResponse* aResponse) = 0;
|
||||
virtual already_AddRefed<nsITransportProvider>
|
||||
OnWebSocketAcceptInternal(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
ErrorResult& aRv) = 0;
|
||||
|
||||
virtual void Close();
|
||||
|
||||
@ -89,7 +93,6 @@ public:
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
virtual ~FlyWebPublishedServer()
|
||||
{
|
||||
MOZ_ASSERT(!mIsRegistered, "Subclass dtor forgot to call Close()");
|
||||
@ -128,12 +131,12 @@ public:
|
||||
|
||||
virtual void OnFetchResponse(InternalRequest* aRequest,
|
||||
InternalResponse* aResponse) override;
|
||||
virtual already_AddRefed<WebSocket>
|
||||
OnWebSocketAccept(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
ErrorResult& aRv) override;
|
||||
virtual void OnWebSocketResponse(InternalRequest* aConnectRequest,
|
||||
InternalResponse* aResponse) override;
|
||||
virtual already_AddRefed<nsITransportProvider>
|
||||
OnWebSocketAcceptInternal(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
ErrorResult& aRv) override;
|
||||
|
||||
void SetCancelRegister(nsICancelable* aCancelRegister)
|
||||
{
|
||||
@ -181,12 +184,12 @@ public:
|
||||
|
||||
virtual void OnFetchResponse(InternalRequest* aRequest,
|
||||
InternalResponse* aResponse) override;
|
||||
virtual already_AddRefed<WebSocket>
|
||||
OnWebSocketAccept(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
ErrorResult& aRv) override;
|
||||
virtual void OnWebSocketResponse(InternalRequest* aConnectRequest,
|
||||
InternalResponse* aResponse) override;
|
||||
virtual already_AddRefed<nsITransportProvider>
|
||||
OnWebSocketAcceptInternal(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
ErrorResult& aRv) override;
|
||||
|
||||
virtual void Close() override;
|
||||
|
||||
|
@ -175,7 +175,6 @@ HttpServer::SendResponse(InternalRequest* aRequest, InternalResponse* aResponse)
|
||||
already_AddRefed<nsITransportProvider>
|
||||
HttpServer::AcceptWebSocket(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
nsACString& aNegotiatedExtensions,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
for (Connection* conn : mConnections) {
|
||||
@ -183,7 +182,7 @@ HttpServer::AcceptWebSocket(InternalRequest* aConnectRequest,
|
||||
continue;
|
||||
}
|
||||
nsCOMPtr<nsITransportProvider> provider =
|
||||
conn->HandleAcceptWebSocket(aProtocol, aNegotiatedExtensions, aRv);
|
||||
conn->HandleAcceptWebSocket(aProtocol, aRv);
|
||||
if (aRv.Failed()) {
|
||||
conn->Close();
|
||||
}
|
||||
@ -790,7 +789,6 @@ HttpServer::Connection::TryHandleResponse(InternalRequest* aRequest,
|
||||
|
||||
already_AddRefed<nsITransportProvider>
|
||||
HttpServer::Connection::HandleAcceptWebSocket(const Optional<nsAString>& aProtocol,
|
||||
nsACString& aNegotiatedExtensions,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
MOZ_ASSERT(mPendingWebSocketRequest);
|
||||
@ -830,14 +828,14 @@ HttpServer::Connection::HandleAcceptWebSocket(const Optional<nsAString>& aProtoc
|
||||
}
|
||||
headers->Set(NS_LITERAL_CSTRING("Sec-WebSocket-Accept"), hash, aRv);
|
||||
|
||||
nsAutoCString extensions;
|
||||
nsAutoCString extensions, negotiatedExtensions;
|
||||
mPendingWebSocketRequest->Headers()->
|
||||
Get(NS_LITERAL_CSTRING("Sec-WebSocket-Extensions"), extensions, aRv);
|
||||
mozilla::net::ProcessServerWebSocketExtensions(extensions,
|
||||
aNegotiatedExtensions);
|
||||
if (!aNegotiatedExtensions.IsEmpty()) {
|
||||
negotiatedExtensions);
|
||||
if (!negotiatedExtensions.IsEmpty()) {
|
||||
headers->Set(NS_LITERAL_CSTRING("Sec-WebSocket-Extensions"),
|
||||
aNegotiatedExtensions, aRv);
|
||||
negotiatedExtensions, aRv);
|
||||
}
|
||||
|
||||
RefPtr<TransportProvider> result = new TransportProvider();
|
||||
|
@ -55,7 +55,6 @@ public:
|
||||
already_AddRefed<nsITransportProvider>
|
||||
AcceptWebSocket(InternalRequest* aConnectRequest,
|
||||
const Optional<nsAString>& aProtocol,
|
||||
nsACString& aNegotiatedExtensions,
|
||||
ErrorResult& aRv);
|
||||
void SendWebSocketResponse(InternalRequest* aConnectRequest,
|
||||
InternalResponse* aResponse);
|
||||
@ -113,7 +112,6 @@ private:
|
||||
InternalResponse* aResponse);
|
||||
already_AddRefed<nsITransportProvider>
|
||||
HandleAcceptWebSocket(const Optional<nsAString>& aProtocol,
|
||||
nsACString& aNegotiatedExtensions,
|
||||
ErrorResult& aRv);
|
||||
void HandleWebSocketResponse(InternalResponse* aResponse);
|
||||
bool HasPendingWebSocketRequest(InternalRequest* aRequest)
|
||||
|
Loading…
Reference in New Issue
Block a user