Skip to content

Commit 5b5784d

Browse files
authored
Merge pull request #20873 from dotnet-maestro-bot/merge/release/3.1-to-master
[automated] Merge branch 'release/3.1' => 'master'
2 parents 1a21c18 + 998ebad commit 5b5784d

File tree

8 files changed

+55
-5
lines changed

8 files changed

+55
-5
lines changed

eng/Version.Details.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,4 +317,4 @@
317317
<Sha>fbae122a63ebbf1c7176e36fb6d3b26d681be8ab</Sha>
318318
</Dependency>
319319
</ToolsetDependencies>
320-
</Dependencies>
320+
</Dependencies>

eng/Versions.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,4 +249,4 @@
249249
<DotNetAssetRootUrl Condition="'$(DotNetAssetRootUrl)'==''">https://dotnetcli.blob.core.windows.net/dotnet/</DotNetAssetRootUrl>
250250
<DotNetPrivateAssetRootUrl Condition="'$(DotNetPrivateAssetRootUrl)'==''">https://dotnetclimsrc.blob.core.windows.net/dotnet/</DotNetPrivateAssetRootUrl>
251251
</PropertyGroup>
252-
</Project>
252+
</Project>

eng/common/tools.sh

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,14 @@ function InstallDotNet {
201201

202202
local runtimeSourceFeedKey=''
203203
if [[ -n "${7:-}" ]]; then
204-
decodedFeedKey=`echo $7 | base64 --decode`
204+
# The 'base64' binary on alpine uses '-d' and doesn't support '--decode'
205+
# '-d'. To work around this, do a simple detection and switch the parameter
206+
# accordingly.
207+
decodeArg="--decode"
208+
if base64 --help 2>&1 | grep -q "BusyBox"; then
209+
decodeArg="-d"
210+
fi
211+
decodedFeedKey=`echo $7 | base64 $decodeArg`
205212
runtimeSourceFeedKey="--feed-credential $decodedFeedKey"
206213
fi
207214

src/Hosting/Hosting/test/HostingApplicationDiagnosticsTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,6 @@ public void ActivityBaggageValuesAreUrlDecodedFromHeaders()
374374
Assert.Contains(Activity.Current.Baggage, pair => pair.Key == "Key1" && pair.Value == "value1/1");
375375
}
376376

377-
378377
[Fact]
379378
public void ActivityTraceParentAndTraceStateFromHeaders()
380379
{

src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.Log.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ private static class Log
6666
private static readonly Action<ILogger, HttpTransportType, Exception> _transportStarted =
6767
LoggerMessage.Define<HttpTransportType>(LogLevel.Debug, new EventId(18, "TransportStarted"), "Transport '{Transport}' started.");
6868

69+
private static readonly Action<ILogger, Exception> _serverSentEventsNotSupportedByBrowser =
70+
LoggerMessage.Define(LogLevel.Debug, new EventId(19, "ServerSentEventsNotSupportedByBrowser"), "Skipping ServerSentEvents because they are not supported by the browser.");
71+
6972
public static void Starting(ILogger logger)
7073
{
7174
_starting(logger, null);
@@ -167,6 +170,11 @@ public static void TransportStarted(ILogger logger, HttpTransportType transportT
167170
{
168171
_transportStarted(logger, transportType, null);
169172
}
173+
174+
public static void ServerSentEventsNotSupportedByBrowser(ILogger logger)
175+
{
176+
_serverSentEventsNotSupportedByBrowser(logger, null);
177+
}
170178
}
171179
}
172180
}

src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public partial class HttpConnection : ConnectionContext, IConnectionInherentKeep
3737
private bool _started;
3838
private bool _disposed;
3939
private bool _hasInherentKeepAlive;
40+
private bool _isRunningInBrowser;
4041

4142
private readonly HttpClient _httpClient;
4243
private readonly HttpConnectionOptions _httpConnectionOptions;
@@ -150,6 +151,14 @@ public HttpConnection(HttpConnectionOptions httpConnectionOptions, ILoggerFactor
150151
_httpClient = CreateHttpClient();
151152
}
152153

