Skip to content

Commit

Permalink
honor x-forwarded-proto when behind proxy
Browse files Browse the repository at this point in the history
  • Loading branch information
tpluscode committed Apr 28, 2019
1 parent 417d10a commit 53487f3
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 1 deletion.
32 changes: 32 additions & 0 deletions src/Nancy.Rdf.Tests/RdfResponseProcessorTests.cs
Expand Up @@ -114,6 +114,38 @@ public void Should_pass_SiteBase_from_context_to_serializtion()
A<MemoryStream>._)).MustHaveHappened();
}

[Test]
public void Should_use_SSL_if_x_Forwarded_Proto_header_present()
{
// given
var serializer = A.Fake<IRdfSerializer>();
A.CallTo(() => serializer.CanSerialize(A<MediaRange>.Ignored)).Returns(true);
var processor = new RdfResponseProcessorTestable(new[] { serializer });

var path = new Url("http://example.com/api/test")
{
BasePath = "api"
};

var nancyContext = new NancyContext
{
Request = new Request("GET", path, headers: new Dictionary<string, IEnumerable<string>>
{
{"X-Forwarded-Proto", new []{"https"}}
})
};

// when
var response = processor.Process(new MediaRange("application/rdf+xml"), new object(), nancyContext);
response.Contents(new MemoryStream());

// then
A.CallTo(() => serializer.Serialize(
A<MediaRange>.That.Matches(mr => mr == RdfSerialization.RdfXml.MediaType),
A<WrappedModel>.That.Matches(wm => wm.BaseUrl == new Uri("https://example.com:80/")),
A<MemoryStream>._)).MustHaveHappened();
}

[Test]
public void Should_pass_actual_requested()
{
Expand Down
10 changes: 9 additions & 1 deletion src/Nancy.Rdf/Responses/RdfResponseProcessor.cs
Expand Up @@ -70,11 +70,19 @@ public ProcessorMatch CanProcess(MediaRange requestedMediaRange, [AllowNull] dyn
/// <returns>a response</returns>
public Response Process(MediaRange requestedMediaRange, dynamic model, NancyContext context)
{
var siteBase = context.Request.Url.SiteBase;

if (context.Request.Headers["X-Forwarded-Proto"].Any(v => v == "https"))
{
var siteBaseUri = new UriBuilder(siteBase) {Scheme = "HTTPS"};
siteBase = siteBaseUri.ToString();
}

return new Response
{
Contents = stream =>
{
var wrappedModel = new WrappedModel(model, context.Request.Url.SiteBase);
var wrappedModel = new WrappedModel(model, siteBase);
this.serializer.Serialize(requestedMediaRange, wrappedModel, stream);
},
StatusCode = HttpStatusCode.OK,
Expand Down

0 comments on commit 53487f3

Please sign in to comment.