Skip to content

Commit d78c437

Browse files
committed
Update HTTPS server variable in ProxyHeaderModule
We were updating SERVER_PROTOCOL which is not used in IIS for HTTP/HTTPS, but rather the version of HTTP. Instead, we need to update the HTTPS server variable.
1 parent cf6fc4e commit d78c437

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

src/Microsoft.AspNetCore.SystemWebAdapters/Adapters/ForwardedHost.Shared.cs

+8-4
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,23 @@ namespace Microsoft.AspNetCore.SystemWebAdapters;
1212

1313
internal readonly struct ForwardedHost
1414
{
15+
private readonly int? _port;
16+
1517
public ForwardedHost(string host, string? proto)
1618
{
1719
var hostString = HostString.FromUriComponent(host);
1820

21+
IsSecure = string.Equals("https", proto, StringComparison.OrdinalIgnoreCase);
1922
ServerName = hostString.Host;
20-
Port = hostString.Port is int p ? p : GetDefaultPort(proto);
23+
_port = hostString.Port;
2124
}
2225

23-
private static int GetDefaultPort(string? proto)
24-
=> string.Equals("https", proto, StringComparison.OrdinalIgnoreCase) ? 443 : 80;
26+
private int DefaultPort => IsSecure ? 443 : 80;
27+
28+
public bool IsSecure { get; }
2529

2630
public string ServerName { get; }
2731

28-
public int Port { get; }
32+
public int Port => _port is int port ? port : DefaultPort;
2933
}
3034
#endif

src/Microsoft.AspNetCore.SystemWebAdapters/Adapters/ProxyHeaderModule.Framework.cs

+9-7
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@
99

1010
namespace Microsoft.AspNetCore.SystemWebAdapters;
1111

12+
/// <summary>
13+
/// Updates server and request variables based on proxy headers. See https://docs.microsoft.com/en-us/iis/web-dev-reference/server-variables for reference on what server variables should be used.
14+
/// </summary>
1215
internal class ProxyHeaderModule : IHttpModule
1316
{
1417
private const string Host = "Host";
18+
private const string ServerHttps = "HTTPS";
1519
private const string ServerName = "SERVER_NAME";
1620
private const string ServerPort = "SERVER_PORT";
17-
private const string ServerProtocol = "SERVER_PROTOCOL";
1821
private const string ForwardedProto = "x-forwarded-proto";
1922
private const string ForwardedHost = "x-forwarded-host";
2023

@@ -71,26 +74,25 @@ public void UseHeaders(NameValueCollection requestHeaders, NameValueCollection s
7174

7275
serverVariables.Set(ServerName, value.ServerName);
7376
serverVariables.Set(ServerPort, value.Port.ToString(CultureInfo.InvariantCulture));
77+
serverVariables.Set(ServerHttps, value.IsSecure ? "YES" : "NO");
7478

7579
requestHeaders[Host] = host;
7680
}
77-
78-
if (proto is { })
79-
{
80-
serverVariables.Set(ServerProtocol, proto);
81-
}
8281
}
8382

8483
private void UseOptions(NameValueCollection requestHeaders, NameValueCollection serverVariables)
8584
{
8685
UseForwardedFor(requestHeaders, serverVariables);
8786

87+
var serverHttps = string.Equals("https", _options.Scheme, StringComparison.OrdinalIgnoreCase) ? "ON" : "OFF";
88+
8889
serverVariables.Set(ServerName, _options.ServerName);
8990
serverVariables.Set(ServerPort, _options.ServerPortString);
90-
serverVariables.Set(ServerProtocol, _options.Scheme);
91+
serverVariables.Set(ServerHttps, serverHttps);
9192
requestHeaders[Host] = _options.ServerHostString;
9293
}
9394

