|
7 | 7 | from osbot_utils.utils.Objects import class_full_name, obj_data |
8 | 8 | from osbot_utils.testing.Temp_Web_Server import Temp_Web_Server |
9 | 9 | from osbot_utils.utils.Files import temp_file, file_not_exists, file_exists, file_bytes, file_size, file_create_bytes, file_delete, file_contents |
10 | | -from osbot_utils.utils.Http import DELETE, POST, GET, GET_json, DELETE_json, GET_bytes, GET_bytes_to_file, \ |
| 10 | +from osbot_utils.utils.Http import DELETE, POST, GET, GET_json, DELETE_json, GET_bytes, GET_bytes_to_file, \ |
11 | 11 | dns_ip_address, port_is_open, port_is_not_open, current_host_online, POST_json, OPTIONS, PUT_json, \ |
12 | 12 | is_port_open, wait_for_port, current_host_offline, http_request, wait_for_http, wait_for_ssh, \ |
13 | | - wait_for_port_closed, GET_to_file, url_join_safe |
| 13 | + wait_for_port_closed, GET_to_file, url_join_safe, parse_cookies |
14 | 14 |
|
15 | 15 |
|
16 | 16 | # note: with the use of Custom_Handler_For_Http_Tests this test went from 10 seconds + to 17 ms :) |
@@ -122,6 +122,80 @@ def test_is_port_open__port_is_open__port_is_not_open(self): |
122 | 122 | assert port_is_not_open(host=host , port=port+1, timeout=timeout ) is True |
123 | 123 | assert port_is_not_open(host=host_ip, port=port+1, timeout=timeout ) is True |
124 | 124 |
|
| 125 | + def test_parse_cookies(self): |
| 126 | + # Main test with multiple cookies |
| 127 | + cookie_header = ( |
| 128 | + 'SESSION_ID__USER="user123"; expires=Tue, 29 Oct 2024 22:00:56 GMT; Max-Age=0; ' |
| 129 | + 'Path=/; SameSite=lax, SESSION_ID__PERSONA="persona456"; ' |
| 130 | + 'expires=Tue, 29 Oct 2024 22:00:56 GMT; Max-Age=0; Path=/; SameSite=lax' |
| 131 | + ) |
| 132 | + parsed_cookies = parse_cookies(cookie_header) |
| 133 | + |
| 134 | + assert len(parsed_cookies) == 2 |
| 135 | + assert "SESSION_ID__USER" in parsed_cookies |
| 136 | + assert "SESSION_ID__PERSONA" in parsed_cookies |
| 137 | + |
| 138 | + assert parsed_cookies["SESSION_ID__USER" ]["value" ] == "user123" |
| 139 | + assert parsed_cookies["SESSION_ID__PERSONA"]["value" ] == "persona456" |
| 140 | + |
| 141 | + expected_expiry = "Tue, 29 Oct 2024 22:00:56 GMT" |
| 142 | + assert parsed_cookies["SESSION_ID__USER" ]["expires" ] == expected_expiry |
| 143 | + assert parsed_cookies["SESSION_ID__PERSONA"]["expires" ] == expected_expiry |
| 144 | + |
| 145 | + assert parsed_cookies["SESSION_ID__USER" ]["path" ] == "/" |
| 146 | + assert parsed_cookies["SESSION_ID__PERSONA"]["path" ] == "/" |
| 147 | + |
| 148 | + assert parsed_cookies["SESSION_ID__USER" ]["samesite"] == "lax" |
| 149 | + assert parsed_cookies["SESSION_ID__PERSONA"]["samesite"] == "lax" |
| 150 | + |
| 151 | + assert parsed_cookies["SESSION_ID__USER" ]["max-age" ] == "0" |
| 152 | + assert parsed_cookies["SESSION_ID__PERSONA"]["max-age" ] == "0" |
| 153 | + |
| 154 | + # Test cookies with secure and httponly flags |
| 155 | + cookie_header = ( |
| 156 | + 'SESSION_ID__USER="user123"; Secure; HttpOnly; Path=/; SameSite=strict, ' |
| 157 | + 'SESSION_ID__PERSONA="persona456"; Secure; Path=/; SameSite=none' |
| 158 | + ) |
| 159 | + parsed_cookies = parse_cookies(cookie_header) |
| 160 | + |
| 161 | + assert parsed_cookies["SESSION_ID__USER"]["value"] == "user123" |
| 162 | + assert parsed_cookies["SESSION_ID__USER"]["secure"] is True |
| 163 | + assert parsed_cookies["SESSION_ID__USER"]["httponly"] is True |
| 164 | + assert parsed_cookies["SESSION_ID__USER"]["path"] == "/" |
| 165 | + assert parsed_cookies["SESSION_ID__USER"]["samesite"] == "strict" |
| 166 | + |
| 167 | + assert parsed_cookies["SESSION_ID__PERSONA"]["value"] == "persona456" |
| 168 | + assert parsed_cookies["SESSION_ID__PERSONA"]["secure"] is True |
| 169 | + assert parsed_cookies["SESSION_ID__PERSONA"]["httponly"] is False |
| 170 | + assert parsed_cookies["SESSION_ID__PERSONA"]["path"] == "/" |
| 171 | + assert parsed_cookies["SESSION_ID__PERSONA"]["samesite"] == "none" |
| 172 | + |
| 173 | + |
| 174 | + # Test empty cookie header |
| 175 | + cookie_header = "" |
| 176 | + parsed_cookies = parse_cookies(cookie_header) |
| 177 | + assert parsed_cookies == {} |
| 178 | + |
| 179 | + |
| 180 | + # Test with minimal attributes (no expires, max-age, path, samesite, secure, httponly) |
| 181 | + cookie_header = 'TEST_COOKIE="test_value"' |
| 182 | + parsed_cookies = parse_cookies(cookie_header) |
| 183 | + |
| 184 | + assert len(parsed_cookies) == 1 |
| 185 | + assert parsed_cookies["TEST_COOKIE"]["value"] == "test_value" |
| 186 | + assert parsed_cookies["TEST_COOKIE"] == {'comment' : '' , |
| 187 | + 'domain' : '' , |
| 188 | + 'expires' : '' , |
| 189 | + 'httponly': False , |
| 190 | + 'max-age' : '' , |
| 191 | + 'path' : '' , |
| 192 | + 'samesite': '' , |
| 193 | + 'secure' : False , |
| 194 | + 'value' : 'test_value', |
| 195 | + 'version' : '' } |
| 196 | + |
| 197 | + |
| 198 | + |
125 | 199 | def test_wait_for_http(self): |
126 | 200 | url = self.local_url |
127 | 201 | assert wait_for_http(url) is True |
|
0 commit comments