codekingpro/portable-devtools
114k
1# -*- coding: utf-8 -*-2#3import os4import unittest5 6from websocket._url import (7 _is_address_in_network,8 _is_no_proxy_host,9 get_proxy_info,10 parse_url,11)12from websocket._exceptions import WebSocketProxyException13 14"""15test_url.py16websocket - WebSocket client library for Python17 18Copyright 2025 engn33r19 20Licensed under the Apache License, Version 2.0 (the "License");21you may not use this file except in compliance with the License.22You may obtain a copy of the License at23 24 http://www.apache.org/licenses/LICENSE-2.025 26Unless required by applicable law or agreed to in writing, software27distributed under the License is distributed on an "AS IS" BASIS,28WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.29See the License for the specific language governing permissions and30limitations under the License.31"""32 33 34class UrlTest(unittest.TestCase):35 def test_address_in_network(self):36 self.assertTrue(_is_address_in_network("127.0.0.1", "127.0.0.0/8"))37 self.assertTrue(_is_address_in_network("127.1.0.1", "127.0.0.0/8"))38 self.assertFalse(_is_address_in_network("127.1.0.1", "127.0.0.0/24"))39 self.assertTrue(_is_address_in_network("2001:db8::1", "2001:db8::/64"))40 self.assertFalse(_is_address_in_network("2001:db8:1::1", "2001:db8::/64"))41 42 def test_parse_url(self):43 p = parse_url("ws://www.example.com/r")44 self.assertEqual(p[0], "www.example.com")45 self.assertEqual(p[1], 80)46 self.assertEqual(p[2], "/r")47 self.assertEqual(p[3], False)48 49 p = parse_url("ws://www.example.com/r/")50 self.assertEqual(p[0], "www.example.com")51 self.assertEqual(p[1], 80)52 self.assertEqual(p[2], "/r/")53 self.assertEqual(p[3], False)54 55 p = parse_url("ws://www.example.com/")56 self.assertEqual(p[0], "www.example.com")57 self.assertEqual(p[1], 80)58 self.assertEqual(p[2], "/")59 self.assertEqual(p[3], False)60 61 p = parse_url("ws://www.example.com")62 self.assertEqual(p[0], "www.example.com")63 self.assertEqual(p[1], 80)64 self.assertEqual(p[2], "/")65 self.assertEqual(p[3], False)66 67 p = parse_url("ws://www.example.com:8080/r")68 self.assertEqual(p[0], "www.example.com")69 self.assertEqual(p[1], 8080)70 self.assertEqual(p[2], "/r")71 self.assertEqual(p[3], False)72 73 p = parse_url("ws://www.example.com:8080/")74 self.assertEqual(p[0], "www.example.com")75 self.assertEqual(p[1], 8080)76 self.assertEqual(p[2], "/")77 self.assertEqual(p[3], False)78 79 p = parse_url("ws://www.example.com:8080")80 self.assertEqual(p[0], "www.example.com")81 self.assertEqual(p[1], 8080)82 self.assertEqual(p[2], "/")83 self.assertEqual(p[3], False)84 85 p = parse_url("wss://www.example.com:8080/r")86 self.assertEqual(p[0], "www.example.com")87 self.assertEqual(p[1], 8080)88 self.assertEqual(p[2], "/r")89 self.assertEqual(p[3], True)90 91 p = parse_url("wss://www.example.com:8080/r?key=value")92 self.assertEqual(p[0], "www.example.com")93 self.assertEqual(p[1], 8080)94 self.assertEqual(p[2], "/r?key=value")95 self.assertEqual(p[3], True)96 97 self.assertRaises(ValueError, parse_url, "http://www.example.com/r")98 99 p = parse_url("ws://[2a03:4000:123:83::3]/r")100 self.assertEqual(p[0], "2a03:4000:123:83::3")101 self.assertEqual(p[1], 80)102 self.assertEqual(p[2], "/r")103 self.assertEqual(p[3], False)104 105 p = parse_url("ws://[2a03:4000:123:83::3]:8080/r")106 self.assertEqual(p[0], "2a03:4000:123:83::3")107 self.assertEqual(p[1], 8080)108 self.assertEqual(p[2], "/r")109 self.assertEqual(p[3], False)110 111 p = parse_url("wss://[2a03:4000:123:83::3]/r")112 self.assertEqual(p[0], "2a03:4000:123:83::3")113 self.assertEqual(p[1], 443)114 self.assertEqual(p[2], "/r")115 self.assertEqual(p[3], True)116 117 p = parse_url("wss://[2a03:4000:123:83::3]:8080/r")118 self.assertEqual(p[0], "2a03:4000:123:83::3")119 self.assertEqual(p[1], 8080)120 self.assertEqual(p[2], "/r")121 self.assertEqual(p[3], True)122 123 124class IsNoProxyHostTest(unittest.TestCase):125 def setUp(self):126 self.no_proxy = os.environ.get("no_proxy", None)127 if "no_proxy" in os.environ:128 del os.environ["no_proxy"]129 130 def tearDown(self):131 if self.no_proxy:132 os.environ["no_proxy"] = self.no_proxy133 elif "no_proxy" in os.environ:134 del os.environ["no_proxy"]135 136 def test_match_all(self):137 self.assertTrue(_is_no_proxy_host("any.websocket.org", ["*"]))138 self.assertTrue(_is_no_proxy_host("192.168.0.1", ["*"]))139 self.assertFalse(_is_no_proxy_host("192.168.0.1", ["192.168.1.1"]))140 self.assertFalse(141 _is_no_proxy_host("any.websocket.org", ["other.websocket.org"])142 )143 self.assertTrue(144 _is_no_proxy_host("any.websocket.org", ["other.websocket.org", "*"])145 )146 os.environ["no_proxy"] = "*"147 self.assertTrue(_is_no_proxy_host("any.websocket.org", None))148 self.assertTrue(_is_no_proxy_host("192.168.0.1", None))149 os.environ["no_proxy"] = "other.websocket.org, *"150 self.assertTrue(_is_no_proxy_host("any.websocket.org", None))151 152 def test_ip_address(self):153 self.assertTrue(_is_no_proxy_host("127.0.0.1", ["127.0.0.1"]))154 self.assertFalse(_is_no_proxy_host("127.0.0.2", ["127.0.0.1"]))155 self.assertTrue(156 _is_no_proxy_host("127.0.0.1", ["other.websocket.org", "127.0.0.1"])157 )158 self.assertFalse(159 _is_no_proxy_host("127.0.0.2", ["other.websocket.org", "127.0.0.1"])160 )161 os.environ["no_proxy"] = "127.0.0.1"162 self.assertTrue(_is_no_proxy_host("127.0.0.1", None))163 self.assertFalse(_is_no_proxy_host("127.0.0.2", None))164 os.environ["no_proxy"] = "other.websocket.org, 127.0.0.1"165 self.assertTrue(_is_no_proxy_host("127.0.0.1", None))166 self.assertFalse(_is_no_proxy_host("127.0.0.2", None))167 168 def test_ip_address_in_range(self):169 self.assertTrue(_is_no_proxy_host("127.0.0.1", ["127.0.0.0/8"]))170 self.assertTrue(_is_no_proxy_host("127.0.0.2", ["127.0.0.0/8"]))171 self.assertFalse(_is_no_proxy_host("127.1.0.1", ["127.0.0.0/24"]))172 self.assertTrue(_is_no_proxy_host("2001:db8::1", ["2001:db8::/64"]))173 self.assertFalse(_is_no_proxy_host("2001:db8:1::1", ["2001:db8::/64"]))174 os.environ["no_proxy"] = "127.0.0.0/8,2001:db8::/64"175 self.assertTrue(_is_no_proxy_host("127.0.0.1", None))176 self.assertTrue(_is_no_proxy_host("127.0.0.2", None))177 self.assertTrue(_is_no_proxy_host("2001:db8::1", None))178 self.assertFalse(_is_no_proxy_host("2001:db8:1::1", None))179 os.environ["no_proxy"] = "127.0.0.0/24,2001:db8::/64"180 self.assertFalse(_is_no_proxy_host("127.1.0.1", None))181 self.assertFalse(_is_no_proxy_host("2001:db8:1::1", None))182 183 def test_hostname_match(self):184 self.assertTrue(_is_no_proxy_host("my.websocket.org", ["my.websocket.org"]))185 self.assertTrue(186 _is_no_proxy_host(187 "my.websocket.org", ["other.websocket.org", "my.websocket.org"]188 )189 )190 self.assertFalse(_is_no_proxy_host("my.websocket.org", ["other.websocket.org"]))191 os.environ["no_proxy"] = "my.websocket.org"192 self.assertTrue(_is_no_proxy_host("my.websocket.org", None))193 self.assertFalse(_is_no_proxy_host("other.websocket.org", None))194 os.environ["no_proxy"] = "other.websocket.org, my.websocket.org"195 self.assertTrue(_is_no_proxy_host("my.websocket.org", None))196 197 def test_hostname_match_domain(self):198 self.assertTrue(_is_no_proxy_host("any.websocket.org", [".websocket.org"]))199 self.assertTrue(_is_no_proxy_host("my.other.websocket.org", [".websocket.org"]))200 self.assertTrue(201 _is_no_proxy_host(202 "any.websocket.org", ["my.websocket.org", ".websocket.org"]203 )204 )205 self.assertFalse(_is_no_proxy_host("any.websocket.com", [".websocket.org"]))206 os.environ["no_proxy"] = ".websocket.org"207 self.assertTrue(_is_no_proxy_host("any.websocket.org", None))208 self.assertTrue(_is_no_proxy_host("my.other.websocket.org", None))209 self.assertFalse(_is_no_proxy_host("any.websocket.com", None))210 os.environ["no_proxy"] = "my.websocket.org, .websocket.org"211 self.assertTrue(_is_no_proxy_host("any.websocket.org", None))212 213 214class ProxyInfoTest(unittest.TestCase):215 def setUp(self):216 self.http_proxy = os.environ.get("http_proxy", None)217 self.https_proxy = os.environ.get("https_proxy", None)218 self.no_proxy = os.environ.get("no_proxy", None)219 if "http_proxy" in os.environ:220 del os.environ["http_proxy"]221 if "https_proxy" in os.environ:222 del os.environ["https_proxy"]223 if "no_proxy" in os.environ:224 del os.environ["no_proxy"]225 226 def tearDown(self):227 if self.http_proxy:228 os.environ["http_proxy"] = self.http_proxy229 elif "http_proxy" in os.environ:230 del os.environ["http_proxy"]231 232 if self.https_proxy:233 os.environ["https_proxy"] = self.https_proxy234 elif "https_proxy" in os.environ:235 del os.environ["https_proxy"]236 237 if self.no_proxy:238 os.environ["no_proxy"] = self.no_proxy239 elif "no_proxy" in os.environ:240 del os.environ["no_proxy"]241 242 def test_proxy_from_args(self):243 self.assertRaises(244 WebSocketProxyException,245 get_proxy_info,246 "echo.websocket.events",247 False,248 proxy_host="localhost",249 )250 self.assertEqual(251 get_proxy_info(252 "echo.websocket.events", False, proxy_host="localhost", proxy_port=3128253 ),254 ("localhost", 3128, None),255 )256 self.assertEqual(257 get_proxy_info(258 "echo.websocket.events", True, proxy_host="localhost", proxy_port=3128259 ),260 ("localhost", 3128, None),261 )262 263 self.assertEqual(264 get_proxy_info(265 "echo.websocket.events",266 False,267 proxy_host="localhost",268 proxy_port=9001,269 proxy_auth=("a", "b"),270 ),271 ("localhost", 9001, ("a", "b")),272 )273 self.assertEqual(274 get_proxy_info(275 "echo.websocket.events",276 False,277 proxy_host="localhost",278 proxy_port=3128,279 proxy_auth=("a", "b"),280 ),281 ("localhost", 3128, ("a", "b")),282 )283 self.assertEqual(284 get_proxy_info(285 "echo.websocket.events",286 True,287 proxy_host="localhost",288 proxy_port=8765,289 proxy_auth=("a", "b"),290 ),291 ("localhost", 8765, ("a", "b")),292 )293 self.assertEqual(294 get_proxy_info(295 "echo.websocket.events",296 True,297 proxy_host="localhost",298 proxy_port=3128,299 proxy_auth=("a", "b"),300 ),301 ("localhost", 3128, ("a", "b")),302 )303 304 self.assertEqual(305 get_proxy_info(306 "echo.websocket.events",307 True,308 proxy_host="localhost",309 proxy_port=3128,310 no_proxy=["example.com"],311 proxy_auth=("a", "b"),312 ),313 ("localhost", 3128, ("a", "b")),314 )315 self.assertEqual(316 get_proxy_info(317 "echo.websocket.events",318 True,319 proxy_host="localhost",320 proxy_port=3128,321 no_proxy=["echo.websocket.events"],322 proxy_auth=("a", "b"),323 ),324 (None, 0, None),325 )326 327 self.assertEqual(328 get_proxy_info(329 "echo.websocket.events",330 True,331 proxy_host="localhost",332 proxy_port=3128,333 no_proxy=[".websocket.events"],334 ),335 (None, 0, None),336 )337 338 def test_proxy_from_env(self):339 os.environ["http_proxy"] = "http://localhost/"340 self.assertEqual(341 get_proxy_info("echo.websocket.events", False), ("localhost", None, None)342 )343 os.environ["http_proxy"] = "http://localhost:3128/"344 self.assertEqual(345 get_proxy_info("echo.websocket.events", False), ("localhost", 3128, None)346 )347 348 os.environ["http_proxy"] = "http://localhost/"349 os.environ["https_proxy"] = "http://localhost2/"350 self.assertEqual(351 get_proxy_info("echo.websocket.events", False), ("localhost", None, None)352 )353 os.environ["http_proxy"] = "http://localhost:3128/"354 os.environ["https_proxy"] = "http://localhost2:3128/"355 self.assertEqual(356 get_proxy_info("echo.websocket.events", False), ("localhost", 3128, None)357 )358 359 os.environ["http_proxy"] = "http://localhost/"360 os.environ["https_proxy"] = "http://localhost2/"361 self.assertEqual(362 get_proxy_info("echo.websocket.events", True), ("localhost2", None, None)363 )364 os.environ["http_proxy"] = "http://localhost:3128/"365 os.environ["https_proxy"] = "http://localhost2:3128/"366 self.assertEqual(367 get_proxy_info("echo.websocket.events", True), ("localhost2", 3128, None)368 )369 370 os.environ["http_proxy"] = ""371 os.environ["https_proxy"] = "http://localhost2/"372 self.assertEqual(373 get_proxy_info("echo.websocket.events", True), ("localhost2", None, None)374 )375 self.assertEqual(376 get_proxy_info("echo.websocket.events", False), (None, 0, None)377 )378 os.environ["http_proxy"] = ""379 os.environ["https_proxy"] = "http://localhost2:3128/"380 self.assertEqual(381 get_proxy_info("echo.websocket.events", True), ("localhost2", 3128, None)382 )383 self.assertEqual(384 get_proxy_info("echo.websocket.events", False), (None, 0, None)385 )386 387 os.environ["http_proxy"] = "http://localhost/"388 os.environ["https_proxy"] = ""389 self.assertEqual(get_proxy_info("echo.websocket.events", True), (None, 0, None))390 self.assertEqual(391 get_proxy_info("echo.websocket.events", False), ("localhost", None, None)392 )393 os.environ["http_proxy"] = "http://localhost:3128/"394 os.environ["https_proxy"] = ""395 self.assertEqual(get_proxy_info("echo.websocket.events", True), (None, 0, None))396 self.assertEqual(397 get_proxy_info("echo.websocket.events", False), ("localhost", 3128, None)398 )399 400 os.environ["http_proxy"] = "http://a:b@localhost/"401 self.assertEqual(402 get_proxy_info("echo.websocket.events", False),403 ("localhost", None, ("a", "b")),404 )405 os.environ["http_proxy"] = "http://a:b@localhost:3128/"406 self.assertEqual(407 get_proxy_info("echo.websocket.events", False),408 ("localhost", 3128, ("a", "b")),409 )410 411 os.environ["http_proxy"] = "http://a:b@localhost/"412 os.environ["https_proxy"] = "http://a:b@localhost2/"413 self.assertEqual(414 get_proxy_info("echo.websocket.events", False),415 ("localhost", None, ("a", "b")),416 )417 os.environ["http_proxy"] = "http://a:b@localhost:3128/"418 os.environ["https_proxy"] = "http://a:b@localhost2:3128/"419 self.assertEqual(420 get_proxy_info("echo.websocket.events", False),421 ("localhost", 3128, ("a", "b")),422 )423 424 os.environ["http_proxy"] = "http://a:b@localhost/"425 os.environ["https_proxy"] = "http://a:b@localhost2/"426 self.assertEqual(427 get_proxy_info("echo.websocket.events", True),428 ("localhost2", None, ("a", "b")),429 )430 os.environ["http_proxy"] = "http://a:b@localhost:3128/"431 os.environ["https_proxy"] = "http://a:b@localhost2:3128/"432 self.assertEqual(433 get_proxy_info("echo.websocket.events", True),434 ("localhost2", 3128, ("a", "b")),435 )436 437 os.environ["http_proxy"] = (438 "http://john%40example.com:P%40SSWORD@localhost:3128/"439 )440 os.environ["https_proxy"] = (441 "http://john%40example.com:P%40SSWORD@localhost2:3128/"442 )443 self.assertEqual(444 get_proxy_info("echo.websocket.events", True),445 ("localhost2", 3128, ("john@example.com", "P@SSWORD")),446 )447 448 os.environ["http_proxy"] = "http://a:b@localhost/"449 os.environ["https_proxy"] = "http://a:b@localhost2/"450 os.environ["no_proxy"] = "example1.com,example2.com"451 self.assertEqual(452 get_proxy_info("example.1.com", True), ("localhost2", None, ("a", "b"))453 )454 os.environ["http_proxy"] = "http://a:b@localhost:3128/"455 os.environ["https_proxy"] = "http://a:b@localhost2:3128/"456 os.environ["no_proxy"] = "example1.com,example2.com, echo.websocket.events"457 self.assertEqual(get_proxy_info("echo.websocket.events", True), (None, 0, None))458 os.environ["http_proxy"] = "http://a:b@localhost:3128/"459 os.environ["https_proxy"] = "http://a:b@localhost2:3128/"460 os.environ["no_proxy"] = "example1.com,example2.com, .websocket.events"461 self.assertEqual(get_proxy_info("echo.websocket.events", True), (None, 0, None))462 463 os.environ["http_proxy"] = "http://a:b@localhost:3128/"464 os.environ["https_proxy"] = "http://a:b@localhost2:3128/"465 os.environ["no_proxy"] = "127.0.0.0/8, 192.168.0.0/16"466 self.assertEqual(get_proxy_info("127.0.0.1", False), (None, 0, None))467 self.assertEqual(get_proxy_info("192.168.1.1", False), (None, 0, None))468 469 470if __name__ == "__main__":471 unittest.main()472 