Commit 5341e9f
committed
fix(net-http): parseUrl separates userinfo and rejects junk after an IPv6 bracket (#2072)
Two halves of one post-audit finding.
USERINFO. RFC 3986 3.2 spells the authority `[ userinfo "@" ] host [ ":" port ]`
and this parser had no userinfo rule at all, so http://user@host/p returned the
host "user@host" -- a string that then went to getaddrinfo as a DNS name and
into the Host: header. .NET keeps UserInfo as its own component and its Host
never contains it.
The LAST '@' is the delimiter, per RFC 3986 3.2.1: a '@' is legal inside the
userinfo and the host production admits none. Splitting on the first would make
"b@example.com" the host of http://a@b@example.com/, and a mutation that does
exactly that is caught.
The userinfo is discarded, deliberately, and that is recorded rather than
glossed: ParsedUrl has no userinfo field, this handler has no authentication
path to hand one to, and inventing one is new API. What matters is that it stops
being part of the HOST.
http://user:pass@host/ used to throw for the WRONG reason, and the ticket
noticed: rfind(':') made "pass@host" the port text, so the failure was
accidental and the message said "invalid port". It now succeeds with the host it
always denoted.
IPv6. http://[::1]x/p returned host "::1" and SILENTLY DISCARDED the 'x', so the
URL the caller wrote and the URL the client connected to differed with no
diagnostic. RFC 3986 3.2.2 allows only `":" port` after the closing bracket.
Four mutations. Three caught. The fourth -- removing the empty-host check after
the userinfo split -- was NOT caught, and that is reported rather than papered
over: the check was redundant, because an empty authority already reaches the
empty-host check at the end of the function. The dead code was deleted rather
than defended, and a comment records that a mutation is how that was established.
+5 tests. Gate: 17,256 run, 0 failed, 38 executables -- green. Downstream,
measured: zero HttpClient sites in either consumer.
Record: docs/Migration-HttpClientUrlUserInfo.md.1 parent cd9fa04 commit 5341e9f
5 files changed
Lines changed: 169 additions & 2 deletions
File tree
- docs
- modules/net-http
- src/System/Net/Http
- tests/System/Net
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
149 | 149 | | |
150 | 150 | | |
151 | 151 | | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
152 | 174 | | |
153 | 175 | | |
154 | 176 | | |
| |||
161 | 183 | | |
162 | 184 | | |
163 | 185 | | |
164 | | - | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
165 | 194 | | |
166 | 195 | | |
167 | 196 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2528 | 2528 | | |
2529 | 2529 | | |
2530 | 2530 | | |
| 2531 | + | |
| 2532 | + | |
| 2533 | + | |
| 2534 | + | |
| 2535 | + | |
| 2536 | + | |
| 2537 | + | |
| 2538 | + | |
| 2539 | + | |
| 2540 | + | |
| 2541 | + | |
| 2542 | + | |
| 2543 | + | |
| 2544 | + | |
| 2545 | + | |
| 2546 | + | |
| 2547 | + | |
| 2548 | + | |
| 2549 | + | |
| 2550 | + | |
| 2551 | + | |
| 2552 | + | |
| 2553 | + | |
| 2554 | + | |
| 2555 | + | |
| 2556 | + | |
| 2557 | + | |
| 2558 | + | |
| 2559 | + | |
| 2560 | + | |
| 2561 | + | |
| 2562 | + | |
| 2563 | + | |
| 2564 | + | |
| 2565 | + | |
| 2566 | + | |
| 2567 | + | |
| 2568 | + | |
| 2569 | + | |
| 2570 | + | |
| 2571 | + | |
| 2572 | + | |
| 2573 | + | |
| 2574 | + | |
| 2575 | + | |
| 2576 | + | |
| 2577 | + | |
| 2578 | + | |
| 2579 | + | |
| 2580 | + | |
| 2581 | + | |
| 2582 | + | |
| 2583 | + | |
| 2584 | + | |
| 2585 | + | |
| 2586 | + | |
| 2587 | + | |
| 2588 | + | |
| 2589 | + | |
| 2590 | + | |
| 2591 | + | |
| 2592 | + | |
| 2593 | + | |
| 2594 | + | |
| 2595 | + | |
| 2596 | + | |
| 2597 | + | |
| 2598 | + | |
| 2599 | + | |
| 2600 | + | |
| 2601 | + | |
| 2602 | + | |
| 2603 | + | |
Binary file not shown.
0 commit comments