154+
_isRunningInBrowser = Utils.IsRunningInBrowser();
155+
156+
157+
if (httpConnectionOptions.Transports == HttpTransportType.ServerSentEvents && _isRunningInBrowser)
158+
{
159+
throw new ArgumentException("ServerSentEvents can not be the only transport specified when running in the browser.", nameof(httpConnectionOptions));
160+
}
161+
153162
_transportFactory = new DefaultTransportFactory(httpConnectionOptions.Transports, _loggerFactory, _httpClient, httpConnectionOptions, GetAccessTokenAsync);
154163
_logScope = new ConnectionLogScope();
155164

@@ -365,6 +374,13 @@ private async Task SelectAndStartTransport(TransferFormat transferFormat, Cancel
365374
continue;
366375
}
367376

377+
if (transportType == HttpTransportType.ServerSentEvents && _isRunningInBrowser)
378+
{
379+
Log.ServerSentEventsNotSupportedByBrowser(_logger);
380+
transportExceptions.Add(new TransportFailedException("ServerSentEvents", "The transport is not supported in the browser."));
381+
continue;
382+
}
383+
368384
try
369385
{
370386
if ((transportType & _httpConnectionOptions.Transports) == 0)

src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/Utils.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5+
using System.Runtime.InteropServices;
56

67
namespace Microsoft.AspNetCore.Http.Connections.Client.Internal
78
{
@@ -41,5 +42,10 @@ internal static Uri AppendQueryString(Uri url, string qs)
4142
builder.Query = newQueryString;
4243
return builder.Uri;
4344
}
45+
46+
internal static bool IsRunningInBrowser()
47+
{
48+
return RuntimeInformation.IsOSPlatform(OSPlatform.Create("BROWSER"));
49+
}
4450
}
4551
}

src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/WebSocketsTransport.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.IO.Pipelines;
77
using System.Net.WebSockets;
88
using System.Runtime.InteropServices;
9+
using System.Text.Encodings.Web;
910
using System.Threading;
1011
using System.Threading.Tasks;
1112
using Microsoft.AspNetCore.Connections;
@@ -23,6 +24,7 @@ internal partial class WebSocketsTransport : ITransport
2324
private readonly ILogger _logger;
2425
private readonly TimeSpan _closeTimeout;
2526
private volatile bool _aborted;
27+
private bool _isRunningInBrowser;
2628

2729
private IDuplexPipe _transport;
2830

@@ -93,6 +95,8 @@ public WebSocketsTransport(HttpConnectionOptions httpConnectionOptions, ILoggerF
9395

9496
// Ignore the HttpConnectionOptions access token provider. We were given an updated delegate from the HttpConnection.
9597
_accessTokenProvider = accessTokenProvider;
98+
99+
_isRunningInBrowser = Utils.IsRunningInBrowser();
96100
}
97101

98102
public async Task StartAsync(Uri url, TransferFormat transferFormat, CancellationToken cancellationToken = default)
@@ -119,7 +123,17 @@ public async Task StartAsync(Uri url, TransferFormat transferFormat, Cancellatio
119123
var accessToken = await _accessTokenProvider();
120124
if (!string.IsNullOrEmpty(accessToken))
121125
{
122-
_webSocket.Options.SetRequestHeader("Authorization", $"Bearer {accessToken}");
126+
// We can't use request headers in the browser, so instead append the token as a query string in that case
127+
if (_isRunningInBrowser)
128+
{
129+
var accessTokenEncoded = UrlEncoder.Default.Encode(accessToken);
130+
accessTokenEncoded = "access_token=" + accessTokenEncoded;
131+
resolvedUrl = Utils.AppendQueryString(resolvedUrl, accessTokenEncoded);
132+
}
133+
else
134+
{
135+
_webSocket.Options.SetRequestHeader("Authorization", $"Bearer {accessToken}");
136+
}
123137
}
124138
}
125139

0 commit comments

Comments
 (0)