Skip to content

Commit f6de72a

Browse files
author
Katya Sokolova
committed
address review feedback
1 parent ac966a8 commit f6de72a

File tree

6 files changed

+38
-34
lines changed

6 files changed

+38
-34
lines changed

src/libraries/System.Net.Http/src/System/Net/Http/Headers/HttpRequestHeaders.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,7 @@ public int? MaxForwards
159159
set { SetOrRemoveParsedValue(KnownHeaders.MaxForwards.Descriptor, value); }
160160
}
161161

162-
public string? Protocol
163-
{
164-
get { return (string?)GetSingleParsedValue(new HeaderDescriptor(":protocol")); }
165-
set { SetOrRemoveParsedValue(new HeaderDescriptor(":protocol"), value); }
166-
}
167-
162+
public string? Protocol { get; set; }
168163

169164
public AuthenticationHeaderValue? ProxyAuthorization
170165
{

src/libraries/System.Net.Http/src/System/Net/Http/HttpRequestMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public override string ToString()
168168

169169
internal bool WasRedirected() => (_sendStatus & MessageIsRedirect) != 0;
170170

171-
internal bool IsWebSocketH2Request() => _version.Major == 2 && HasHeaders && Headers.Protocol == "websocket";
171+
internal bool IsWebSocketH2Request() => _version.Major == 2 && Method == HttpMethod.Connect && HasHeaders && Headers.Protocol == "websocket";
172172

173173
#region IDisposable Members
174174

src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/Http2Connection.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,8 +1458,6 @@ private void WriteHeaders(HttpRequestMessage request, ref ArrayBuffer headerBuff
14581458
WriteBytes(":protocol"u8, ref headerBuffer);
14591459
Encoding? protocolEncoding = _pool.Settings._requestHeaderEncodingSelector?.Invoke(":protocol", request);
14601460
WriteLiteralHeaderValue(request.Headers.Protocol, protocolEncoding, ref headerBuffer);
1461-
1462-
request.Headers.Protocol = null;
14631461
}
14641462

14651463
if (request.HasHeaders)

src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/Http2Stream.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ public Http2Stream(HttpRequestMessage request, Http2Connection connection)
107107
if (_request.Content == null)
108108
{
109109
_requestCompletionState = StreamCompletionState.Completed;
110+
if (_request.IsWebSocketH2Request())
111+
{
112+
_requestBodyCancellationSource = new CancellationTokenSource();
113+
}
110114
}
111115
else
112116
{

src/libraries/System.Net.WebSockets.Client/src/Resources/Strings.resx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@
7878
<data name="net_WebSockets_Connect101Expected" xml:space="preserve">
7979
<value>The server returned status code '{0}' when status code '101' was expected.</value>
8080
</data>
81+
<data name="net_WebSockets_Connect200Expected" xml:space="preserve">
82+
<value>The server returned status code '{0}' when status code '200' was expected.</value>
83+
</data>
8184
<data name="net_WebSockets_MissingResponseHeader" xml:space="preserve">
8285
<value>The server's response was missing the required header '{0}'.</value>
8386
</data>
@@ -129,4 +132,4 @@
129132
<data name="net_WebSockets_ClientWindowBitsNegotiationFailure" xml:space="preserve">
130133
<value>The WebSocket failed to negotiate max client window bits. The client requested {0} but the server responded with {1}.</value>
131134
</data>
132-
</root>
135+
</root>

src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/WebSocketHandle.Managed.cs

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -44,32 +44,36 @@ public void Abort()
4444

4545
public async Task ConnectAsync(Uri uri, HttpMessageInvoker? invoker, CancellationToken cancellationToken, ClientWebSocketOptions options)
4646
{
47-
invoker ??= new HttpMessageInvoker(SetupHandler(options));
47+
bool disposeHandler = false;
48+
invoker ??= new HttpMessageInvoker(SetupHandler(options, out disposeHandler));
4849
HttpResponseMessage? response = null;
4950

50-
// TODO setup to false
51-
bool disposeHandler = true;
51+
bool tryDowngrade = false;
5252
try
5353
{
54-
if (options.HttpVersion.Major >= 3 && options.HttpVersionPolicy != HttpVersionPolicy.RequestVersionOrLower)
55-
{
56-
throw new Exception();
57-
}
58-
59-
var request = new HttpRequestMessage(HttpMethod.Get, uri);
60-
if (options.HttpVersion.Major >= 2 || (options.HttpVersionPolicy == HttpVersionPolicy.RequestVersionOrHigher))
61-
{
62-
request.Version = new Version(2, 0);
63-
}
64-
else
65-
{
66-
request.Version = new Version(1, 1);
67-
}
6854

6955
while (true)
7056
{
7157
try
7258
{
59+
HttpRequestMessage request;
60+
if (!tryDowngrade && options.HttpVersion == HttpVersion.Version20
61+
|| (options.HttpVersion == HttpVersion.Version11 && options.HttpVersionPolicy == HttpVersionPolicy.RequestVersionOrHigher))
62+
{
63+
request = new HttpRequestMessage(HttpMethod.Connect, uri);
64+
request.Version = new Version(2, 0);
65+
tryDowngrade = true;
66+
}
67+
else if (tryDowngrade || options.HttpVersion == HttpVersion.Version11)
68+
{
69+
request = new HttpRequestMessage(HttpMethod.Get, uri);
70+
request.Version = new Version(1, 1);
71+
tryDowngrade = false;
72+
}
73+
else
74+
{
75+
throw new WebSocketException(WebSocketError.UnsupportedProtocol);
76+
}
7377
if (options._requestHeaders?.Count > 0) // use field to avoid lazily initializing the collection
7478
{
7579
foreach (string key in options.RequestHeaders)
@@ -107,13 +111,11 @@ public async Task ConnectAsync(Uri uri, HttpMessageInvoker? invoker, Cancellatio
107111
}
108112
catch (HttpRequestException ex)
109113
{
110-
if (ex.Data.Contains("SETTINGS_ENABLE_CONNECT_PROTOCOL") && request.Version.Major == 2
111-
&& (options.HttpVersion.Major == 2 && options.HttpVersionPolicy == HttpVersionPolicy.RequestVersionOrLower
112-
|| options.HttpVersion.Major == 1 && options.HttpVersionPolicy == HttpVersionPolicy.RequestVersionOrHigher))
114+
if (!ex.Data.Contains("SETTINGS_ENABLE_CONNECT_PROTOCOL") || !tryDowngrade
115+
|| (options.HttpVersion != HttpVersion.Version11 && options.HttpVersionPolicy != HttpVersionPolicy.RequestVersionOrLower))
113116
{
114-
request.Version = new Version(1, 1);
117+
throw ex;
115118
}
116-
else { throw ex; }
117119
}
118120

119121
}
@@ -205,7 +207,7 @@ public async Task ConnectAsync(Uri uri, HttpMessageInvoker? invoker, Cancellatio
205207
}
206208
}
207209

208-
private static SocketsHttpHandler SetupHandler(ClientWebSocketOptions options)
210+
private static SocketsHttpHandler SetupHandler(ClientWebSocketOptions options, out bool disposeHandler)
209211
{
210212
SocketsHttpHandler? handler;
211213
// Create the handler for this request and populate it with all of the options.
@@ -218,6 +220,7 @@ private static SocketsHttpHandler SetupHandler(ClientWebSocketOptions options)
218220
options.RemoteCertificateValidationCallback == null &&
219221
options._clientCertificates?.Count == 0)
220222
{
223+
disposeHandler = false;
221224
handler = s_defaultHandler;
222225
if (handler == null)
223226
{
@@ -236,6 +239,7 @@ private static SocketsHttpHandler SetupHandler(ClientWebSocketOptions options)
236239
}
237240
else
238241
{
242+
disposeHandler = true;
239243
handler = new SocketsHttpHandler();
240244
handler.PooledConnectionLifetime = TimeSpan.Zero;
241245
handler.CookieContainer = options.Cookies;
@@ -424,7 +428,7 @@ private static void ValidateResponse(HttpResponseMessage response, string secVal
424428
{
425429
if (response.StatusCode != HttpStatusCode.OK)
426430
{
427-
throw new WebSocketException(WebSocketError.NotAWebSocket, SR.Format(SR.net_WebSockets_Connect101Expected, (int)response.StatusCode));
431+
throw new WebSocketException(WebSocketError.NotAWebSocket, SR.Format(SR.net_WebSockets_Connect200Expected, (int)response.StatusCode));
428432
}
429433
}
430434

0 commit comments

Comments
 (0)