Diff
Modified: trunk/Source/WTF/ChangeLog (284417 => 284418)
--- trunk/Source/WTF/ChangeLog 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Source/WTF/ChangeLog 2021-10-19 00:44:15 UTC (rev 284418)
@@ -1,5 +1,14 @@
2021-10-18 Alex Christensen <achristen...@webkit.org>
+ Remove TCPServer
+ https://bugs.webkit.org/show_bug.cgi?id=231912
+
+ Reviewed by Chris Dumez.
+
+ * wtf/PlatformHave.h:
+
+2021-10-18 Alex Christensen <achristen...@webkit.org>
+
[ iOS15 Monterey ] TestWTF.WTF_URLExtras.URLExtras is a constant failure
https://bugs.webkit.org/show_bug.cgi?id=231454
Modified: trunk/Source/WTF/wtf/PlatformHave.h (284417 => 284418)
--- trunk/Source/WTF/wtf/PlatformHave.h 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Source/WTF/wtf/PlatformHave.h 2021-10-19 00:44:15 UTC (rev 284418)
@@ -946,6 +946,7 @@
|| (PLATFORM(WATCHOS) && __WATCH_OS_VERSION_MIN_REQUIRED >= 80000) \
|| (PLATFORM(APPLETV) && __TV_OS_VERSION_MIN_REQUIRED >= 150000)
#define HAVE_CFNETWORK_NSURLSESSION_ATTRIBUTED_BUNDLE_IDENTIFIER 1
+#define HAVE_CFNETWORK_NSURLSESSION_HSTS_WITH_UNTRUSTED_ROOT 1
#define HAVE_AUDIO_OBJECT_PROPERTY_ELEMENT_MAIN 1
#define HAVE_IMAGE_RESTRICTED_DECODING 1
#endif
Modified: trunk/Tools/ChangeLog (284417 => 284418)
--- trunk/Tools/ChangeLog 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Tools/ChangeLog 2021-10-19 00:44:15 UTC (rev 284418)
@@ -1,3 +1,35 @@
+2021-10-18 Alex Christensen <achristen...@webkit.org>
+
+ Remove TCPServer
+ https://bugs.webkit.org/show_bug.cgi?id=231912
+
+ Reviewed by Chris Dumez.
+
+ It has been replaced by HTTPServer, which doesn't time out in its destructor when not everything is perfect,
+ and which does its logic on the main thread. It also doesn't use boringssl directly, so we can compile it on watchOS and tvOS.
+
+ * TestWebKitAPI/Sources.txt:
+ * TestWebKitAPI/TCPServer.cpp: Removed.
+ * TestWebKitAPI/TCPServer.h: Removed.
+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+ * TestWebKitAPI/Tests/WebKitCocoa/Challenge.mm:
+ (testCertificate):
+ (testIdentity):
+ * TestWebKitAPI/Tests/WebKitCocoa/ContentRuleListNotification.mm:
+ (TEST):
+ * TestWebKitAPI/Tests/WebKitCocoa/HSTS.mm:
+ (TestWebKitAPI::hstsWebViewAndDelegate):
+ (TestWebKitAPI::hstsServer):
+ (TestWebKitAPI::TEST):
+ (TestWebKitAPI::hasRadar80550123): Deleted.
+ * TestWebKitAPI/Tests/WebKitCocoa/Proxy.mm:
+ * TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerTCPServer.h:
+ (ServiceWorkerTCPServer::respondToRequests):
+ * TestWebKitAPI/cocoa/HTTPServer.h:
+ * TestWebKitAPI/cocoa/HTTPServer.mm:
+ (TestWebKitAPI::HTTPServer::testCertificate):
+ (TestWebKitAPI::HTTPServer::testPrivateKey):
+
2021-10-18 Jonathan Bedard <jbed...@apple.com>
[Python-3] Invoke webkit-patch with Python 3 by default (Revert)
Modified: trunk/Tools/TestWebKitAPI/Sources.txt (284417 => 284418)
--- trunk/Tools/TestWebKitAPI/Sources.txt 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Tools/TestWebKitAPI/Sources.txt 2021-10-19 00:44:15 UTC (rev 284418)
@@ -23,6 +23,5 @@
_javascript_Test.cpp
PlatformUtilities.cpp
-TCPServer.cpp
TestsController.cpp
Deleted: trunk/Tools/TestWebKitAPI/TCPServer.cpp (284417 => 284418)
--- trunk/Tools/TestWebKitAPI/TCPServer.cpp 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Tools/TestWebKitAPI/TCPServer.cpp 2021-10-19 00:44:15 UTC (rev 284418)
@@ -1,475 +0,0 @@
-/*
- * Copyright (C) 2019 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "TCPServer.h"
-
-#include <netinet/in.h>
-#include <thread>
-#include <unistd.h>
-#include <wtf/text/Base64.h>
-
-#if HAVE(SSL)
-
-#define STACK_OF(type) struct stack_st_##type
-
-extern "C" {
-
-enum ssl_verify_result_t {
- ssl_verify_ok,
- ssl_verify_invalid,
- ssl_verify_retry,
-};
-
-struct BIO;
-struct CRYPTO_BUFFER;
-struct SSL_CTX;
-struct EVP_PKEY;
-struct SSL_METHOD;
-struct SSL_PRIVATE_KEY_METHOD;
-struct _STACK;
-struct CRYPTO_BUFFER_POOL;
-struct pem_password_cb;
-int BIO_free(BIO*);
-int SSL_free(SSL*);
-int SSL_CTX_free(SSL_CTX*);
-int EVP_PKEY_free(EVP_PKEY*);
-int SSL_library_init();
-const SSL_METHOD* TLS_with_buffers_method();
-BIO* BIO_new_mem_buf(const void*, int);
-EVP_PKEY* PEM_read_bio_PrivateKey(BIO*, EVP_PKEY**, pem_password_cb*, void*);
-SSL_CTX* SSL_CTX_new(const SSL_METHOD*);
-SSL* SSL_new(SSL_CTX*);
-int SSL_accept(SSL*);
-int SSL_set_fd(SSL*, int);
-int SSL_get_error(const SSL*, int);
-void SSL_CTX_set_custom_verify(SSL_CTX*, int mode, enum ssl_verify_result_t (*callback)(SSL *ssl, uint8_t *out_alert));
-int SSL_read(SSL*, void*, int);
-int SSL_write(SSL*, const void*, int);
-const uint8_t* CRYPTO_BUFFER_data(const CRYPTO_BUFFER*);
-size_t CRYPTO_BUFFER_len(const CRYPTO_BUFFER*);
-void OPENSSL_free(void*);
-int SSL_CTX_set_chain_and_key(SSL_CTX*, CRYPTO_BUFFER *const *certs, size_t num_certs, EVP_PKEY*, const SSL_PRIVATE_KEY_METHOD*);
-CRYPTO_BUFFER* CRYPTO_BUFFER_new(const uint8_t*, size_t, CRYPTO_BUFFER_POOL*);
-void CRYPTO_BUFFER_free(CRYPTO_BUFFER*);
-size_t sk_num(const _STACK*);
-void* sk_value(const _STACK*, size_t);
-const STACK_OF(CRYPTO_BUFFER) *SSL_get0_peer_certificates(const SSL*);
-void SSL_CTX_set_max_proto_version(SSL_CTX*, uint16_t);
-#define SSL_VERIFY_PEER 0x01
-#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02
-
-} // extern "C"
-
-inline size_t sk_CRYPTO_BUFFER_num(const STACK_OF(CRYPTO_BUFFER) *sk) { return sk_num((const _STACK *)sk); }
-inline CRYPTO_BUFFER* sk_CRYPTO_BUFFER_value(const STACK_OF(CRYPTO_BUFFER) *sk, size_t i) { return (CRYPTO_BUFFER *)sk_value((const _STACK *)sk, i); }
-#endif // HAVE(SSL)
-
-namespace TestWebKitAPI {
-
-#if HAVE(SSL)
-template<typename> struct deleter;
-template<> struct deleter<BIO> {
- void operator()(BIO* bio)
- {
- BIO_free(bio);
- }
-};
-template<> struct deleter<SSL> {
- void operator()(SSL* ssl)
- {
- SSL_free(ssl);
- }
-};
-template<> struct deleter<SSL_CTX> {
- void operator()(SSL_CTX* ctx)
- {
- SSL_CTX_free(ctx);
- }
-};
-template<> struct deleter<EVP_PKEY> {
- void operator()(EVP_PKEY* key)
- {
- EVP_PKEY_free(key);
- }
-};
-template<> struct deleter<CRYPTO_BUFFER> {
- void operator()(CRYPTO_BUFFER* buffer)
- {
- CRYPTO_BUFFER_free(buffer);
- }
-};
-namespace ssl {
-template <typename T> using unique_ptr = std::unique_ptr<T, deleter<T>>;
-}
-#endif // HAVE(SSL)
-
-TCPServer::TCPServer(Function<void(Socket)>&& connectionHandler, size_t connections)
- : m_connectionHandler(WTFMove(connectionHandler))
-{
- listenForConnections(connections);
-}
-
-#if HAVE(SSL)
-void TCPServer::startSecureConnection(Socket socket, Function<void(SSL*)>&& secureConnectionHandler, bool requestClientCertificate, std::optional<uint16_t> maxTLSVersion)
-{
- SSL_library_init();
-
- ssl::unique_ptr<SSL_CTX> ctx(SSL_CTX_new(TLS_with_buffers_method()));
-
- // This is a test certificate from BoringSSL.
- String certPEM(
- "MIICWDCCAcGgAwIBAgIJAPuwTC6rEJsMMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV"
- "BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX"
- "aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDIzMjA1MDQwWhcNMTcwNDIyMjA1MDQwWjBF"
- "MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50"
- "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB"
- "gQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92kWdGMdAQhLci"
- "HnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiFKKAnHmUcrgfV"
- "W28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQABo1AwTjAdBgNV"
- "HQ4EFgQUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wHwYDVR0jBBgwFoAUi3XVrMsIvg4f"
- "Zbf6Vr5sp3Xaha8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQA76Hht"
- "ldY9avcTGSwbwoiuIqv0jTL1fHFnzy3RHMLDh+Lpvolc5DSrSJHCP5WuK0eeJXhr"
- "T5oQpHL9z/cCDLAKCKRa4uV0fhEdOWBqyR9p8y5jJtye72t6CuFUV5iqcpF4BH4f"
- "j2VNHwsSrJwkD4QUGlUtH7vwnQmyCFxZMmWAJg==");
- auto certDER = base64Decode(certPEM);
- ssl::unique_ptr<CRYPTO_BUFFER> cert(CRYPTO_BUFFER_new(certDER->data(), certDER->size(), nullptr));
- ASSERT(cert);
-
- // This is a test key from BoringSSL.
- char kKeyPEM[] =
- "-----BEGIN RSA PRIVATE KEY-----\n"
- "MIICXgIBAAKBgQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92\n"
- "kWdGMdAQhLciHnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiF\n"
- "KKAnHmUcrgfVW28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQAB\n"
- "AoGBAIBy09Fd4DOq/Ijp8HeKuCMKTHqTW1xGHshLQ6jwVV2vWZIn9aIgmDsvkjCe\n"
- "i6ssZvnbjVcwzSoByhjN8ZCf/i15HECWDFFh6gt0P5z0MnChwzZmvatV/FXCT0j+\n"
- "WmGNB/gkehKjGXLLcjTb6dRYVJSCZhVuOLLcbWIV10gggJQBAkEA8S8sGe4ezyyZ\n"
- "m4e9r95g6s43kPqtj5rewTsUxt+2n4eVodD+ZUlCULWVNAFLkYRTBCASlSrm9Xhj\n"
- "QpmWAHJUkQJBAOVzQdFUaewLtdOJoPCtpYoY1zd22eae8TQEmpGOR11L6kbxLQsk\n"
- "aMly/DOnOaa82tqAGTdqDEZgSNmCeKKknmECQAvpnY8GUOVAubGR6c+W90iBuQLj\n"
- "LtFp/9ihd2w/PoDwrHZaoUYVcT4VSfJQog/k7kjE4MYXYWL8eEKg3WTWQNECQQDk\n"
- "104Wi91Umd1PzF0ijd2jXOERJU1wEKe6XLkYYNHWQAe5l4J4MWj9OdxFXAxIuuR/\n"
- "tfDwbqkta4xcux67//khAkEAvvRXLHTaa6VFzTaiiO8SaFsHV3lQyXOtMrBpB5jd\n"
- "moZWgjHvB2W9Ckn7sDqsPB+U2tyX0joDdQEyuiMECDY8oQ==\n"
- "-----END RSA PRIVATE KEY-----\n";
-
- ssl::unique_ptr<BIO> privateKeyBIO(BIO_new_mem_buf(kKeyPEM, strlen(kKeyPEM)));
- ssl::unique_ptr<EVP_PKEY> privateKey(PEM_read_bio_PrivateKey(privateKeyBIO.get(), nullptr, nullptr, nullptr));
- ASSERT(privateKey);
-
- SSL_CTX_set_chain_and_key(ctx.get(), reinterpret_cast<CRYPTO_BUFFER *const *>(&cert), 1, privateKey.get(), nullptr);
-
- if (requestClientCertificate) {
- SSL_CTX_set_custom_verify(ctx.get(), SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, [] (SSL* ssl, uint8_t*) -> ssl_verify_result_t {
- auto chain = SSL_get0_peer_certificates(ssl);
- EXPECT_EQ(sk_CRYPTO_BUFFER_num(chain), 2u);
- auto cert = sk_CRYPTO_BUFFER_value(chain, 0);
- auto expectedCert = testCertificate();
- EXPECT_EQ(CRYPTO_BUFFER_len(cert), expectedCert.size());
- EXPECT_TRUE(!memcmp(CRYPTO_BUFFER_data(cert), expectedCert.data(), expectedCert.size()));
- return ssl_verify_ok;
- });
- }
-
- if (maxTLSVersion)
- SSL_CTX_set_max_proto_version(ctx.get(), *maxTLSVersion);
-
- ssl::unique_ptr<SSL> ssl(SSL_new(ctx.get()));
- ASSERT(ssl);
- SSL_set_fd(ssl.get(), socket);
-
- auto acceptResult = SSL_accept(ssl.get());
- secureConnectionHandler(acceptResult > 0 ? ssl.get() : nullptr);
-};
-
-TCPServer::TCPServer(Protocol protocol, Function<void(SSL*)>&& secureConnectionHandler, std::optional<uint16_t> maxTLSVersion, size_t connections)
-{
- switch (protocol) {
- case Protocol::HTTPS:
- case Protocol::HTTPSWithClientCertificateRequest:
- m_connectionHandler = [secureConnectionHandler = WTFMove(secureConnectionHandler), protocol, maxTLSVersion] (Socket socket) mutable {
- startSecureConnection(socket, WTFMove(secureConnectionHandler), protocol == Protocol::HTTPSWithClientCertificateRequest, maxTLSVersion);
- };
- break;
- case Protocol::HTTPSProxy:
- m_connectionHandler = [secureConnectionHandler = WTFMove(secureConnectionHandler)] (Socket socket) mutable {
- char readBuffer[1000];
- auto bytesRead = ::read(socket, readBuffer, sizeof(readBuffer));
- EXPECT_GT(bytesRead, 0);
- EXPECT_TRUE(static_cast<size_t>(bytesRead) < sizeof(readBuffer));
-
- const char* responseHeader = ""
- "HTTP/1.1 200 Connection Established\r\n"
- "Connection: close\r\n\r\n";
- auto bytesWritten = ::write(socket, responseHeader, strlen(responseHeader));
- EXPECT_EQ(static_cast<size_t>(bytesWritten), strlen(responseHeader));
- startSecureConnection(socket, WTFMove(secureConnectionHandler));
- };
- break;
- }
- listenForConnections(connections);
-}
-#endif // HAVE(SSL)
-
-void TCPServer::listenForConnections(size_t connections)
-{
- auto listeningSocket = socketBindListen(connections);
- ASSERT(listeningSocket);
- m_listeningThread = std::thread([this, listeningSocket = *listeningSocket, connections] {
- for (size_t i = 0; i < connections; ++i) {
- Socket connectionSocket = accept(listeningSocket, nullptr, nullptr);
- m_connectionThreads.append(std::thread([this, connectionSocket] {
- m_connectionHandler(connectionSocket);
- shutdown(connectionSocket, SHUT_RDWR);
- close(connectionSocket);
- }));
- }
- close(listeningSocket);
- });
-}
-
-TCPServer::~TCPServer()
-{
- m_listeningThread.join();
- for (auto& connectionThreads : m_connectionThreads)
- connectionThreads.join();
-}
-
-auto TCPServer::socketBindListen(size_t connections) -> std::optional<Socket>
-{
- Socket listeningSocket = socket(PF_INET, SOCK_STREAM, 0);
- if (listeningSocket == -1)
- return std::nullopt;
-
- // Ports 49152-65535 are unallocated ports. Try until we find one that's free.
- for (Port port = 49152; port; port++) {
- struct sockaddr_in name;
- memset(&name, 0, sizeof(name));
- name.sin_family = AF_INET;
- name.sin_port = htons(port);
- name.sin_addr.s_addr = htonl(INADDR_ANY);
- if (bind(listeningSocket, reinterpret_cast<sockaddr*>(&name), sizeof(name)) < 0) {
- // This port is busy. Try the next port.
- continue;
- }
- if (listen(listeningSocket, connections) == -1) {
- // Listening failed.
- close(listeningSocket);
- return std::nullopt;
- }
- m_port = port;
- return listeningSocket; // Successfully set up listening port.
- }
-
- // Couldn't find an available port.
- close(listeningSocket);
- return std::nullopt;
-}
-
-template<> Vector<uint8_t> TCPServer::read(Socket socket)
-{
- uint8_t buffer[1000];
- auto bytesRead = ::read(socket, buffer, sizeof(buffer));
- if (bytesRead <= 0)
- return { };
- ASSERT(static_cast<size_t>(bytesRead) < sizeof(buffer));
-
- Vector<uint8_t> vector;
- vector.append(buffer, bytesRead);
- return vector;
-}
-
-template<> void TCPServer::write(Socket socket, const void* response, size_t length)
-{
- auto bytesWritten = ::write(socket, response, length);
- EXPECT_EQ(static_cast<size_t>(bytesWritten), length);
-}
-
-#if HAVE(SSL)
-template<> Vector<uint8_t> TCPServer::read(SSL* ssl)
-{
- uint8_t buffer[1000];
- auto bytesRead = SSL_read(ssl, buffer, sizeof(buffer));
- if (bytesRead <= 0)
- return { };
- ASSERT(static_cast<size_t>(bytesRead) < sizeof(buffer));
-
- Vector<uint8_t> vector;
- vector.append(buffer, bytesRead);
- return vector;
-}
-
-template<> void TCPServer::write(SSL* ssl, const void* response, size_t length)
-{
- auto bytesWritten = SSL_write(ssl, response, length);
- EXPECT_EQ(static_cast<size_t>(bytesWritten), length);
-}
-#endif
-
-void TCPServer::respondWithChallengeThenOK(Socket socket)
-{
- read(socket);
-
- const char* challengeHeader =
- "HTTP/1.1 401 Unauthorized\r\n"
- "Date: Sat, 23 Mar 2019 06:29:01 GMT\r\n"
- "Content-Length: 0\r\n"
- "WWW-Authenticate: Basic realm=\"testrealm\"\r\n\r\n";
- write(socket, challengeHeader, strlen(challengeHeader));
-
- read(socket);
-
- const char* responseHeader =
- "HTTP/1.1 200 OK\r\n"
- "Content-Length: 13\r\n\r\n"
- "Hello, World!";
- write(socket, responseHeader, strlen(responseHeader));
-}
-
-#if HAVE(SSL)
-void TCPServer::respondWithOK(SSL* ssl)
-{
- ASSERT(ssl);
- read(ssl);
-
- const char* reply = ""
- "HTTP/1.1 200 OK\r\n"
- "Content-Length: 34\r\n\r\n"
- "<script>alert('success!')</script>";
- write(ssl, reply, strlen(reply));
-}
-#endif
-
-Vector<uint8_t> TCPServer::testCertificate()
-{
- // Certificate and private key were generated by running this command:
- // openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
- // and entering this information:
- /*
- Country Name (2 letter code) []:US
- State or Province Name (full name) []:New Mexico
- Locality Name (eg, city) []:Santa Fe
- Organization Name (eg, company) []:Self
- Organizational Unit Name (eg, section) []:Myself
- Common Name (eg, fully qualified host name) []:Me
- Email Address []:m...@example.com
- */
-
- String pemEncodedCertificate(""
- "MIIFgDCCA2gCCQCKHiPRU5MQuDANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMC"
- "VVMxEzARBgNVBAgMCk5ldyBNZXhpY28xETAPBgNVBAcMCFNhbnRhIEZlMQ0wCwYD"
- "VQQKDARTZWxmMQ8wDQYDVQQLDAZNeXNlbGYxCzAJBgNVBAMMAk1lMR0wGwYJKoZI"
- "hvcNAQkBFg5tZUBleGFtcGxlLmNvbTAeFw0xOTAzMjMwNTUwMTRaFw0yMDAzMjIw"
- "NTUwMTRaMIGBMQswCQYDVQQGEwJVUzETMBEGA1UECAwKTmV3IE1leGljbzERMA8G"
- "A1UEBwwIU2FudGEgRmUxDTALBgNVBAoMBFNlbGYxDzANBgNVBAsMBk15c2VsZjEL"
- "MAkGA1UEAwwCTWUxHTAbBgkqhkiG9w0BCQEWDm1lQGV4YW1wbGUuY29tMIICIjAN"
- "BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3rhN4SPg8VY/PtGDNKY3T9JISgby"
- "8YGMJx0vO+YZFZm3G3fsTUsyvDyEHwqp5abCZRB/By1PwWkNrfxn/XP8P034JPlE"
- "6irViuAYQrqUh6k7ZR8CpOM5GEcRZgAUJGGQwNlOkEwaHnMGc8SsHurgDPh5XBpg"
- "bDytd7BJuB1NoI/KJmhcajkAuV3varS+uPLofPHNqe+cL8hNnjZQwHWarP45ks4e"
- "BcOD7twqxuHnVm/FWErpY8Ws5s1MrPThUdDahjEMf+YfDJ9KL8y304yS8J8feCxY"
- "fcH4BvgLtJmBNHJgj3eND/EMZjJgz2FsBjrJk8kKD31cw+4Wp8UF4skWXCf46+mN"
- "OHp13PeSCZLyF4ZAHazUVknDPcc2YNrWVV1i6n3T15kI0T5Z7bstdmALuSkE2cuJ"
- "SVNO6gR+ZsVRTneuQxwWTU0MNEhAPFOX2BhGP5eisgEUzknxMJddFDn9Wxklu1Jh"
- "gkzASA/+3AmlrFZMPhOhjEul0zjgNR5RBl1G8Hz92LAx5UEDBtdLg71I+I8AzQOh"
- "d6LtBekECxA16pSappg5vcW9Z/8N6ZlsHnZ2FztA0nCOflkoO9iejOpcuFN4EVYD"
- "xItwctKw1LCeND/s4kmoRRnXbX7k9O6cI1UUWM595Gsu5tPa33M5AZFCav2gOVuY"
- "djppS0HOfo5hv6cCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAY8EWaAFEfw7OV+oD"
- "XUZSIYXq3EH2E5p3q38AhIOLRjBuB+utyu7Q6rxMMHuw2TtsN+zbAR7yrjfsseA3"
- "4TM1xe4Nk7NVNHRoZQ+C0Iqf9fvcioMvT1tTrma0MhKSjFQpx+PvyLVbD7YdP86L"
- "meehKqU7h1pLGAiGwjoaZ9Ybh6Kuq/MTAHy3D8+wk7B36VBxF6diVlUPZJZQWKJy"
- "MKy9G3sze1ZGt9WeE0AMvkN2HIef0HTKCUZ3eBvecOMijxL0WhWo5Qyf5k6ylCaU"
- "2fx+M8DfDcwFo7tSgLxSK3GCFpxPfiDt6Qk8c9tQn5S1gY3t6LJuwVCFwUIXlNkB"
- "JD7+cZ1Z/tCrEhzj3YCk0uUU8CifoU+4FG+HGFP+SPztsYE055mSj3+Esh+oyoVB"
- "gBH90sE2T1i0eNI8f61oSgwYFeHsf7fC71XEXLFR+GwNdmwqlmwlDZEpTu7BoNN+"
- "q7+Tfk1MRkJlL1PH6Yu/IPhZiNh4tyIqDOtlYfzp577A+OUU+q5PPRFRIsqheOxt"
- "mNlHx4Uzd4U3ITfmogJazjqwYO2viBZY4jUQmyZs75eH/jiUFHWRsha3AdnW5LWa"
- "G3PFnYbW8urH0NSJG/W+/9DA+Y7Aa0cs4TPpuBGZ0NU1W94OoCMo4lkO6H/y6Leu"
- "3vjZD3y9kZk7mre9XHwkI8MdK5s=");
-
- auto decodedCertificate = base64Decode(pemEncodedCertificate);
- return WTFMove(*decodedCertificate);
-}
-
-Vector<uint8_t> TCPServer::testPrivateKey()
-{
- String pemEncodedPrivateKey(""
- "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"
- "qJfU8bbdbu2pi47Y4FdJK0HLffl5Rw==");
-
- auto decodedPrivateKey = base64Decode(pemEncodedPrivateKey);
- return WTFMove(*decodedPrivateKey);
-}
-
-} // namespace TestWebKitAPI
Deleted: trunk/Tools/TestWebKitAPI/TCPServer.h (284417 => 284418)
--- trunk/Tools/TestWebKitAPI/TCPServer.h 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Tools/TestWebKitAPI/TCPServer.h 2021-10-19 00:44:15 UTC (rev 284418)
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2019 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <thread>
-#include <wtf/Function.h>
-#include <wtf/Vector.h>
-
-#if HAVE(SSL)
-struct SSL;
-#endif // HAVE(SSL)
-
-namespace TestWebKitAPI {
-
-class TCPServer {
-public:
- using Socket = int;
- using Port = uint16_t;
- static constexpr Port InvalidPort = 0;
-
- TCPServer(Function<void(Socket)>&&, size_t connections = 1);
-#if HAVE(SSL)
- enum class Protocol : uint8_t {
- HTTPS, HTTPSProxy, HTTPSWithClientCertificateRequest
- };
- TCPServer(Protocol, Function<void(SSL*)>&&, std::optional<uint16_t> maxTLSVersion = std::nullopt, size_t connections = 1);
-#endif // HAVE(SSL)
- ~TCPServer();
-
- Port port() const { return m_port; }
-
-#if HAVE(SSL)
- static void respondWithOK(SSL*);
- static void startSecureConnection(Socket, Function<void(SSL*)>&& secureConnectionHandler, bool requestClientCertificate = false, std::optional<uint16_t> maxTLSVersion = std::nullopt);
-#endif
- static void respondWithChallengeThenOK(Socket);
-
- template<typename T> static Vector<uint8_t> read(T);
- template<typename T> static void write(T, const void*, size_t);
-
- static Vector<uint8_t> testPrivateKey();
- static Vector<uint8_t> testCertificate();
-
-private:
- std::optional<Socket> socketBindListen(size_t connections);
- void listenForConnections(size_t connections);
-
- Port m_port { InvalidPort };
- std::thread m_listeningThread;
- Vector<std::thread> m_connectionThreads;
- Function<void(Socket)> m_connectionHandler;
-};
-
-} // namespace TestWebKitAPI
Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (284417 => 284418)
--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2021-10-19 00:44:15 UTC (rev 284418)
@@ -2398,8 +2398,6 @@
5C7C74CA1FB528D4002F9ABE /* WebViewScheduleInRunLoop.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebViewScheduleInRunLoop.mm; sourceTree = "<group>"; };
5C8BC798218CF3E900813886 /* NetworkProcess.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkProcess.mm; sourceTree = "<group>"; };
5C973F5B1F58EF0A00359C27 /* WebGLPolicy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebGLPolicy.mm; sourceTree = "<group>"; };
- 5C9B548C223C4BF500B150C4 /* TCPServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TCPServer.cpp; sourceTree = "<group>"; };
- 5C9B548D223C4BF500B150C4 /* TCPServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCPServer.h; sourceTree = "<group>"; };
5C9D921D22D7DBF7008E9266 /* Sources.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Sources.txt; sourceTree = "<group>"; };
5C9D921E22D7DBF8008E9266 /* SourcesCocoa.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SourcesCocoa.txt; sourceTree = "<group>"; };
5C9D922822D7DE00008E9266 /* UnifiedSource2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UnifiedSource2.cpp; sourceTree = "<group>"; };
@@ -3310,8 +3308,6 @@
BC575BBF126F5752006F0F12 /* PlatformUtilities.cpp */,
BC131883117114A800B69727 /* PlatformUtilities.h */,
BC90951B125533D700083756 /* PlatformWebView.h */,
- 5C9B548C223C4BF500B150C4 /* TCPServer.cpp */,
- 5C9B548D223C4BF500B150C4 /* TCPServer.h */,
BCB9E7FA112359A300A137E0 /* Test.h */,
BC131AA8117131FC00B69727 /* TestsController.cpp */,
BCB9E7C711234E3A00A137E0 /* TestsController.h */,
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Challenge.mm (284417 => 284418)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Challenge.mm 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Challenge.mm 2021-10-19 00:44:15 UTC (rev 284418)
@@ -27,7 +27,6 @@
#import "HTTPServer.h"
#import "PlatformUtilities.h"
-#import "TCPServer.h"
#import "Test.h"
#import "TestNavigationDelegate.h"
#import "TestWKWebView.h"
@@ -49,7 +48,7 @@
RetainPtr<SecCertificateRef> testCertificate()
{
- auto certificateBytes = TestWebKitAPI::TCPServer::testCertificate();
+ auto certificateBytes = TestWebKitAPI::HTTPServer::testCertificate();
return adoptCF(SecCertificateCreateWithData(nullptr, (__bridge CFDataRef)[NSData dataWithBytes:certificateBytes.data() length:certificateBytes.size()]));
}
@@ -74,7 +73,7 @@
RetainPtr<SecIdentityRef> testIdentity()
{
- return createTestIdentity(TestWebKitAPI::TCPServer::testPrivateKey(), TestWebKitAPI::TCPServer::testCertificate());
+ return createTestIdentity(TestWebKitAPI::HTTPServer::testPrivateKey(), TestWebKitAPI::HTTPServer::testCertificate());
}
RetainPtr<SecIdentityRef> testIdentity2()
@@ -399,7 +398,6 @@
EXPECT_NULL(removedCredential);
}
-#if HAVE(SSL)
static void verifyCertificateAndPublicKey(SecTrustRef trust)
{
EXPECT_NOT_NULL(trust);
@@ -656,5 +654,3 @@
}
} // namespace TestWebKitAPI
-
-#endif // HAVE(SSL)
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ContentRuleListNotification.mm (284417 => 284418)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ContentRuleListNotification.mm 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ContentRuleListNotification.mm 2021-10-19 00:44:15 UTC (rev 284418)
@@ -27,7 +27,6 @@
#import "HTTPServer.h"
#import "PlatformUtilities.h"
-#import "TCPServer.h"
#import "Test.h"
#import "TestNavigationDelegate.h"
#import "TestUIDelegate.h"
@@ -495,39 +494,15 @@
TestWebKitAPI::Util::run(&gotSource);
}
-#if HAVE(SSL)
-
TEST(WebKit, RedirectToPlaintextHTTPSUpgrade)
{
using namespace TestWebKitAPI;
- TCPServer server([connectionCount = 0] (int socket) mutable {
- TCPServer::read(socket);
- if (!connectionCount++) {
- const char* connectionEstablished =
- "HTTP/1.1 200 Connection Established\r\n"
- "Connection: close\r\n"
- "\r\n";
- TCPServer::write(socket, connectionEstablished, strlen(connectionEstablished));
- TCPServer::startSecureConnection(socket, [] (SSL* ssl) {
- TCPServer::read(ssl);
- const char* redirect = ""
- "HTTP/1.1 302 Found\r\n"
- "Location: http://download/\r\n"
- "Content-Length: 0\r\n\r\n";
- TCPServer::write(ssl, redirect, strlen(redirect));
- });
- return;
- }
- const char* content = ""
- "HTTP/1.1 200 OK\r\n"
- "Content-Length: 34\r\n\r\n"
- "<script>alert('success!')</script>";
- TCPServer::write(socket, content, strlen(content));
- }, 2);
+ HTTPServer plaintextServer({ { "http://download/redirectTarget", { "<script>alert('success!')</script>" } } });
+ HTTPServer secureServer({ { "/originalRequest", { 302, { { "Location", "http://download/redirectTarget" } }, "" } } }, HTTPServer::Protocol::HttpsProxy);
auto storeConfiguration = adoptNS([[_WKWebsiteDataStoreConfiguration alloc] initNonPersistentConfiguration]);
- [storeConfiguration setHTTPProxy:[NSURL URLWithString:[NSString stringWithFormat:@"https://127.0.0.1:%d/", server.port()]]];
- [storeConfiguration setHTTPSProxy:[NSURL URLWithString:[NSString stringWithFormat:@"https://127.0.0.1:%d/", server.port()]]];
+ [storeConfiguration setHTTPProxy:[NSURL URLWithString:[NSString stringWithFormat:@"http://127.0.0.1:%d/", plaintextServer.port()]]];
+ [storeConfiguration setHTTPSProxy:[NSURL URLWithString:[NSString stringWithFormat:@"https://127.0.0.1:%d/", secureServer.port()]]];
[storeConfiguration setAllowsServerPreconnect:NO];
auto viewConfiguration = adoptNS([WKWebViewConfiguration new]);
[viewConfiguration setWebsiteDataStore:adoptNS([[WKWebsiteDataStore alloc] _initWithConfiguration:storeConfiguration.get()]).get()];
@@ -537,8 +512,6 @@
completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
};
webView.get().navigationDelegate = delegate.get();
- [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://download/"]]];
+ [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://download/originalRequest"]]];
EXPECT_WK_STREQ([webView _test_waitForAlert], "success!");
}
-
-#endif
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/HSTS.mm (284417 => 284418)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/HSTS.mm 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/HSTS.mm 2021-10-19 00:44:15 UTC (rev 284418)
@@ -27,7 +27,6 @@
#import "HTTPServer.h"
#import "PlatformUtilities.h"
-#import "TCPServer.h"
#import "TestNavigationDelegate.h"
#import "TestUIDelegate.h"
#import "Utilities.h"
@@ -37,16 +36,10 @@
namespace TestWebKitAPI {
-#if HAVE(SSL)
+#if HAVE(CFNETWORK_NSURLSESSION_HSTS_WITH_UNTRUSTED_ROOT)
-static bool hasRadar80550123()
+std::pair<RetainPtr<WKWebView>, RetainPtr<TestNavigationDelegate>> hstsWebViewAndDelegate(const HTTPServer& httpsServer, const HTTPServer& httpServer)
{
- // FIXME: Replace this with a HAS macro once rdar://80550123 is in a build.
- return [[NSURLSessionConfiguration ephemeralSessionConfiguration] respondsToSelector:@selector(_allowsHSTSWithUntrustedRootCertificate)];
-}
-
-std::pair<RetainPtr<WKWebView>, RetainPtr<TestNavigationDelegate>> hstsWebViewAndDelegate(const TCPServer& httpsServer, const HTTPServer& httpServer)
-{
auto storeConfiguration = adoptNS([[_WKWebsiteDataStoreConfiguration alloc] initNonPersistentConfiguration]);
[storeConfiguration setHTTPSProxy:[NSURL URLWithString:[NSString stringWithFormat:@"https://127.0.0.1:%d/", httpsServer.port()]]];
[storeConfiguration setHTTPProxy:[NSURL URLWithString:[NSString stringWithFormat:@"http://127.0.0.1:%d/", httpServer.port()]]];
@@ -65,29 +58,15 @@
return { WTFMove(webView), WTFMove(delegate) };
}
-static TCPServer hstsServer(size_t replies)
+static HTTPServer hstsServer()
{
- // FIXME: Use nw_framer_t to support HTTPS proxies in HTTPServer and remove TCPServer.
- return TCPServer(TCPServer::Protocol::HTTPSProxy, [=] (SSL* ssl) {
- for (size_t i = 0; i < replies; i++) {
- TCPServer::read(ssl);
- const char* response =
- "HTTP/1.1 200 OK\r\n"
- "Content-Length: 0\r\n"
- "Strict-Transport-Security: max-age=31536000\r\n"
- "\r\n";
- TCPServer::write(ssl, response, strlen(response));
- }
- });
+ return HTTPServer({{ "/", {{{"Strict-Transport-Security" , "max-age=31536000"}}, "" }}}, HTTPServer::Protocol::HttpsProxy);
}
TEST(HSTS, Basic)
{
- if (!hasRadar80550123())
- return;
+ auto httpsServer = hstsServer();
- auto httpsServer = hstsServer(2);
-
HTTPServer httpServer({{ "http://example.com/", { {{ "Strict-Transport-Security", "max-age=31536000"}}, "hi" }}});
auto [webView, delegate] = hstsWebViewAndDelegate(httpsServer, httpServer);
@@ -114,11 +93,8 @@
TEST(HSTS, ThirdParty)
{
- if (!hasRadar80550123())
- return;
+ auto httpsServer = hstsServer();
- auto httpsServer = hstsServer(1);
-
const char* html = "<script>"
"var xhr = new XMLHttpRequest();"
"xhr.open('GET', 'http://example.com/');"
@@ -144,11 +120,8 @@
TEST(HSTS, CrossOriginRedirect)
{
- if (!hasRadar80550123())
- return;
+ auto httpsServer = hstsServer();
- auto httpsServer = hstsServer(2);
-
HTTPServer httpServer({
{ "http://example.com/", { "hi" }},
{ "http://example.org/", { 301, {{ "Location", "http://example.com/" }} } },
@@ -166,6 +139,6 @@
EXPECT_EQ(httpServer.totalRequests(), 1u);
}
-#endif // HAVE(SSL)
+#endif // HAVE(CFNETWORK_NSURLSESSION_HSTS_WITH_UNTRUSTED_ROOT)
} // namespace TestWebKitAPI
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerTCPServer.h (284417 => 284418)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerTCPServer.h 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerTCPServer.h 2021-10-19 00:44:15 UTC (rev 284418)
@@ -23,10 +23,10 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
-#import "TCPServer.h"
+#import "HTTPServer.h"
#import <wtf/text/WTFString.h>
-class ServiceWorkerTCPServer : public TestWebKitAPI::TCPServer {
+class ServiceWorkerTCPServer : public TestWebKitAPI::HTTPServer {
public:
struct ResourceInfo {
const char* mimeType { nullptr };
@@ -40,28 +40,13 @@
: ServiceWorkerTCPServer(WTFMove(firstConnection), WTFMove(secondConnection), { }, connections, WTFMove(expectedUserAgents)) { }
ServiceWorkerTCPServer(Vector<ResourceInfo>&& firstConnection, Vector<ResourceInfo>&& secondConnection, Vector<ResourceInfo>&& thirdConnection, size_t connections = 3, Vector<String>&& expectedUserAgents = { })
- : TCPServer([this, firstConnection = WTFMove(firstConnection), secondConnection = WTFMove(secondConnection), thirdConnection = WTFMove(thirdConnection), expectedUserAgents = WTFMove(expectedUserAgents)] (int socket) mutable {
- auto respondToRequests = [this, socket] (Vector<ResourceInfo>&& vector, const String& expectedUserAgent) {
- for (auto& info : vector) {
- auto request = TCPServer::read(socket);
- if (!expectedUserAgent.isNull()) {
- EXPECT_TRUE(strnstr((const char*)request.data(), makeString("User-Agent: ", expectedUserAgent).utf8().data(), request.size()));
- m_userAgentsChecked++;
- }
- NSString *format = @"HTTP/1.1 200 OK\r\n"
- "Content-Type: %s\r\n"
- "Content-Length: %d\r\n\r\n"
- "%s";
- NSString *response = [NSString stringWithFormat:format, info.mimeType, strlen(info.response), info.response];
- TCPServer::write(socket, response.UTF8String, response.length);
- }
- };
+ : TestWebKitAPI::HTTPServer([this, firstConnection = WTFMove(firstConnection), secondConnection = WTFMove(secondConnection), thirdConnection = WTFMove(thirdConnection), expectedUserAgents = WTFMove(expectedUserAgents)] (TestWebKitAPI::Connection connection) mutable {
if (!firstConnection.isEmpty())
- return respondToRequests(std::exchange(firstConnection, { }), !expectedUserAgents.isEmpty() ? expectedUserAgents[0] : String());
+ return respondToRequests(connection, std::exchange(firstConnection, { }), !expectedUserAgents.isEmpty() ? expectedUserAgents[0] : String());
if (!secondConnection.isEmpty())
- return respondToRequests(std::exchange(secondConnection, { }), expectedUserAgents.size() > 1 ? expectedUserAgents[1] : String());
- respondToRequests(std::exchange(thirdConnection, { }), { });
- }, connections) { }
+ return respondToRequests(connection, std::exchange(secondConnection, { }), expectedUserAgents.size() > 1 ? expectedUserAgents[1] : String());
+ respondToRequests(connection, std::exchange(thirdConnection, { }), { });
+ }) { }
NSURLRequest *request() { return requestWithFormat(@"http://127.0.0.1:%d/main.html"); }
NSURLRequest *requestWithLocalhost() { return requestWithFormat(@"http://localhost:%d/main.html"); }
@@ -69,6 +54,29 @@
size_t userAgentsChecked() const { return m_userAgentsChecked; }
private:
+ void respondToRequests(TestWebKitAPI::Connection& connection, Vector<ResourceInfo>&& vector, const String& expectedUserAgent, size_t vectorIndex = 0)
+ {
+ if (vectorIndex >= vector.size()) {
+ connection.terminate();
+ return;
+ }
+ connection.receiveHTTPRequest([=, vector = WTFMove(vector)] (Vector<char>&& request) mutable {
+ if (!expectedUserAgent.isNull()) {
+ EXPECT_TRUE(strnstr((const char*)request.data(), makeString("User-Agent: ", expectedUserAgent).utf8().data(), request.size()));
+ m_userAgentsChecked++;
+ }
+ NSString *format = @"HTTP/1.1 200 OK\r\n"
+ "Content-Type: %s\r\n"
+ "Content-Length: %d\r\n\r\n"
+ "%s";
+ auto& info = vector[vectorIndex];
+ NSString *response = [NSString stringWithFormat:format, info.mimeType, strlen(info.response), info.response];
+ connection.send(response, [=, vector = WTFMove(vector)] () mutable {
+ respondToRequests(connection, WTFMove(vector), expectedUserAgent, vectorIndex + 1);
+ });
+ });
+ }
+
NSURLRequest *requestWithFormat(NSString *format) { return [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:format, port()]]]; }
- std::atomic<size_t> m_userAgentsChecked { 0 };
+ size_t m_userAgentsChecked { 0 };
};
Modified: trunk/Tools/TestWebKitAPI/cocoa/HTTPServer.h (284417 => 284418)
--- trunk/Tools/TestWebKitAPI/cocoa/HTTPServer.h 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Tools/TestWebKitAPI/cocoa/HTTPServer.h 2021-10-19 00:44:15 UTC (rev 284418)
@@ -32,6 +32,8 @@
#import <wtf/RetainPtr.h>
#import <wtf/text/StringHash.h>
+OBJC_CLASS NSURLRequest;
+
namespace TestWebKitAPI {
class Connection;
@@ -58,6 +60,9 @@
static void respondWithChallengeThenOK(Connection);
static String parsePath(const Vector<char>& request);
+ static Vector<uint8_t> testPrivateKey();
+ static Vector<uint8_t> testCertificate();
+
private:
static RetainPtr<nw_parameters_t> listenerParameters(Protocol, CertificateVerifier&&, RetainPtr<SecIdentityRef>&&, std::optional<uint16_t> port);
static void respondToRequests(Connection, Ref<RequestData>);
Modified: trunk/Tools/TestWebKitAPI/cocoa/HTTPServer.mm (284417 => 284418)
--- trunk/Tools/TestWebKitAPI/cocoa/HTTPServer.mm 2021-10-19 00:35:22 UTC (rev 284417)
+++ trunk/Tools/TestWebKitAPI/cocoa/HTTPServer.mm 2021-10-19 00:44:15 UTC (rev 284418)
@@ -544,4 +544,113 @@
});
}
+Vector<uint8_t> HTTPServer::testCertificate()
+{
+ // Certificate and private key were generated by running this command:
+ // openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
+ // and entering this information:
+ /*
+ Country Name (2 letter code) []:US
+ State or Province Name (full name) []:New Mexico
+ Locality Name (eg, city) []:Santa Fe
+ Organization Name (eg, company) []:Self
+ Organizational Unit Name (eg, section) []:Myself
+ Common Name (eg, fully qualified host name) []:Me
+ Email Address []:m...@example.com
+ */
+
+ String pemEncodedCertificate(""
+ "MIIFgDCCA2gCCQCKHiPRU5MQuDANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMC"
+ "VVMxEzARBgNVBAgMCk5ldyBNZXhpY28xETAPBgNVBAcMCFNhbnRhIEZlMQ0wCwYD"
+ "VQQKDARTZWxmMQ8wDQYDVQQLDAZNeXNlbGYxCzAJBgNVBAMMAk1lMR0wGwYJKoZI"
+ "hvcNAQkBFg5tZUBleGFtcGxlLmNvbTAeFw0xOTAzMjMwNTUwMTRaFw0yMDAzMjIw"
+ "NTUwMTRaMIGBMQswCQYDVQQGEwJVUzETMBEGA1UECAwKTmV3IE1leGljbzERMA8G"
+ "A1UEBwwIU2FudGEgRmUxDTALBgNVBAoMBFNlbGYxDzANBgNVBAsMBk15c2VsZjEL"
+ "MAkGA1UEAwwCTWUxHTAbBgkqhkiG9w0BCQEWDm1lQGV4YW1wbGUuY29tMIICIjAN"
+ "BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3rhN4SPg8VY/PtGDNKY3T9JISgby"
+ "8YGMJx0vO+YZFZm3G3fsTUsyvDyEHwqp5abCZRB/By1PwWkNrfxn/XP8P034JPlE"
+ "6irViuAYQrqUh6k7ZR8CpOM5GEcRZgAUJGGQwNlOkEwaHnMGc8SsHurgDPh5XBpg"
+ "bDytd7BJuB1NoI/KJmhcajkAuV3varS+uPLofPHNqe+cL8hNnjZQwHWarP45ks4e"
+ "BcOD7twqxuHnVm/FWErpY8Ws5s1MrPThUdDahjEMf+YfDJ9KL8y304yS8J8feCxY"
+ "fcH4BvgLtJmBNHJgj3eND/EMZjJgz2FsBjrJk8kKD31cw+4Wp8UF4skWXCf46+mN"
+ "OHp13PeSCZLyF4ZAHazUVknDPcc2YNrWVV1i6n3T15kI0T5Z7bstdmALuSkE2cuJ"
+ "SVNO6gR+ZsVRTneuQxwWTU0MNEhAPFOX2BhGP5eisgEUzknxMJddFDn9Wxklu1Jh"
+ "gkzASA/+3AmlrFZMPhOhjEul0zjgNR5RBl1G8Hz92LAx5UEDBtdLg71I+I8AzQOh"
+ "d6LtBekECxA16pSappg5vcW9Z/8N6ZlsHnZ2FztA0nCOflkoO9iejOpcuFN4EVYD"
+ "xItwctKw1LCeND/s4kmoRRnXbX7k9O6cI1UUWM595Gsu5tPa33M5AZFCav2gOVuY"
+ "djppS0HOfo5hv6cCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAY8EWaAFEfw7OV+oD"
+ "XUZSIYXq3EH2E5p3q38AhIOLRjBuB+utyu7Q6rxMMHuw2TtsN+zbAR7yrjfsseA3"
+ "4TM1xe4Nk7NVNHRoZQ+C0Iqf9fvcioMvT1tTrma0MhKSjFQpx+PvyLVbD7YdP86L"
+ "meehKqU7h1pLGAiGwjoaZ9Ybh6Kuq/MTAHy3D8+wk7B36VBxF6diVlUPZJZQWKJy"
+ "MKy9G3sze1ZGt9WeE0AMvkN2HIef0HTKCUZ3eBvecOMijxL0WhWo5Qyf5k6ylCaU"
+ "2fx+M8DfDcwFo7tSgLxSK3GCFpxPfiDt6Qk8c9tQn5S1gY3t6LJuwVCFwUIXlNkB"
+ "JD7+cZ1Z/tCrEhzj3YCk0uUU8CifoU+4FG+HGFP+SPztsYE055mSj3+Esh+oyoVB"
+ "gBH90sE2T1i0eNI8f61oSgwYFeHsf7fC71XEXLFR+GwNdmwqlmwlDZEpTu7BoNN+"
+ "q7+Tfk1MRkJlL1PH6Yu/IPhZiNh4tyIqDOtlYfzp577A+OUU+q5PPRFRIsqheOxt"
+ "mNlHx4Uzd4U3ITfmogJazjqwYO2viBZY4jUQmyZs75eH/jiUFHWRsha3AdnW5LWa"
+ "G3PFnYbW8urH0NSJG/W+/9DA+Y7Aa0cs4TPpuBGZ0NU1W94OoCMo4lkO6H/y6Leu"
+ "3vjZD3y9kZk7mre9XHwkI8MdK5s=");
+
+ auto decodedCertificate = base64Decode(pemEncodedCertificate);
+ return WTFMove(*decodedCertificate);
+}
+
+Vector<uint8_t> HTTPServer::testPrivateKey()
+{
+ String pemEncodedPrivateKey(""
+ "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"
+ "qJfU8bbdbu2pi47Y4FdJK0HLffl5Rw==");
+
+ auto decodedPrivateKey = base64Decode(pemEncodedPrivateKey);
+ return WTFMove(*decodedPrivateKey);
+}
+
} // namespace TestWebKitAPI