95+
9496
private static void UseForwardedFor(NameValueCollection requestHeaders, NameValueCollection serverVariables)
9597
{
9698
if (requestHeaders["x-forwarded-for"] is { } remote)

test/Microsoft.AspNetCore.SystemWebAdapters.Framework.Tests/ProxyHeaderModuleTests.cs

+11
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ public class ProxyHeaderModuleTests
1717
private const string RemoteHost = "REMOTE_HOST";
1818
private const string ServerName = "SERVER_NAME";
1919
private const string ServerPort = "SERVER_PORT";
20+
private const string ServerHttps = "HTTPS";
21+
private const string Yes = "YES";
22+
private const string No = "NO";
2023

2124
[Fact]
2225
public void NoHeaderChange()
@@ -57,6 +60,7 @@ public void HostWithPortNoProto()
5760
Assert.Null(serverVariables[RemoteHost]);
5861
Assert.Equal("localhost:81", requestHeaders[Host]);
5962
Assert.Null(requestHeaders[options.OriginalHostHeaderName]);
63+
Assert.Equal(No, serverVariables[ServerHttps]);
6064
}
6165

6266
[Fact]
@@ -81,6 +85,7 @@ public void HostWithNoPortNoProto()
8185
Assert.Null(serverVariables[RemoteHost]);
8286
Assert.Equal("localhost", requestHeaders[Host]);
8387
Assert.Null(requestHeaders[options.OriginalHostHeaderName]);
88+
Assert.Equal(No, serverVariables[ServerHttps]);
8489
}
8590

8691
[Fact]
@@ -106,6 +111,7 @@ public void HostWithNoPortHttp()
106111
Assert.Null(serverVariables[RemoteHost]);
107112
Assert.Equal("localhost", requestHeaders[Host]);
108113
Assert.Null(requestHeaders[options.OriginalHostHeaderName]);
114+
Assert.Equal(No, serverVariables[ServerHttps]);
109115
}
110116

111117
[Fact]
@@ -132,6 +138,7 @@ public void HostAlreadySet()
132138
Assert.Null(serverVariables[RemoteHost]);
133139
Assert.Equal("localhost", requestHeaders[Host]);
134140
Assert.Equal("localhost2:90", requestHeaders[options.OriginalHostHeaderName]);
141+
Assert.Equal(No, serverVariables[ServerHttps]);
135142
}
136143

137144
[Fact]
@@ -157,6 +164,7 @@ public void HostWithNoPortHttps()
157164
Assert.Null(serverVariables[RemoteHost]);
158165
Assert.Equal("localhost", requestHeaders[Host]);
159166
Assert.Null(requestHeaders[options.OriginalHostHeaderName]);
167+
Assert.Equal(Yes, serverVariables[ServerHttps]);
160168
}
161169

162170
[Fact]
@@ -182,6 +190,7 @@ public void IPv6NoPort()
182190
Assert.Null(serverVariables[RemoteHost]);
183191
Assert.Equal("::1", requestHeaders[Host]);
184192
Assert.Null(requestHeaders[options.OriginalHostHeaderName]);
193+
Assert.Equal(Yes, serverVariables[ServerHttps]);
185194
}
186195

187196
[Fact]
@@ -207,6 +216,7 @@ public void IPv6WithPort()
207216
Assert.Null(serverVariables[RemoteHost]);
208217
Assert.Equal("[::1]:81", requestHeaders[Host]);
209218
Assert.Null(requestHeaders[options.OriginalHostHeaderName]);
219+
Assert.Equal(Yes, serverVariables[ServerHttps]);
210220
}
211221

212222
[Fact]
@@ -230,6 +240,7 @@ public void ForwardedForSet()
230240
Assert.Null(requestHeaders[Host]);
231241
Assert.Null(serverVariables[ServerName]);
232242
Assert.Null(serverVariables[ServerPort]);
243+
Assert.Null(serverVariables[ServerHttps]);
233244
Assert.Equal(ForwardedForValue, serverVariables[RemoteAddress]);
234245
Assert.Equal(ForwardedForValue, serverVariables[RemoteHost]);
235246
Assert.Null(requestHeaders[options.OriginalHostHeaderName]);

0 commit comments

Comments
 (0)