Changeset 228088 in webkit
- Timestamp:
- Feb 5, 2018 1:02:24 AM (6 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r228086 r228088 1 2018-02-05 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [SOUP] WebSockets must use system proxy settings 4 https://bugs.webkit.org/show_bug.cgi?id=126384 5 6 Reviewed by Michael Catanzaro. 7 8 Use soup_session_connect_async() when available to create the WebSockets connection instead of GSocketClient 9 directly. 10 11 * platform/network/soup/SocketStreamHandleImpl.h: 12 * platform/network/soup/SocketStreamHandleImplSoup.cpp: 13 (WebCore::wssSocketClientEventCallback): 14 (WebCore::SocketStreamHandleImpl::create): 15 (WebCore::SocketStreamHandleImpl::connected): 16 (WebCore::SocketStreamHandleImpl::connectedCallback): 17 (WebCore::SocketStreamHandleImpl::platformClose): 18 1 19 2018-02-05 Carlos Garcia Campos <cgarcia@igalia.com> 2 20 -
trunk/Source/WebCore/platform/network/soup/SocketStreamHandleImpl.h
r220887 r228088 49 49 public: 50 50 static Ref<SocketStreamHandleImpl> create(const URL&, SocketStreamHandleClient&, PAL::SessionID, const String&, SourceApplicationAuditToken&&); 51 static Ref<SocketStreamHandle> create(GSocketConnection*, SocketStreamHandleClient&);52 53 51 virtual ~SocketStreamHandleImpl(); 54 52 … … 65 63 void stopWaitingForSocketWritability(); 66 64 67 static void connectedCallback(G SocketClient*, GAsyncResult*, SocketStreamHandleImpl*);65 static void connectedCallback(GObject*, GAsyncResult*, SocketStreamHandleImpl*); 68 66 static void readReadyCallback(GInputStream*, GAsyncResult*, SocketStreamHandleImpl*); 69 67 static gboolean writeReadyCallback(GPollableOutputStream*, SocketStreamHandleImpl*); 70 68 71 void connected(GRefPtr<G SocketConnection>&&);69 void connected(GRefPtr<GIOStream>&&); 72 70 void readBytes(gssize); 73 71 void didFail(SocketStreamError&&); 74 72 void writeReady(); 75 73 76 GRefPtr<G SocketConnection> m_socketConnection;74 GRefPtr<GIOStream> m_stream; 77 75 GRefPtr<GInputStream> m_inputStream; 78 76 GRefPtr<GPollableOutputStream> m_outputStream; -
trunk/Source/WebCore/platform/network/soup/SocketStreamHandleImplSoup.cpp
r223720 r228088 56 56 } 57 57 58 #if SOUP_CHECK_VERSION(2, 61, 90) 59 static void wssSocketClientEventCallback(SoupSession*, GSocketClientEvent event, GIOStream* connection) 60 { 61 if (event != G_SOCKET_CLIENT_TLS_HANDSHAKING) 62 return; 63 64 g_signal_connect(connection, "accept-certificate", G_CALLBACK(wssConnectionAcceptCertificateCallback), nullptr); 65 } 66 #else 58 67 static void wssSocketClientEventCallback(GSocketClient*, GSocketClientEvent event, GSocketConnectable*, GIOStream* connection) 59 68 { … … 63 72 g_signal_connect(connection, "accept-certificate", G_CALLBACK(wssConnectionAcceptCertificateCallback), nullptr); 64 73 } 65 66 Ref<SocketStreamHandleImpl> SocketStreamHandleImpl::create(const URL& url, SocketStreamHandleClient& client, PAL::SessionID, const String&, SourceApplicationAuditToken&&) 74 #endif 75 76 Ref<SocketStreamHandleImpl> SocketStreamHandleImpl::create(const URL& url, SocketStreamHandleClient& client, PAL::SessionID sessionID, const String&, SourceApplicationAuditToken&&) 67 77 { 68 78 Ref<SocketStreamHandleImpl> socket = adoptRef(*new SocketStreamHandleImpl(url, client)); 69 79 80 // FIXME: Using DeprecatedGlobalSettings from here is a layering violation. 81 bool allowsAnySSLCertificate = url.protocolIs("wss") && DeprecatedGlobalSettings::allowsAnySSLCertificate(); 82 83 #if SOUP_CHECK_VERSION(2, 61, 90) 84 auto* networkStorageSession = NetworkStorageSession::storageSession(sessionID); 85 if (!networkStorageSession) 86 return socket; 87 88 auto uri = url.createSoupURI(); 89 Ref<SocketStreamHandle> protectedSocketStreamHandle = socket.copyRef(); 90 soup_session_connect_async(networkStorageSession->getOrCreateSoupNetworkSession().soupSession(), uri.get(), socket->m_cancellable.get(), 91 allowsAnySSLCertificate ? reinterpret_cast<SoupSessionConnectProgressCallback>(wssSocketClientEventCallback) : nullptr, 92 reinterpret_cast<GAsyncReadyCallback>(connectedCallback), &protectedSocketStreamHandle.leakRef()); 93 #else 94 UNUSED_PARAM(sessionID); 70 95 unsigned port = url.port() ? url.port().value() : (url.protocolIs("wss") ? 443 : 80); 71 96 GRefPtr<GSocketClient> socketClient = adoptGRef(g_socket_client_new()); 72 97 if (url.protocolIs("wss")) { 73 98 g_socket_client_set_tls(socketClient.get(), TRUE); 74 // FIXME: Using DeprecatedGlobalSettings from here is a layering violation. 75 if (DeprecatedGlobalSettings::allowsAnySSLCertificate()) 99 if (allowsAnySSLCertificate) 76 100 g_signal_connect(socketClient.get(), "event", G_CALLBACK(wssSocketClientEventCallback), nullptr); 77 101 } … … 79 103 g_socket_client_connect_to_host_async(socketClient.get(), url.host().utf8().data(), port, socket->m_cancellable.get(), 80 104 reinterpret_cast<GAsyncReadyCallback>(connectedCallback), &protectedSocketStreamHandle.leakRef()); 105 #endif 106 81 107 return socket; 82 }83 84 Ref<SocketStreamHandle> SocketStreamHandleImpl::create(GSocketConnection* socketConnection, SocketStreamHandleClient& client)85 {86 Ref<SocketStreamHandleImpl> socket = adoptRef(*new SocketStreamHandleImpl(URL(), client));87 88 GRefPtr<GSocketConnection> connection = socketConnection;89 socket->connected(WTFMove(connection));90 return WTFMove(socket);91 108 } 92 109 … … 103 120 } 104 121 105 void SocketStreamHandleImpl::connected(GRefPtr<G SocketConnection>&& socketConnection)106 { 107 m_s ocketConnection = WTFMove(socketConnection);108 m_outputStream = G_POLLABLE_OUTPUT_STREAM(g_io_stream_get_output_stream( G_IO_STREAM(m_socketConnection.get())));109 m_inputStream = g_io_stream_get_input_stream( G_IO_STREAM(m_socketConnection.get()));122 void SocketStreamHandleImpl::connected(GRefPtr<GIOStream>&& stream) 123 { 124 m_stream = WTFMove(stream); 125 m_outputStream = G_POLLABLE_OUTPUT_STREAM(g_io_stream_get_output_stream(m_stream.get())); 126 m_inputStream = g_io_stream_get_input_stream(m_stream.get()); 110 127 m_readBuffer = std::make_unique<char[]>(READ_BUFFER_SIZE); 111 128 … … 118 135 } 119 136 120 void SocketStreamHandleImpl::connectedCallback(G SocketClient* client, GAsyncResult* result, SocketStreamHandleImpl* handle)137 void SocketStreamHandleImpl::connectedCallback(GObject* object, GAsyncResult* result, SocketStreamHandleImpl* handle) 121 138 { 122 139 RefPtr<SocketStreamHandle> protectedThis = adoptRef(handle); … … 124 141 // Always finish the connection, even if this SocketStreamHandle was cancelled earlier. 125 142 GUniqueOutPtr<GError> error; 126 GRefPtr<GSocketConnection> socketConnection = adoptGRef(g_socket_client_connect_to_host_finish(client, result, &error.outPtr())); 143 #if SOUP_CHECK_VERSION(2, 61, 90) 144 GRefPtr<GIOStream> stream = adoptGRef(soup_session_connect_finish(SOUP_SESSION(object), result, &error.outPtr())); 145 #else 146 GRefPtr<GIOStream> stream = adoptGRef(G_IO_STREAM(g_socket_client_connect_to_host_finish(G_SOCKET_CLIENT(object), result, &error.outPtr()))); 147 #endif 127 148 128 149 // The SocketStreamHandle has been cancelled, so just close the connection, ignoring errors. 129 150 if (g_cancellable_is_cancelled(handle->m_cancellable.get())) { 130 if (s ocketConnection)131 g_io_stream_close( G_IO_STREAM(socketConnection.get()), nullptr, nullptr);151 if (stream) 152 g_io_stream_close(stream.get(), nullptr, nullptr); 132 153 return; 133 154 } 134 155 135 156 if (error) 136 handle->didFail(SocketStreamError(error->code, String(), error->message));157 handle->didFail(SocketStreamError(error->code, { }, error->message)); 137 158 else 138 handle->connected(WTFMove(s ocketConnection));159 handle->connected(WTFMove(stream)); 139 160 } 140 161 … … 226 247 stopWaitingForSocketWritability(); 227 248 228 if (m_s ocketConnection) {249 if (m_stream) { 229 250 GUniqueOutPtr<GError> error; 230 g_io_stream_close( G_IO_STREAM(m_socketConnection.get()), nullptr, &error.outPtr());251 g_io_stream_close(m_stream.get(), nullptr, &error.outPtr()); 231 252 if (error) 232 didFail(SocketStreamError(error->code, String(), error->message));233 m_s ocketConnection= nullptr;253 didFail(SocketStreamError(error->code, { }, error->message)); 254 m_stream = nullptr; 234 255 } 235 256 -
trunk/Tools/ChangeLog
r228086 r228088 1 2018-02-05 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [SOUP] WebSockets must use system proxy settings 4 https://bugs.webkit.org/show_bug.cgi?id=126384 5 6 Reviewed by Michael Catanzaro. 7 8 Check also WebSockets in /webkit2/WebKitWebContext/proxy. 9 10 * TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp: 11 (ProxyTest::webSocketProxyServerCallback): 12 (ProxyTest::ProxyTest): 13 (ProxyTest::webSocketConnected): 14 (ProxyTest::createWebSocketAndWaitUntilConnected): 15 (webSocketServerCallback): 16 (testWebContextProxySettings): 17 * TestWebKitAPI/glib/WebKitGLib/WebKitTestServer.cpp: 18 (WebKitTestServer::~WebKitTestServer): 19 (WebKitTestServer::addWebSocketHandler): 20 (WebKitTestServer::removeWebSocketHandler): 21 (WebKitTestServer::getWebSocketURIForPath const): 22 (WebKitTestServer::getURIForPath const): 23 * TestWebKitAPI/glib/WebKitGLib/WebKitTestServer.h: 24 (WebKitTestServer::baseURI const): 25 (WebKitTestServer::baseWebSocketURI const): 26 1 27 2018-02-05 Carlos Garcia Campos <cgarcia@igalia.com> 2 28 -
trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp
r225045 r228088 654 654 MAKE_GLIB_TEST_FIXTURE(ProxyTest); 655 655 656 #if SOUP_CHECK_VERSION(2, 61, 90) 657 enum class WebSocketServerType { 658 Unknown, 659 NoProxy, 660 Proxy 661 }; 662 663 static void webSocketProxyServerCallback(SoupServer*, SoupWebsocketConnection*, const char* path, SoupClientContext*, gpointer userData) 664 { 665 static_cast<ProxyTest*>(userData)->webSocketConnected(ProxyTest::WebSocketServerType::Proxy); 666 } 667 #endif 668 656 669 ProxyTest() 657 670 { … … 663 676 m_proxyServer.run(serverCallback); 664 677 g_assert(m_proxyServer.baseURI()); 678 #if SOUP_CHECK_VERSION(2, 61, 90) 679 m_proxyServer.addWebSocketHandler(webSocketProxyServerCallback, this); 680 g_assert(m_proxyServer.baseWebSocketURI()); 681 #endif 665 682 } 666 683 … … 680 697 } 681 698 699 #if SOUP_CHECK_VERSION(2, 61, 90) 700 void webSocketConnected(WebSocketServerType serverType) 701 { 702 m_webSocketRequestReceived = serverType; 703 quitMainLoop(); 704 } 705 706 WebSocketServerType createWebSocketAndWaitUntilConnected() 707 { 708 m_webSocketRequestReceived = WebSocketServerType::Unknown; 709 GUniquePtr<char> createWebSocket(g_strdup_printf("var ws = new WebSocket('%s');", kServer->getWebSocketURIForPath("/foo").data())); 710 webkit_web_view_run_javascript(m_webView, createWebSocket.get(), nullptr, nullptr, nullptr); 711 g_main_loop_run(m_mainLoop); 712 return m_webSocketRequestReceived; 713 } 714 #endif 715 682 716 WebKitTestServer m_proxyServer; 717 718 #if SOUP_CHECK_VERSION(2, 61, 90) 719 WebSocketServerType m_webSocketRequestReceived { WebSocketServerType::Unknown }; 720 #endif 683 721 }; 722 723 #if SOUP_CHECK_VERSION(2, 61, 90) 724 static void webSocketServerCallback(SoupServer*, SoupWebsocketConnection*, const char*, SoupClientContext*, gpointer userData) 725 { 726 static_cast<ProxyTest*>(userData)->webSocketConnected(ProxyTest::WebSocketServerType::NoProxy); 727 } 728 #endif 684 729 685 730 static void ephemeralViewloadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent, WebViewTest* test) … … 697 742 auto mainResourceData = test->loadURIAndGetMainResourceData(kServer->getURIForPath("/echoPort").data()); 698 743 ASSERT_CMP_CSTRING(mainResourceData, ==, serverPortAsString.get()); 744 745 #if SOUP_CHECK_VERSION(2, 61, 90) 746 // WebSocket requests should also be received by kServer. 747 kServer->addWebSocketHandler(webSocketServerCallback, test); 748 auto serverType = test->createWebSocketAndWaitUntilConnected(); 749 g_assert(serverType == ProxyTest::WebSocketServerType::NoProxy); 750 #endif 699 751 700 752 // Set default proxy URI to point to proxyServer. Requests to kServer should be received by proxyServer instead. … … 706 758 ASSERT_CMP_CSTRING(mainResourceData, ==, proxyServerPortAsString.get()); 707 759 webkit_network_proxy_settings_free(settings); 760 761 #if SOUP_CHECK_VERSION(2, 61, 90) 762 // WebSocket requests should also be received by proxyServer. 763 serverType = test->createWebSocketAndWaitUntilConnected(); 764 g_assert(serverType == ProxyTest::WebSocketServerType::Proxy); 765 #endif 708 766 709 767 // Proxy settings also affect ephemeral web views. … … 767 825 mainResourceData = test->loadURIAndGetMainResourceData(kServer->getURIForPath("/echoPort").data()); 768 826 ASSERT_CMP_CSTRING(mainResourceData, ==, serverPortAsString.get()); 827 828 #if SOUP_CHECK_VERSION(2, 61, 90) 829 kServer->removeWebSocketHandler(); 830 #endif 769 831 } 770 832 -
trunk/Tools/TestWebKitAPI/glib/WebKitGLib/WebKitTestServer.cpp
r218685 r228088 54 54 { 55 55 soup_uri_free(m_baseURI); 56 #if SOUP_CHECK_VERSION(2, 50, 0) 57 if (m_baseWebSocketURI) 58 soup_uri_free(m_baseWebSocketURI); 59 #endif 56 60 } 57 61 … … 69 73 } 70 74 71 CString WebKitTestServer::getURIForPath(const char* path) 75 #if SOUP_CHECK_VERSION(2, 50, 0) 76 void WebKitTestServer::addWebSocketHandler(SoupServerWebsocketCallback callback, gpointer userData) 77 { 78 m_baseWebSocketURI = soup_uri_new_with_base(m_baseURI, "/websocket/"); 79 m_baseWebSocketURI->scheme = m_baseWebSocketURI->scheme == SOUP_URI_SCHEME_HTTP ? SOUP_URI_SCHEME_WS : SOUP_URI_SCHEME_WSS; 80 81 if (m_queue) { 82 m_queue->dispatch([this, callback, userData] { 83 soup_server_add_websocket_handler(m_soupServer.get(), "/websocket", nullptr, nullptr, callback, userData, nullptr); 84 }); 85 } else 86 soup_server_add_websocket_handler(m_soupServer.get(), "/websocket", nullptr, nullptr, callback, userData, nullptr); 87 } 88 89 void WebKitTestServer::removeWebSocketHandler() 90 { 91 soup_uri_free(m_baseWebSocketURI); 92 m_baseWebSocketURI = nullptr; 93 94 if (m_queue) { 95 m_queue->dispatch([this] { 96 soup_server_remove_handler(m_soupServer.get(), "/websocket"); 97 }); 98 } else 99 soup_server_remove_handler(m_soupServer.get(), "/websocket"); 100 } 101 102 CString WebKitTestServer::getWebSocketURIForPath(const char* path) const 103 { 104 g_assert(m_baseWebSocketURI); 105 g_assert(path && *path == '/'); 106 SoupURI* uri = soup_uri_new_with_base(m_baseWebSocketURI, path + 1); // Ignore the leading slash. 107 GUniquePtr<gchar> uriString(soup_uri_to_string(uri, FALSE)); 108 soup_uri_free(uri); 109 return uriString.get(); 110 } 111 #endif // SOUP_CHECK_VERSION(2, 50, 0) 112 113 CString WebKitTestServer::getURIForPath(const char* path) const 72 114 { 73 115 SoupURI* uri = soup_uri_new_with_base(m_baseURI, path); … … 76 118 return uriString.get(); 77 119 } 78 -
trunk/Tools/TestWebKitAPI/glib/WebKitGLib/WebKitTestServer.h
r218685 r228088 37 37 virtual ~WebKitTestServer(); 38 38 39 SoupURI* baseURI() { return m_baseURI; } 39 SoupURI* baseURI() const { return m_baseURI; } 40 CString getURIForPath(const char* path) const; 41 void run(SoupServerCallback); 40 42 41 CString getURIForPath(const char* path); 42 void run(SoupServerCallback); 43 #if SOUP_CHECK_VERSION(2, 50, 0) 44 void addWebSocketHandler(SoupServerWebsocketCallback, gpointer userData); 45 void removeWebSocketHandler(); 46 SoupURI* baseWebSocketURI() const { return m_baseWebSocketURI; } 47 CString getWebSocketURIForPath(const char* path) const; 48 #endif 43 49 44 50 private: 45 51 GRefPtr<SoupServer> m_soupServer; 46 SoupURI* m_baseURI; 52 SoupURI* m_baseURI { nullptr }; 53 #if SOUP_CHECK_VERSION(2, 50, 0) 54 SoupURI* m_baseWebSocketURI { nullptr }; 55 #endif 47 56 RefPtr<WorkQueue> m_queue; 48 57 };
Note: See TracChangeset
for help on using the changeset viewer.