Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[HTTP/3] Alt-Svc logic has many issues #83874

Open
ManickaP opened this issue Mar 24, 2023 · 2 comments
Open

[HTTP/3] Alt-Svc logic has many issues #83874

ManickaP opened this issue Mar 24, 2023 · 2 comments

Comments

@ManickaP
Copy link
Member

Looking at the current Alt-Svc logic, there are other weird things going on:

  • It's likely that the current logic for clear is unreachable
    • We are reading the list of values via HttpHeaders.TryGetValues here. This involves validation, so it goes through the AltSvcHeaderParser, which creates a list of AltSvcHeaderValues. Those values are then ToStringed and returned from TryGetValues. Then the loop feeds those strings back to AltSvcHeaderParser and looks at parsed values.
    • AltSvcHeaderValue.ToString is broken for clear and it will return clear=":0"; ma=0, which is an invalid value and won't roundtrip through the parser.
    • As an example, the following code throws on the second Add
      var headers = new HttpResponseMessage().Headers;
      headers.Add("Alt-Svc", "clear");
      string value = headers.GetValues("Alt-Svc").Single();
      headers.Clear();
      headers.Add("Alt-Svc", value); // The format of value 'clear=":0"; ma=0' is invalid
    • Similarly, the second call to the AltSvcHeaderParser will fail, and so that loop can never observe the clear value
  • Even if the loop could see clear, we're still going to use the first authority we saw, even though clear should have been the only value present. (We break here, but maybe we should be returning?)
  • We're comparing authorities against each other in a few places with == and !=, but the HttpAuthority class doesn't override these operators, so this is doing reference equality. This is suspicious at best and potentially an error in some places.
  • GetHttp3ConnectionAsync could end up returning null here in a race, leading to a NRE here.

Originally posted by @MihaZupan in #83775 (comment)

@ghost ghost added the untriaged New issue has not been triaged by the area owner label Mar 24, 2023
@ghost
Copy link

ghost commented Mar 24, 2023

Tagging subscribers to this area: @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

Issue Details

Looking at the current Alt-Svc logic, there are other weird things going on:

  • It's likely that the current logic for clear is unreachable
    • We are reading the list of values via HttpHeaders.TryGetValues here. This involves validation, so it goes through the AltSvcHeaderParser, which creates a list of AltSvcHeaderValues. Those values are then ToStringed and returned from TryGetValues. Then the loop feeds those strings back to AltSvcHeaderParser and looks at parsed values.
    • AltSvcHeaderValue.ToString is broken for clear and it will return clear=":0"; ma=0, which is an invalid value and won't roundtrip through the parser.
    • As an example, the following code throws on the second Add
      var headers = new HttpResponseMessage().Headers;
      headers.Add("Alt-Svc", "clear");
      string value = headers.GetValues("Alt-Svc").Single();
      headers.Clear();
      headers.Add("Alt-Svc", value); // The format of value 'clear=":0"; ma=0' is invalid
    • Similarly, the second call to the AltSvcHeaderParser will fail, and so that loop can never observe the clear value
  • Even if the loop could see clear, we're still going to use the first authority we saw, even though clear should have been the only value present. (We break here, but maybe we should be returning?)
  • We're comparing authorities against each other in a few places with == and !=, but the HttpAuthority class doesn't override these operators, so this is doing reference equality. This is suspicious at best and potentially an error in some places.
  • GetHttp3ConnectionAsync could end up returning null here in a race, leading to a NRE here.

Originally posted by @MihaZupan in #83775 (comment)

Author: ManickaP
Assignees: -
Labels:

area-System.Net.Http, untriaged

Milestone: -

@ManickaP ManickaP added this to the Future milestone Mar 24, 2023
@ghost ghost removed the untriaged New issue has not been triaged by the area owner label Mar 24, 2023
@ManickaP ManickaP added the bug label Mar 24, 2023
@ManickaP
Copy link
Member Author

Triage: we've lived this until now, the only thing that seems more urgent is the potential for race with h3 connection. Putting to future for now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant