Skip to content

Commit a0cfa40

Browse files
authored
Add HttpContext.RewritePath (#145)
1 parent ddb8eed commit a0cfa40

File tree

9 files changed

+80
-60
lines changed

9 files changed

+80
-60
lines changed

samples/MvcApp/Web.config

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<!--
33
For more information on how to configure your ASP.NET application, please visit
44
https://go.microsoft.com/fwlink/?LinkId=301880
@@ -130,7 +130,7 @@
130130
<system.webServer>
131131
<modules>
132132
<remove name="SystemWebAdapterModule" />
133-
<add name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters" preCondition="managedHandler" />
133+
<add name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices" preCondition="managedHandler" />
134134
</modules>
135135
<handlers>
136136
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />

samples/RemoteAuth/Bearer/RemoteBearer/Web.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
<system.webServer>
9292
<modules>
9393
<remove name="SystemWebAdapterModule" />
94-
<add name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters" preCondition="managedHandler" />
94+
<add name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices" preCondition="managedHandler" />
9595
</modules>
9696
</system.webServer>
9797
</configuration>

samples/RemoteAuth/Forms/FormsAuth/Web.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
<system.webServer>
4343
<modules>
4444
<remove name="SystemWebAdapterModule" />
45-
<add name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters" preCondition="managedHandler" />
45+
<add name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices" preCondition="managedHandler" />
4646
</modules>
4747
</system.webServer>
4848
</configuration>

samples/RemoteAuth/OIDC/OIDCAuth/Web.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
<system.webServer>
8383
<modules>
8484
<remove name="SystemWebAdapterModule"/>
85-
<add name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters" preCondition="managedHandler"/>
85+
<add name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices" preCondition="managedHandler" />
8686
</modules>
8787
</system.webServer>
8888
</configuration>

src/Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices/Content/Web.config.install.xdt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<system.webServer>
2929
<modules>
3030
<remove xdt:Transform="Insert" name="SystemWebAdapterModule" />
31-
<add xdt:Transform="Insert" name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters" preCondition="managedHandler" />
31+
<add xdt:Transform="Insert" name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices" preCondition="managedHandler" />
3232
</modules>
3333
</system.webServer>
3434

Lines changed: 3 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,13 @@
1-
T:Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdaptersExtensions
2-
T:Microsoft.AspNetCore.SystemWebAdapters.ISystemWebAdapterBuilder
3-
4-
# Prebuffering
5-
T:Microsoft.AspNetCore.SystemWebAdapters.IPreBufferRequestStreamMetadata
6-
T:Microsoft.AspNetCore.SystemWebAdapters.PreBufferRequestStreamAttribute
7-
8-
# Session
9-
T:Microsoft.AspNetCore.SystemWebAdapters.SessionAttribute
10-
T:Microsoft.AspNetCore.SystemWebAdapters.ISessionState
11-
T:Microsoft.AspNetCore.SystemWebAdapters.ISessionMetadata
12-
T:Microsoft.AspNetCore.SystemWebAdapters.ISessionManager
13-
T:Microsoft.AspNetCore.SystemWebAdapters.SessionBehavior
14-
T:Microsoft.AspNetCore.SystemWebAdapters.SessionState.RemoteAppSessionStateExtensions
15-
T:Microsoft.AspNetCore.SystemWebAdapters.SessionState.RemoteAppSessionStateOptions
16-
T:Microsoft.AspNetCore.SystemWebAdapters.SessionState.DelegatingSessionState
17-
T:Microsoft.AspNetCore.SystemWebAdapters.SessionState.SessionOptions
181
M:System.Web.SessionState.HttpSessionState.#ctor(Microsoft.AspNetCore.SystemWebAdapters.ISessionState)
19-
20-
# Buffering
21-
T:Microsoft.AspNetCore.SystemWebAdapters.BufferResponseStreamAttribute
22-
T:Microsoft.AspNetCore.SystemWebAdapters.IBufferResponseStreamMetadata
23-
24-
# Caching
252
M:System.Web.Caching.Cache.#ctor(System.Runtime.Caching.ObjectCache)
26-
27-
# Internal constructors
28-
M:System.Web.HttpContext.#ctor(Microsoft.AspNetCore.Http.HttpContext)
293
M:System.Web.HttpContext.op_Implicit(Microsoft.AspNetCore.Http.HttpContext)~System.Web.HttpContext
304
M:System.Web.HttpContext.op_Implicit(System.Web.HttpContext)~Microsoft.AspNetCore.Http.HttpContext
31-
325
M:System.Web.HttpContextBase.op_Implicit(Microsoft.AspNetCore.Http.HttpContext)~System.Web.HttpContextBase
33-
34-
M:System.Web.HttpRequest.#ctor(Microsoft.AspNetCore.Http.HttpRequest)
356
M:System.Web.HttpRequest.op_Implicit(Microsoft.AspNetCore.Http.HttpRequest)~System.Web.HttpRequest
367
M:System.Web.HttpRequest.op_Implicit(System.Web.HttpRequest)~Microsoft.AspNetCore.Http.HttpRequest
37-
38-
M:System.Web.HttpResponse.#ctor(Microsoft.AspNetCore.Http.HttpResponse)
398
M:System.Web.HttpResponse.op_Implicit(Microsoft.AspNetCore.Http.HttpResponse)~System.Web.HttpResponse
409
M:System.Web.HttpResponse.op_Implicit(System.Web.HttpResponse)~Microsoft.AspNetCore.Http.HttpResponse
4110

42-
M:System.Web.HttpServerUtility.#ctor(Microsoft.AspNetCore.Http.HttpContext)
43-
44-
M:System.Web.Caching.Cache.#ctor(Microsoft.AspNetCore.Http.HttpContext)
45-
46-
M:System.Web.Caching.Cache.#ctor(Microsoft.Extensions.Caching.Memory.IMemoryCache)
47-
48-
# Authentication
49-
T:Microsoft.AspNetCore.SystemWebAdapters.RemoteAppAuthenticationExtensions
50-
T:Microsoft.AspNetCore.SystemWebAdapters.RemoteServiceOptions
51-
T:Microsoft.AspNetCore.SystemWebAdapters.Authentication.IRemoteAppAuthenticationResultProcessor
52-
T:Microsoft.AspNetCore.SystemWebAdapters.Authentication.RemoteAppAuthenticationDefaults
53-
T:Microsoft.AspNetCore.SystemWebAdapters.Authentication.RemoteAppAuthenticationOptions
54-
T:Microsoft.AspNetCore.SystemWebAdapters.Authentication.RemoteAppAuthenticationResult
55-
56-
# Additionl Metadata
57-
T:Microsoft.AspNetCore.SystemWebAdapters.ISetThreadCurrentPrincipal
58-
T:Microsoft.AspNetCore.SystemWebAdapters.SetThreadCurrentPrincipalAttribute
59-
T:Microsoft.AspNetCore.SystemWebAdapters.ISingleThreadedRequestMetadata
60-
T:Microsoft.AspNetCore.SystemWebAdapters.SingleThreadedRequestAttribute
61-
62-
# Files
63-
M:System.Web.HttpFileCollection.#ctor(Microsoft.AspNetCore.Http.IFormFileCollection)
64-
M:System.Web.HttpPostedFile.#ctor(Microsoft.AspNetCore.Http.IFormFile)
11+
T:Microsoft.AspNetCore.SystemWebAdapters.ISessionState
12+
T:Microsoft.AspNetCore.SystemWebAdapters.ISessionKeySerializer
13+
T:Microsoft.AspNetCore.SystemWebAdapters.SessionState.Serialization.ISessionSerializer

src/Microsoft.AspNetCore.SystemWebAdapters/HttpContext.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,32 @@ public IPrincipal User
5858

5959
public DateTime Timestamp { get; } = DateTime.UtcNow.ToLocalTime();
6060

61+
public void RewritePath(string path)
62+
{
63+
if (path is null)
64+
{
65+
throw new ArgumentNullException(nameof(path));
66+
}
67+
68+
// Extract query string
69+
string? qs = null;
70+
var iqs = path.IndexOf('?', StringComparison.Ordinal);
71+
72+
if (iqs >= 0)
73+
{
74+
qs = (iqs < path.Length - 1) ? path[iqs..] : string.Empty;
75+
path = path[..iqs];
76+
}
77+
78+
if (!path.StartsWith("/", StringComparison.Ordinal))
79+
{
80+
path = "/" + path;
81+
}
82+
83+
_context.Request.QueryString = new QueryString(qs);
84+
_context.Request.Path = new PathString(path.Trim());
85+
}
86+
6187
[SuppressMessage("Design", "CA1033:Interface methods should be callable by child types", Justification = Constants.ApiFromAspNet)]
6288
object? IServiceProvider.GetService(Type service)
6389
{

src/Microsoft.AspNetCore.SystemWebAdapters/Ref.Standard.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ internal HttpContext() { }
5656
public System.DateTime Timestamp { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw new System.PlatformNotSupportedException("Only support when running on ASP.NET Core or System.Web");} }
5757
public System.Security.Principal.IPrincipal User { get { throw new System.PlatformNotSupportedException("Only support when running on ASP.NET Core or System.Web");} set { throw new System.PlatformNotSupportedException("Only support when running on ASP.NET Core or System.Web");} }
5858
public System.Web.ISubscriptionToken DisposeOnPipelineCompleted(System.IDisposable target) { throw new System.PlatformNotSupportedException("Only support when running on ASP.NET Core or System.Web");}
59+
public void RewritePath(string path) { throw new System.PlatformNotSupportedException("Only support when running on ASP.NET Core or System.Web");}
5960
object System.IServiceProvider.GetService(System.Type service) { throw new System.PlatformNotSupportedException("Only support when running on ASP.NET Core or System.Web");}
6061
}
6162
public partial class HttpContextBase : System.IServiceProvider

test/Microsoft.AspNetCore.SystemWebAdapters.Tests/HttpContextTests.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,5 +240,49 @@ public void DisposeOnPipelineCompletedDisposed()
240240
Assert.False(token.IsActive);
241241
disposable.Verify(d => d.Dispose(), Times.Once);
242242
}
243+
244+
[InlineData("path1", "/path1", "", 0)]
245+
[InlineData("/path1", "/path1", "", 0)]
246+
[InlineData("path1?", "/path1", "", 0)]
247+
[InlineData("/path1?", "/path1", "", 0)]
248+
[InlineData("path1?q=1", "/path1", "?q=1", 1)]
249+
[InlineData("/path1?q=1", "/path1", "?q=1", 1)]
250+
[InlineData("/path1 ?q=1", "/path1", "?q=1", 1)]
251+
[Theory]
252+
public void RewritePath(string rewritePath, string finalPath, string finalQuery, int queryCount)
253+
{
254+
// Arrange
255+
var coreContext = new DefaultHttpContext();
256+
var context = new HttpContext(coreContext);
257+
258+
// Act
259+
context.RewritePath(rewritePath);
260+
261+
// Assert
262+
Assert.Equal(finalPath, coreContext.Request.Path);
263+
Assert.Equal(new(finalQuery), coreContext.Request.QueryString);
264+
Assert.Equal(queryCount, coreContext.Request.Query.Count);
265+
}
266+
267+
[Fact]
268+
public void RewritePathWithSpace()
269+
{
270+
// Arrange
271+
var coreContext = new DefaultHttpContext();
272+
var context = new HttpContext(coreContext);
273+
var rewritePath = "/path1 withspace?q=1";
274+
275+
// Act
276+
context.RewritePath(rewritePath);
277+
278+
// Assert
279+
Assert.Equal("/path1%20withspace", coreContext.Request.Path);
280+
Assert.Equal("/path1 withspace", context.Request.Path);
281+
Assert.Collection(coreContext.Request.Query, q =>
282+
{
283+
Assert.Equal("q", q.Key);
284+
Assert.Equal("1", q.Value);
285+
});
286+
}
243287
}
244288
}

0 commit comments

Comments
 (0)