From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DU0PR08MB9934.eurprd08.prod.outlook.com (2603:10a6:10:402::21) by PAXPR08MB6942.eurprd08.prod.outlook.com with HTTPS; Mon, 31 Aug 2026 14:07:05 +0000 Received: from AS4P195CA0021.EURP195.PROD.OUTLOOK.COM (2603:10a6:20b:5d6::9) by DU0PR08MB9934.eurprd08.prod.outlook.com (2603:10a6:10:402::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Mon, 31 Aug 2026 14:07:00 +0000 Received: from AMS1EPF00000047.eurprd04.prod.outlook.com (2603:10a6:20b:5d6:cafe::2a) by AS4P195CA0021.outlook.office365.com (2603:10a6:20b:5d6::9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.360.13 via Frontend Transport; Mon, 31 Aug 2026 14:07:00 +0000 Authentication-Results: spf=softfail (sender IP is 99.81.216.78) smtp.mailfrom=openvz.org; dkim=pass (signature was verified) header.d=openvz.org;dmarc=pass action=none header.from=openvz.org;compauth=pass reason=100 Received-SPF: SoftFail (protection.outlook.com: domain of transitioning openvz.org discourages use of 99.81.216.78 as permitted sender) Received: from nat.eu.perception-point.io (99.81.216.78) by AMS1EPF00000047.mail.protection.outlook.com (10.167.16.135) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Mon, 31 Aug 2026 14:06:57 +0000 X-PERCEPTION-POINT-VERDICT: CLN X-PERCEPTION-POINT-SPF: X-PERCEPTION-POINT-SPAM: PASS X-PERCEPTION-POINT-SENDER-IP: 2a00:1450:4864:20::32c X-PP-Forefront-Antispam-Report: CIP:2a00:1450:4864:20::32c;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail-wm1-x32c.google.com;PTR:mail-wm1-x32c.google.com;CAT:NONE;SFS:(13230040)(704161411799003)(3072899012)(12012899012)(2092899012)(6059299003)(43022699015)(82310400026)(19002099009)(16102099003)(10067099003)(5063699009)(55112099003)(18002099003)(22082099003)(57112099003);DIR:INB; Received: from AM0PR07CU002.outbound.protection.outlook.com (mail-am0pr07cu00203.outbound.protection.outlook.com [40.93.65.67]) by inbound-smtp.eu-west-1.amazonaws.com with SMTP id ijtnbl223u9avm9tc7rmg84gd24hbghc7mpi6781; Mon, 31 Aug 2026 14:06:55 +0000 (UTC) X-SES-Spam-Verdict: PASS X-SES-Virus-Verdict: PASS Received-SPF: softfail (spfCheck: transitioning domain of openvz.org does not designate 40.93.65.67 as permitted sender) client-ip=40.93.65.67; envelope-from=den@openvz.org; helo=AM0PR07CU002.outbound.protection.outlook.com; Authentication-Results-Original: amazonses.com; spf=softfail (spfCheck: transitioning domain of openvz.org does not designate 40.93.65.67 as permitted sender) client-ip=40.93.65.67; envelope-from=den@openvz.org; helo=AM0PR07CU002.outbound.protection.outlook.com; dkim=pass header.i=@openvz.org; dmarc=pass header.from=openvz.org; X-SES-RECEIPT: AEFBQUFBQUFBQUFHMHNVaDZhbnc1TXZTOHB3R1piMFNvU3dLOEZabmg2dWdtMjdSOFQwY251MmZpUEJmWDhCcHhNVU1aR2pvcEZ4NmJuS0pEajFYOVRNbWIrNytMQ3hmdk41SEZWcjljK0lZVVo5a3NiQU5iMFE3TGlNTE85ejVWamdvejNRZGxBeEJ3T1kxeWJtRG5EOEJQam9QdVhiNEJFbDlNbW45SCtnVlpTb2ExVyt4SFJ6MUsrMk44Y3lKZWFJbTZGckdBSkdHTkdnS05ERW9HUHh0QUw3VFVaZ0JDdU1zRVZoRTB2TzFDNnZmRHZkY0tEcm5ETXdkRzFZbkxWT0ZUNHoxeGdkOGFONTdVL1hxeXluR2diR3luZ2QzZUlwbmQxdjFxUkN6WkF6WGwzeElvUmc9PQ== X-SES-DKIM-SIGNATURE: a=rsa-sha256; q=dns/txt; b=7Pn2Gnfmnc56iPQHxC2t3/ilvMjUbceOwtG/95GDn4R7ij7TYZlKXOSFNDOyJWuvLb6z/VNXOa/InZ1MM09W66Ym2o3p0jbzZyj0QXyNw6x8yzQ8xFFMvLyqMQd6Pmx/xGUkO7iw1pcgNMUGn4pyO3y/x02yEqaZwQBg+739teM=; c=relaxed/simple; s=shh3fegwg5fppqsuzphvschd53n6ihuv; d=amazonses.com; t=1788185215; v=1; bh=cuUjm+vP6d10Z95PcyKWZeQo/WykhTOfsPQPYYpY2uE=; h=From:To:Cc:Bcc:Subject:Date:Message-ID:MIME-Version:Content-Type:X-SES-RECEIPT; Received: from AS4P190CA0014.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:5de::18) by DU0PR08MB9203.eurprd08.prod.outlook.com (2603:10a6:10:417::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Mon, 31 Aug 2026 14:06:48 +0000 Received: from AMS1EPF0000009E.eurprd02.prod.outlook.com (2603:10a6:20b:5de:cafe::65) by AS4P190CA0014.outlook.office365.com (2603:10a6:20b:5de::18) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.360.13 via Frontend Transport; Mon, 31 Aug 2026 14:06:48 +0000 Authentication-Results-Original: spf=pass (sender IP is 2a00:1450:4864:20::32c) smtp.mailfrom=openvz.org; dkim=pass (signature was verified) header.d=openvz.org;dmarc=pass action=none header.from=openvz.org;compauth=pass reason=100 Received-SPF: Pass (protection.outlook.com: domain of openvz.org designates 2a00:1450:4864:20::32c as permitted sender) receiver=protection.outlook.com; client-ip=2a00:1450:4864:20::32c; helo=mail-wm1-x32c.google.com; pr=C Received: from mail-wm1-x32c.google.com (2a00:1450:4864:20::32c) by AMS1EPF0000009E.mail.protection.outlook.com (2603:10a6:20f:fff8::20b) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Mon, 31 Aug 2026 14:06:48 +0000 Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-49cd77e0f95so11182405e9.3 for ; Mon, 31 Aug 2026 07:06:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1788185207; x=1788790007; darn=virtuozzo.com; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=Gsx67yag+lhPFh6nWc2T17Y8vNfYKK4Qvts+cL5OB+I=; b=H/XkVmceQxri1YKSrbXUeTDNiByj7+CFDgfgWLZzGf/xyQTStSgtmhn8+qVLkUMF/3 gFWLqiknS4Te1TF8pDmX3c/MKIjAxs7jVSh9oE6qkbS1dp5luZAHqrgQs02sJAvNdOTw rSiglOlhc52Pmtk8vzA0/p1dBaLdiLVPmyv21fXJ8ebXSbqS/o7Wl4yYOtTMeNrMMq0N gdllAPWb8F/4xwo7pdQCHSSwZ/YQUP1EOa8kb8NxInbUdeGLoXNYTnrUMvPZWWZZ8tMY lrVWaSR1dbPox/fTAwv3yLtSYbjk4VxmvVytitMK02Ltk1ac5X/Sak9bJqmJMj7JyRHI 2OZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788185207; x=1788790007; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Gsx67yag+lhPFh6nWc2T17Y8vNfYKK4Qvts+cL5OB+I=; b=pOP+TwML1kj0/z2wQj6kN/HSfmJId6T3OetVlr7v0KMj9Isv848FVTvcw+DBOqahVE WWnwx99PA+PG0AsjO2xu3SQTl1iA3HACBfK0hYj1dpAJQvEa5X+2R624zgWoolQebsA1 Y8ptnETPkDQYSBn8+rhOQ+Mvn2Yw5grJCQ0FebbYtcnZB7hE36jO/a20jq0z1515aEpi MLLWssSQvvZyPqbxqxUKYgTH+EmQwav9r8EuPSyuCGkSrxNvsvb70nHvs5QxrfEwCz5b YcLlE9/ISG+/y0AveBVcPN2/37xZFNMAddeOjp7sZERK9io7tZuX2P0C+IrsKnj3HOpZ ylOA== X-Gm-Message-State: AFuF++kB/2QaiIh7PnUzGsplJSzzjOnyGC5Zp1jRGFDFnIdevORrgJL4 YXVwjF73o2CjBgTkrXvblVsmcp9gAFQPD+65B/RQ4uVSfcN43dcgxK32tXHwVVqTuWn0TVAmD+x B6FbXWa4= X-Gm-Gg: AR+sD128PH6WS/gqBMF3BEtNIDXcQb1BrsXSg14YL1/G1Ew+KuxHG7U22xXrHFJsIDe tGSPdoIBNEeOVC5EanE4J/PE8QheuprjvcFYuCdRK4nEPDNJR7cEau07YVo+c0StdjW1TOcK3aK GHBYA/H2RrY8oIT+bHjhkVu5O8jgVO2rlVmy9AgMME4SddCxS7VC2dUiZy7p/NYR0OwVmlRfkHk eiF8uqWpZO8mmow2iNwPOlO+IU9psOC0NKXMSxRLE/4F6uy1J2cwzPy/hOOwYYrgsn4uH/gSgRK 0JqGirGfqheEdcRSHhp1cEejrGBQHZXxT5ljkk+xPuk2eR1Uowbboe4qOYncTGAqPL1/fugmgzi kLib97ez/oT6AxBixuXbEnVEz8tDb9zWEqQZoBfekj+uF0ezzX8y7OAZCGhLXh3QoxR8fXHJyd4 Q2pltXzdo3tJHsP6hFb+1QKBiG5fk9pTeHtBTzyKNXF4hUEx44TseThc/3 X-Received: by 2002:a05:600c:6088:b0:49b:2796:be30 with SMTP id 5b1f17b1804b1-49b91c433a4mr422406655e9.11.1788185207537; Mon, 31 Aug 2026 07:06:47 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:3bc1:c53b:30b:203e]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49cd2fa779esm133185495e9.2.2026.08.31.07.06.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2026 07:06:47 -0700 (PDT) From: "Denis V. Lunev" To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org Subject: [PATCH hci-8.1 4/6] tests/unit: add websock handshake test #VSTOR-143316 Date: Mon, 31 Aug 2026 16:06:35 +0200 Message-ID: <20260831140637.1204714-5-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831140637.1204714-1-den@openvz.org> References: <20260831140637.1204714-1-den@openvz.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 1 X-EOPTenantAttributedMessage: 0bc7f26d-0264-416e-a6fc-8352af79c58f:1 X-MS-TrafficTypeDiagnostic: AMS1EPF0000009E:EE_|DU0PR08MB9203:EE_|AMS1EPF00000047:EE_|DU0PR08MB9934:EE_|PAXPR08MB6942:EE_ X-MS-Office365-Filtering-Correlation-Id: 8e26d740-7c38-4041-d57e-08df07691efa X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr X-MS-Exchange-AtpMessageProperties: SA|SL X-PERCEPTION-POINT-CUSTOM: vzpp X-Microsoft-Antispam-Untrusted: BCL:0;ARA:13230040|704161411799003|3072899012|12012899012|2092899012|6059299003|43022699015|82310400026|19002099009|16102099003|10067099003|5063699009|55112099003|18002099003|22082099003|57112099003; X-Microsoft-Antispam-Message-Info-Original: =?utf-8?B?cU9hRlpoMk15elg2eTdhUDVKVGUwMlNyYldueHEvZDhSUEpOd1Z5ekJrT2V0?= =?utf-8?B?eGREVVpta09DL0RHTjQxTEdwc09KZC8zR0xCM24zUzFBSXhXNzMvYmlLQ0U4?= =?utf-8?B?bzRkM2RPZEt6TklKM1YxejZxR0hNTm0vSm1kaUZ6Y216WmRxT2Y5dndCckFs?= =?utf-8?B?eXREQ1lKbys2QWQxUCtVa0w5QjY1ZXRwcVF2R3lURVAwRTA3a0o0MVFpQk55?= =?utf-8?B?K2wrVGN4aC9LcWdTbHdHUnZkQXhJS1VJK1Uzd2kwWWVJU01BekU2alRJUEs5?= =?utf-8?B?M1lTUWM5VmhDUGVycWhOTm1CaktKR2JvTWxrSjV6bkNTb0dzLzJaMDQ0Q0o4?= =?utf-8?B?SVRSR2EzSzJoMk5IWERhcGN0czh6c0NraG1BU0hNWWt0V043M0Z0SFpiNWR4?= =?utf-8?B?U1E2S2p3Z0Jvc2M3K3pQZmYvY3pVZ1FCQVVZSmV3eG1LMFdpMytaZFNjOU9P?= =?utf-8?B?ZnNFNC94RzhGdHl4UzcyRzdjYzh3Nm0veSt1WGVlYkY3QkFoanBCcE5Qazhl?= =?utf-8?B?eTVtdGNWbnFKTEE2V2p4dUt4OHIxTnJzckF0MGtHWmVsNmNKRzE5NUdhK3dO?= =?utf-8?B?eHgrdVl2bVJkdnRIYVRpL2JDczU2WGwvR05aZHdrRHJOb2hZSUxYbHdZL2d4?= =?utf-8?B?eWdWYWlON3AxVmpXRnY1YWhDbEZ1S3FaKzJteVFNc2p6cjhuL0ZaeGNacHF5?= =?utf-8?B?YkhDV2dhRFdDQ3dPcEZqR1cxTE1oTlBSN2tHd0V4R0JOK2R5WDZTUXhPVlV1?= =?utf-8?B?dml2UDZ5MVZXeXVJKzg3c1dpSkQ0emZVZ0t3bG85T0h0TnRYSU5zU0wyUkdC?= =?utf-8?B?RmMvV3VBdWk0RVpwbmZpNUhmVzBmaTBFU28zSjBTd3h0WTdUa21Xd0FMbWRx?= =?utf-8?B?N2hRZnhNU2RsaFVFVm1TZE5DZE81d3MzUzlPZFRoMTRONDR0eWwyM3Q1NnFH?= =?utf-8?B?aTZXYVMvNmhRZnRkVFhJN2RiVERHTzdsYWpsZHJDM2EvN0NXVGxOYThkeE9x?= =?utf-8?B?UlpxOHcwOXd2OE9XNEIxS25Pd1NYbzZGUkRJbVpmV25jNlNKZVRjdFZCbTlx?= =?utf-8?B?TFkrSkxqOEY2aWxpNG5wNGRUZ2huUXJybjBTM0NRdUZnenlWay9BNTdidkE5?= =?utf-8?B?NXV1TUk3elk1K09FWEhGaktNREVMRmhVNnJTaHlXbzI0VUZRNGNZNkpzWHJp?= =?utf-8?B?cFpYakt5eEh0ZTFKRGF0NFRiZkRhTmd5UXZFYnZ4cys1Y0lqRW13L096bVNK?= =?utf-8?B?OHRlanpid2NQMHdoNzdCMEFJSldVd21LU1RkcXFyNUszVUorRU5IYTl5dWlx?= =?utf-8?B?OFZxTU5NNkFBeHJ6MVgrRkhPYVprWTloKzdQT0lrOXZhR0F4RVJoaW1MNlhC?= =?utf-8?B?Y3JPZlB4bmZVSG1CYlpieXlLYUV2cTJScnRSbU5KT3RjVE42cVhEelBBcjA4?= =?utf-8?B?dTJINmJzb0I0Tkk2aDZvT0ZFRjNkUVNsZnZLRm1FMzBROVlKclE0T2dVWmJX?= =?utf-8?B?azNJbU53UTg3dTVrRjFpOVhxcTA4M29Wb1pCcmtRM3d5Z1BJVzM4Sy9GS0ZG?= =?utf-8?B?aFJ4UkNZMzJLM1dhWGJiUHkwUTI0cU43UlhvNVZ6aGc1V3NaWmVCWGd1T2FT?= =?utf-8?B?NjQ5R1pLMkQ5L3pjTWNCOWZKMUovYkxKTE0zanJVeUIvd0FvNXBnb0VzN3Q4?= =?utf-8?B?UDBESEtpVTEwY3dyY1R5Rjh4M0RjRW5HV3BmRmoyT3FsRFpCazdyc2NuSXlL?= =?utf-8?B?OWVUU2pKVnRrWG5NR2JtYWJDZTd3M3Z0V2lvVXczbHAwZ2QzODN2eTBxOU5r?= =?utf-8?B?dTQ1MklMNVp6T3djQUNWcitwQ2c2RjBIQ2ZWaWdWYUs0c2RsVk1XNDJMTTFP?= =?utf-8?B?ak45bkVXTWtPUjFOeTlqZ1VkaTVmWDI4OXZtUTV5KzNKZnJ3L1piVUU3K1hN?= =?utf-8?B?RG5yRnZoYUU2REJHeXVhd1dxdTljOEpzdW9KR3V1eXNPdzl1a2hyNG53MlRT?= =?utf-8?B?QUJpbFNBb0lGZUtIaTVtVStSWlJOejMvZDNQYmtzVXJuVUJ6RnovaDNXQ1Ar?= =?utf-8?B?WHJqeEtDZEZDc0krdjBTUmF2TXRVZlArVWtHc0RmcVZMRXgyejJ6T201VE5O?= =?utf-8?B?dG5SZmRHNkNyKzdVVUpRZlVzNGU2b0d0cWtNYXI4cDhpYmNQVnlkVXVjbzg1?= =?utf-8?B?dTFWWWN0MDF6Rmg3ejI3QlhyNjNjdlV3R2dYdzY3S1dHNER1MHQ1SXYvaWhL?= =?utf-8?B?TkM0Z2pzd2VYRVhkRWg1WU1TUGxoK21lN3RTcUp4RkVDTjVDRll3cXVjSkpj?= =?utf-8?B?VXdKakVqcXVJUmVtMERMVG9JQmZERUhqcU1wcFE1RVVra0ROTWtrVkdUZTlj?= =?utf-8?B?bTRqb1FXUEdxb2xraUJyY3p6RjNNOUJwc1Z5ZkN5QzdkS3RxckdtT2huNXN6?= =?utf-8?B?MHVtNFNKUUtORm5ZYmhEdW83Y3ZBV25xakU1S2R1cjBwazhkOFN1T3lQTzhG?= =?utf-8?B?c1dpTDhjU3JSclc5YXRlRDV6WlFXSU9OOGUxVUpQdnNoVm1uMHFscURQTU9r?= =?utf-8?B?VFBTWGh3UmN4b2o3RjZmdC92eUZvdVBkZFNMZFFFc1pTeHhlVVBJa0VuSDZF?= =?utf-8?B?Wm1TMFUvNVo5S3pkOW5IeVcyd2NzemtQNTFQQ2Y1NEF4aGpoSkhKM0FHNFZH?= =?utf-8?B?R0hQZGRjd2FyZnRkU1hRZW9HZ2JSQmV2ZTdOTFk2R3U2ME9XQ3hhdTd5a2pq?= =?utf-8?B?a0Z2MHFTaTlaaFlZVFYwbjdxT01oc2J0eXB0STlxZE5FZGdxQkE3TDMxdktx?= =?utf-8?B?OUhrcXcranNCSUV6a0JuOTlubWRybDF2K3V5WW1yeXhueWxtek92czNOaXBa?= =?utf-8?B?cmZEdFNCRGxDcUtqT2pXUkJHckwrejZac2VhYTEvbDJWZm1MU0dUVnFwaGpt?= =?utf-8?Q?7XyKi8UYFWiq8Lz9?= X-Forefront-Antispam-Report-Untrusted: CIP:2a00:1450:4864:20::32c;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail-wm1-x32c.google.com;PTR:mail-wm1-x32c.google.com;CAT:NONE;SFS:(13230040)(704161411799003)(3072899012)(12012899012)(2092899012)(6059299003)(43022699015)(82310400026)(19002099009)(16102099003)(10067099003)(5063699009)(55112099003)(18002099003)(22082099003)(57112099003);DIR:INB; X-Auto-Response-Suppress: DR, OOF, AutoReply X-Exchange-RoutingPolicyChecked: Xx7M6GF3s3BGoxaIBuN8d0rYeAiT9RFU4yRHyiHv0PdLDf5h2IvQbIOWqW/5SYry6o5rNDGR7v2Ts3/cVlAQ+lgvuDoFmV6FN+7lEKqsCHDRvwr3lzJbfBLPb9N1J7xCkF+gak1oIQIgORPiYWsNNTSsKcbwj2NKx1kxCN8hgzZ8xVqRb3jT9IZ/VC4FWiJZfsBfaS+AMqgs+zuG0wvb6/0ggf6/or5QJ0ICEwrFopdAgcoxc4BQfHFQt78kfd7BG/EbwKyvyHmviwgelz8SH1/tZI2I3WyOnaI9gkrt4Ws+XInN+ccN8ZXiZWVr61D7O80cm+pPEp5lwDLM1xZyLQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9203 X-MS-Exchange-Organization-ExpirationStartTime: 31 Aug 2026 14:06:58.2615 (UTC) X-MS-Exchange-Organization-ExpirationStartTimeReason: OriginalSubmit X-MS-Exchange-Organization-ExpirationInterval: 1:00:00:00.0000000 X-MS-Exchange-Organization-ExpirationIntervalReason: OriginalSubmit X-MS-Exchange-Organization-Network-Message-Id: 8e26d740-7c38-4041-d57e-08df07691efa X-MS-Exchange-Organization-MessageDirectionality: Incoming X-MS-Exchange-Transport-CrossTenantHeadersStripped: AMS1EPF00000047.eurprd04.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Exchange-Organization-AuthSource: AMS1EPF00000047.eurprd04.prod.outlook.com X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Office365-Filtering-Correlation-Id-Prvs: 0844493c-8cde-498c-402e-08df076918eb X-MS-Exchange-Organization-SCL: -1 X-Microsoft-Antispam: BCL:0;ARA:13230040|704161411799003|82310400026|6059299003|3072899012|35042699022|12012899012|2092899012|43022699015|19002099009|18003699003|10067099003|5133699003|5063699009|16102099003|22082099003|55112099003|57112099003; X-Forefront-Antispam-Report: CIP:99.81.216.78;CTRY:IE;LANG:en;SCL:-1;SRV:;IPV:CAL;SFV:SKN;H:nat.eu.perception-point.io;PTR:nat2.eu.perception-point.io;CAT:NONE;SFS:(13230040)(704161411799003)(82310400026)(6059299003)(3072899012)(35042699022)(12012899012)(2092899012)(43022699015)(19002099009)(18003699003)(10067099003)(5133699003)(5063699009)(16102099003)(22082099003)(55112099003)(57112099003);DIR:INB; X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2026 14:06:57.7919 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8e26d740-7c38-4041-d57e-08df07691efa X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-AuthSource: AMS1EPF00000047.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9934 X-MS-Exchange-Transport-EndToEndLatency: 00:00:08.0901277 X-MS-Exchange-Processed-By-BccFoldering: 15.21.0382.004 X-Microsoft-Antispam-Mailbox-Delivery: ucf:0;jmr:0;auth:0;dest:I;ENG:(910005)(944506478)(944626604)(920097)(930201)(20251009189)(140003); X-Microsoft-Antispam-Message-Info: =?utf-8?B?MHU5eEdjYm53c3NEZkMrZnpjRnNzQWd6c1UwTjdWTjVpWGdHcFdnMW04ZHVn?= =?utf-8?B?aTZSN0JkRmY3Z3oxaVh5VmtNekhqVE5oOFl6dHA5K1hkMVFzcEtMUWY1ZkVN?= =?utf-8?B?aUJuRnBUWHFEbFRDOFkxd3d3aW5VYWY0Um9IQWdLZklxdDNndndqcDV3OEFH?= =?utf-8?B?NkMvakdPanhPaEcxVEZySXgxbzAyL09ScExFUnZYS2Izd0VwRFRjRWZrdUNI?= =?utf-8?B?Q0lIM294cUYvNUF4YXQ1MzRpb1NDbytnSnRqWkJLdlBZa1oxWGhYd1UraE84?= =?utf-8?B?N1pxdzgzK0hjNXpoVTJzU3pEVVE0cnVGTXN1VjQzTWJRQ0RvNlFudHpVNjhO?= =?utf-8?B?bHhMZExKM1BVbUJVSFhmbCthc0RjRGJSNnpxV2NsalhwNjRZWDZaeGxyWElo?= =?utf-8?B?SVZwYjlnWFZQZWJZd3JTL0gycjlUb3hpaHNLWFZLWjR0NTZwQmlDRFh3amdh?= =?utf-8?B?QnQvYkh5cUIxZFRiVjFQRXBsa3FiTTgzT0pMS2IyL2c4aFVSeUdBb1FjdWNa?= =?utf-8?B?TzdkNitNZlZDRUpKZXBQUEs2NU9LbVhBYVJFdzJQaWMwK3RUcGh2OEtFc2ZI?= =?utf-8?B?ZURwTDR2aTM2ODAzdzhDKzZVb3k4MXFqbEpXZW1TWXpHZ2F2WU5uWndVTEpT?= =?utf-8?B?UHRxcWFXNjdWeWZsSkc3d1FtZTcyT1hUR2cwcXNFb3NlNkFnMGcvWW9jYWda?= =?utf-8?B?Z0U0OHRQeHVpZ0g4dzZib3F1bGl3QUZKWlBIRVNYVkswYzBWUWcrK2xPVzZw?= =?utf-8?B?Z053MG9rRTZnSWJpYU5henBJaDIwNDFURGJEVWxrTDZIaTRFWTEyWkFES2JX?= =?utf-8?B?V1Z6OUtoWmF3Q3E1Ui83RmVpT2ZqTHlObm5qcWdWaWJiQitsdXZjSE4wVjEv?= =?utf-8?B?eEFvRDQ2SGc3NTh3Y1EvQ3JxK2hZVzBZK2YwT1g5NVRsc1hZR2NFNFJTeDBV?= =?utf-8?B?Y2hsbDM3Wnl3R1ZVNHI5WFRqTi9tNnRoNS9UbnVXb0x2YVAzWTlBYzZGd3B1?= =?utf-8?B?dUtJOC95ZGp0TmNwN0I4UFVsa3c3MzUzYVgxTjRkc2dPd2M5QVh4N0hnMVJl?= =?utf-8?B?SWlXWnJRYzVDTkpNUHg4U0hSOFozR0ZUSzVOMnNya1RDSkhIa29jWUR6TnBE?= =?utf-8?B?UHlNSmg5REFwenpkNWVXWVMvRVk5a2dkTlpuVjRQaVdVQThuTUlaQTN2WDMx?= =?utf-8?B?TlU0RXE3Y08vMjlyaEJtYW9rOGZMNjRWRGZEY3oraW1IaEM0a3NqVkxUbzNs?= =?utf-8?B?cWwxbjZEcTVpQng4bGZoeHZYaUpOYm95T2dJREplcG0yL0tlVit2eG9wUjFu?= =?utf-8?B?V3B3bndKZ3F6VDQrYmdnNXpjZGhjNXNEWkR6OFdpaHdNSnBZSHR0MExXOXJK?= =?utf-8?B?cFljMEJvUGV0VlVMaWR2bWF1VHdQN1JDRjZwd2tnN25jaDdjZG9xV1ZqYkpD?= =?utf-8?B?cnVNLzVGTER6Z0JtUW1sZklSS000YUFnWWlRVUx0ZGRVQytGdWVKMUZ2WWFW?= =?utf-8?B?VzRhaG5vZFFaaU53MHVZLzZmbWtsUjQ1YStBZzJnQmVmZm9IYm1uQzJ0Umd4?= =?utf-8?B?eTJjK1IyYU5zL0x3RW5vM2s2V0RQMTVoVEFJN09qYWFXSHByRHE1UVNmNmRP?= =?utf-8?B?bGUxZlJWRmxHNGlqOFg0dlBCcm1BdGVhZG5uUmFZVGdkZmhwaVpydUhRNzZC?= =?utf-8?B?NU5UaVFxWlYxUSsyci9PRGJVUFRBeHl1VUxwMVphQ2dISE5qbVA2Wkdxek00?= =?utf-8?B?MU1EM3lBb2NkbGJwSXZMK01HUE1xMUgrNEZIWDFYTUtmOTZ4QmxMRHNKTnlG?= =?utf-8?B?MmJBanlmYlpLZ3ZLR1NYT3QwSXpmSFQrY2JUMFkrZTBwTGJreGprMVg0SFpH?= =?utf-8?B?d04rWVVjb1JzMVZ5anVteW80Uzl5WjdOV0w1T044Yy9pZlNncEhrbDVoVVIy?= =?utf-8?B?NUNKS0kxaWhHSG1scmVSKzhmYUVKdWYrd0Q5ckk0UXA3clY5MVlMb00zdlQ5?= =?utf-8?B?OEFYdG5jMTA3QjRCYjU5OEV4MWJPYXVnakpMc2xCZmNpWWVYelBSMkJDbk80?= =?utf-8?B?WXB6QmsxaWY0WURySXFUSmN3RnhkSktRNEp1azRlYWZPSkpBL3NHZHFncFRk?= =?utf-8?B?RENXdk1XbndlY21ZTkNJcXp0azIwR3pONHBlZlFSTHl5aXJPK29DSTlZL0dI?= =?utf-8?B?Q0F1MHMzRmhqWnA0VDY2amtiZWNoSFVaOU9PVmRweTU5dVFDM29nRGNYSmpu?= =?utf-8?B?OUVUK0duNWZWTEQ1czJPTFk0SzJHVEFYVnYxaVl3RVNtNUVXcEdEV2R0eG5x?= =?utf-8?B?azFseDIxUVBBeEIvZ0pCTUYvR0swcXRmTWFrOXJDWWNxRkpvREtXb0xoZWZs?= =?utf-8?B?MUJDdnRRS09BZzh0d3NTRHFDRGhTOVI5ZkRDZS9zQzZSbHhKR0pxcXQ1eUVn?= =?utf-8?B?QmNtNXNLaW0yRVFvbVpqd2JQUDZUL3JLYXpXb1lxbVc4RlVBeVBqTmpKY2Jl?= =?utf-8?B?aFFPZ2xvODI0SXFxdzV0UWVsTHpNYXVYaFNEdkNjWTN3dDhOcXpOcHBFMTNv?= =?utf-8?B?NXdVclhLTElHbVlTVjNUTjVMSmd3RHBPTjZ4RUhCU29XdXJzT0JMQXQ1R29T?= =?utf-8?B?cXB0M1JieXVrZWgyVTExdjRDVENmUWVJTys0MGFGY25zbVVWTTZUSlppa1hS?= =?utf-8?B?eUhvUS82TEVIMml1eitTK0diK2I1Umc1Z05CZXYzMkZHVUdSZmtuREg5R01I?= =?utf-8?B?aERNNEUzUytVMTBTdlhNdnhnblBBblR4NjNFK3VJKzM5eXVHZkNtVG9DNTlj?= =?utf-8?B?Z29RQ2VlMVBDNFp3RUJUZVVvOUcyc25LdWwyR3FVL1QxbnpuK3N6d21oeU5X?= =?utf-8?B?USsxMS9xbUlXQXNVSC80aG9ZYjVQZHZ5L2dUOVpWQllVaUl2U3hybTIvUjhi?= =?utf-8?B?bnlEalN6T0tQMzI3MTVKODBsWkU1K29NUjdZSVRPekRIWVoyMmFmSmpYT21y?= =?utf-8?B?T2dZbVVSUkEvOXBQNm5KL0IxZEJscWZHVU1ZUkNsNkgzem1MYWlsK2g2K0dH?= =?utf-8?B?MmgrNTNPeW5yTEIxTExmWDc0Mi9aUDlMNWVVelA0dklsK1dwYjMyMXNMd0xU?= =?utf-8?B?YUZrV2RRWGlNTEM0TzI0bzFJN3o5NWZoMU9ZUUJNNkp5bUlhY2hzWXNUNUZW?= =?utf-8?B?N040R2lhRXR1Q3VNVW13WGI1US9BcEkyYStRZkJWUitjdUtzdElPbjczY2dk?= =?utf-8?B?VURabXZiQWhkTTdNdE9vREVEdmluVGlaR2hqbG1VUXVuOHAwcjZGVmZHa2ZH?= =?utf-8?B?cm1KRktYaVJ1MEFSdi9oUEdpNmlpODRFL0NhUGdKNjlZRUtjMU1GRzVYWUlZ?= =?utf-8?B?QXRjVHpjZlE3RVdwa2d5dzR4OVlpeGVHaU9QSnhjc1hhV1JMc0d2a1I5Nys2?= =?utf-8?B?YTA2djVPV2Y0YWQzakd1T0NFeXFtUHlETjN2SDk3dU0wRHlXNFlZc0piNDY3?= =?utf-8?B?TkRoNURvK04rWm5oVkptalFyclVkS1RHd3E4TVdtQ2kxSEJtOW4raFdmMStn?= =?utf-8?Q?BGOTiTEV1QgULm?= MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: QEMU List-Id: From: Denis V. Lunev Check that malformed HTTP greetings are answered with an HTTP 400 rather than an empty response. The no-space case is the one which used to leave the response buffer empty. Cc: Daniel P. Berrangé Message-ID: <20260831100151.914178-5-den@openvz.org> Reviewed-by: Marc-André Lureau Signed-off-by: Denis V. Lunev --- tests/unit/meson.build | 1 + tests/unit/test-io-channel-websock.c | 105 +++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 tests/unit/test-io-channel-websock.c diff --git a/tests/unit/meson.build b/tests/unit/meson.build index afe3ab569c9..64641c6bb43 100644 --- a/tests/unit/meson.build +++ b/tests/unit/meson.build @@ -91,6 +91,7 @@ if have_block 'test-io-channel-command': ['io-channel-helpers.c', io], 'test-io-channel-buffer': ['io-channel-helpers.c', io], 'test-io-channel-null': [io], + 'test-io-channel-websock': [io], 'test-crypto-ivgen': [io], 'test-crypto-afsplit': [io], 'test-crypto-block': [io], diff --git a/tests/unit/test-io-channel-websock.c b/tests/unit/test-io-channel-websock.c new file mode 100644 index 00000000000..2a55a4bcdf8 --- /dev/null +++ b/tests/unit/test-io-channel-websock.c @@ -0,0 +1,105 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * QEMU I/O channel websock test + * + * Copyright (c) 2026 Virtuozzo International GmbH + */ + +#include "qemu/osdep.h" +#include "io/channel-websock.h" +#include "io/channel-socket.h" +#include "qapi/error.h" +#include "qemu/module.h" +#include "qemu/sockets.h" + +typedef struct { + bool finished; + bool failed; +} QIOChannelWebsockHandshake; + +static void test_websock_handshake_done(QIOTask *task, gpointer opaque) +{ + QIOChannelWebsockHandshake *res = opaque; + + res->finished = true; + res->failed = qio_task_propagate_error(task, NULL); +} + +/* + * Drives a server-side handshake against @request and returns whatever + * the server wrote back, NUL terminated. The handshake is expected to + * fail; the point of the test is the HTTP response that goes with it. + */ +static char *test_websock_handshake_reply(const char *request) +{ + QIOChannelWebsockHandshake res = { false, false }; + QIOChannelSocket *cli, *srv; + QIOChannelWebsock *wioc; + GMainContext *mainloop; + int channel[2]; + char *reply; + ssize_t got; + + g_assert(qemu_socketpair(AF_UNIX, SOCK_STREAM, 0, channel) == 0); + + cli = qio_channel_socket_new_fd(channel[0], &error_abort); + srv = qio_channel_socket_new_fd(channel[1], &error_abort); + qio_channel_set_blocking(QIO_CHANNEL(srv), false, &error_abort); + qio_channel_set_blocking(QIO_CHANNEL(cli), false, &error_abort); + + wioc = qio_channel_websock_new_server(QIO_CHANNEL(srv)); + qio_channel_websock_handshake(wioc, test_websock_handshake_done, + &res, NULL); + + qio_channel_write_all(QIO_CHANNEL(cli), request, strlen(request), + &error_abort); + + mainloop = g_main_context_default(); + while (!res.finished) { + g_main_context_iteration(mainloop, TRUE); + } + g_assert(res.failed); + + reply = g_malloc0(1024); + got = qio_channel_read(QIO_CHANNEL(cli), reply, 1023, &error_abort); + if (got > 0) { + reply[got] = '\0'; + } + + object_unref(OBJECT(wioc)); + object_unref(OBJECT(srv)); + object_unref(OBJECT(cli)); + + return reply; +} + +static void test_websock_bad_request(const void *opaque) +{ + const char *request = opaque; + g_autofree char *reply = test_websock_handshake_reply(request); + + g_assert_true(g_str_has_prefix(reply, "HTTP/1.1 400 Bad Request\r\n")); +} + +int main(int argc, char **argv) +{ + module_call_init(MODULE_INIT_QOM); + g_test_init(&argc, &argv, NULL); + +#define TEST_BAD_REQUEST(name, request) \ + g_test_add_data_func("/io/channel/websock/bad-request/" name, \ + request, test_websock_bad_request) + + /* + * A greeting with no space at all used to leave the response buffer + * empty, which drove the handshake into a zero length write. + */ + TEST_BAD_REQUEST("no-space", "stats\r\nx\r\n\r\n"); + TEST_BAD_REQUEST("method-only", "GET\r\nx\r\n\r\n"); + TEST_BAD_REQUEST("no-version", "GET /\r\nx\r\n\r\n"); + TEST_BAD_REQUEST("bad-method", "POST / HTTP/1.1\r\nx: y\r\n\r\n"); + TEST_BAD_REQUEST("bad-version", "GET / HTTP/1.0\r\nx: y\r\n\r\n"); + + return g_test_run(); +} -- 2.53.0