Skip to content

Commit 53487f3

Browse files
committed
honor x-forwarded-proto when behind proxy
1 parent 417d10a commit 53487f3

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

src/Nancy.Rdf.Tests/RdfResponseProcessorTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,38 @@ public void Should_pass_SiteBase_from_context_to_serializtion()
114114
A<MemoryStream>._)).MustHaveHappened();
115115
}
116116

117+
[Test]
118+
public void Should_use_SSL_if_x_Forwarded_Proto_header_present()
119+
{
120+
// given
121+
var serializer = A.Fake<IRdfSerializer>();
122+
A.CallTo(() => serializer.CanSerialize(A<MediaRange>.Ignored)).Returns(true);
123+
var processor = new RdfResponseProcessorTestable(new[] { serializer });
124+
125+
var path = new Url("http://example.com/api/test")
126+
{
127+
BasePath = "api"
128+
};
129+
130+
var nancyContext = new NancyContext
131+
{
132+
Request = new Request("GET", path, headers: new Dictionary<string, IEnumerable<string>>
133+
{
134+
{"X-Forwarded-Proto", new []{"https"}}
135+
})
136+
};
137+
138+
// when
139+
var response = processor.Process(new MediaRange("application/rdf+xml"), new object(), nancyContext);
140+
response.Contents(new MemoryStream());
141+
142+
// then
143+
A.CallTo(() => serializer.Serialize(
144+
A<MediaRange>.That.Matches(mr => mr == RdfSerialization.RdfXml.MediaType),
145+
A<WrappedModel>.That.Matches(wm => wm.BaseUrl == new Uri("https://example.com:80/")),
146+
A<MemoryStream>._)).MustHaveHappened();
147+
}
148+
117149
[Test]
118150
public void Should_pass_actual_requested()
119151
{

src/Nancy.Rdf/Responses/RdfResponseProcessor.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,19 @@ public ProcessorMatch CanProcess(MediaRange requestedMediaRange, [AllowNull] dyn
7070
/// <returns>a response</returns>
7171
public Response Process(MediaRange requestedMediaRange, dynamic model, NancyContext context)
7272
{
73+
var siteBase = context.Request.Url.SiteBase;
74+
75+
if (context.Request.Headers["X-Forwarded-Proto"].Any(v => v == "https"))
76+
{
77+
var siteBaseUri = new UriBuilder(siteBase) {Scheme = "HTTPS"};
78+
siteBase = siteBaseUri.ToString();
79+
}
80+
7381
return new Response
7482
{
7583
Contents = stream =>
7684
{
77-
var wrappedModel = new WrappedModel(model, context.Request.Url.SiteBase);
85+
var wrappedModel = new WrappedModel(model, siteBase);
7886
this.serializer.Serialize(requestedMediaRange, wrappedModel, stream);
7987
},
8088
StatusCode = HttpStatusCode.OK,

0 commit comments

Comments
 (0)