public void Get_via_internal_routing_follows_301_but_expects_query_to_be_in_location() { using (var hostInfo = DreamTestHelper.CreateRandomPortHost()) { var mock = MockService.CreateMockService(hostInfo); var redirectCalled = 0; var targetCalled = 0; mock.Service.CatchAllCallback = delegate(DreamContext context, DreamMessage request, Result <DreamMessage> response) { var msg = "nothing here"; var q = context.Uri.GetParam("q"); var forward = context.Uri.GetParam("forward"); if (context.Uri.LastSegment == "redirect") { _log.Debug("called redirect"); var redirect = context.Service.Self.Uri.At("target").AsPublicUri(); if (forward == "true") { redirect = redirect.With("q", q); } redirectCalled++; var headers = new DreamHeaders(); headers.Add(DreamHeaders.LOCATION, redirect.ToString()); response.Return(new DreamMessage(DreamStatus.MovedPermanently, headers)); return; } if (context.Uri.LastSegment == "target") { _log.Debug("called target"); if (q == "x") { _log.Debug("target request had query"); targetCalled++; response.Return(DreamMessage.Ok()); return; } response.Return(DreamMessage.BadRequest("missing query param")); return; } _log.DebugFormat("called uri: {0} => {1}", context.Uri, msg); response.Return(DreamMessage.NotFound(msg)); }; var uri = mock.AtLocalMachine.At("redirect"); _log.DebugFormat("calling redirect service at {0}", uri); var r = Plug.New(uri).With("q", "x").Get(new Result <DreamMessage>()).Wait(); Assert.AreEqual(DreamStatus.BadRequest, r.Status); Assert.AreEqual(1, redirectCalled, "redirect without forward called incorrectly"); Assert.AreEqual(0, targetCalled, "target without forward called incorrectly"); redirectCalled = 0; targetCalled = 0; r = Plug.New(uri).With("q", "x").With("forward", "true").Get(new Result <DreamMessage>()).Wait(); Assert.IsTrue(r.IsSuccessful, r.HasDocument ? r.ToDocument()["message"].AsText : "request failed: " + r.Status); Assert.AreEqual(1, redirectCalled, "redirect with forward called incorrectly"); Assert.AreEqual(1, targetCalled, "target with forward called incorrectly"); } }
public void Get_via_internal_routing_follows_301_and_forwards_headers() { using (var hostInfo = DreamTestHelper.CreateRandomPortHost()) { var mock = MockService.CreateMockService(hostInfo); var redirectCalled = 0; var targetCalled = 0; mock.Service.CatchAllCallback = delegate(DreamContext context, DreamMessage request, Result <DreamMessage> response) { var msg = "nothing here"; var h = request.Headers["h"]; if (context.Uri.LastSegment == "redirect") { _log.Debug("called redirect"); if (h == "y") { redirectCalled++; var headers = new DreamHeaders(); headers.Add(DreamHeaders.LOCATION, context.Service.Self.Uri.At("target").AsPublicUri().ToString()); response.Return(new DreamMessage(DreamStatus.MovedPermanently, headers)); return; } msg = "redirect request lacked header"; } if (context.Uri.LastSegment == "target") { _log.Debug("called target"); if (h == "y") { _log.Debug("target request had header"); targetCalled++; response.Return(DreamMessage.Ok()); return; } msg = "target request lacked header ({1}"; } _log.DebugFormat("called uri: {0} => {1}", context.Uri, msg); response.Return(DreamMessage.NotFound(msg)); }; var uri = mock.AtLocalMachine.At("redirect"); _log.DebugFormat("calling redirect service at {0}", uri); var r = Plug.New(uri).WithHeader("h", "y").Get(new Result <DreamMessage>()).Wait(); Assert.IsTrue(r.IsSuccessful, r.HasDocument ? r.ToDocument()["message"].AsText : "request failed: " + r.Status); Assert.AreEqual(1, redirectCalled, "redirect called incorrectly"); Assert.AreEqual(1, targetCalled, "target called incorrectly"); } }
public void Get_via_internal_routing_follows_301_but_expects_query_to_be_in_location() { using(var hostInfo = DreamTestHelper.CreateRandomPortHost()) { var mock = MockService.CreateMockService(hostInfo); var redirectCalled = 0; var targetCalled = 0; mock.Service.CatchAllCallback = delegate(DreamContext context, DreamMessage request, Result<DreamMessage> response) { var msg = "nothing here"; var q = context.Uri.GetParam("q"); var forward = context.Uri.GetParam("forward"); if(context.Uri.LastSegment == "redirect") { _log.Debug("called redirect"); var redirect = context.Service.Self.Uri.At("target").AsPublicUri(); if(forward == "true") { redirect = redirect.With("q", q); } redirectCalled++; var headers = new DreamHeaders(); headers.Add(DreamHeaders.LOCATION, redirect.ToString()); response.Return(new DreamMessage(DreamStatus.MovedPermanently, headers)); return; } if(context.Uri.LastSegment == "target") { _log.Debug("called target"); if(q == "x") { _log.Debug("target request had query"); targetCalled++; response.Return(DreamMessage.Ok()); return; } response.Return(DreamMessage.BadRequest("missing query param")); return; } _log.DebugFormat("called uri: {0} => {1}", context.Uri, msg); response.Return(DreamMessage.NotFound(msg)); }; var uri = mock.AtLocalMachine.At("redirect"); _log.DebugFormat("calling redirect service at {0}", uri); var r = Plug.New(uri).With("q", "x").GetAsync().Wait(); Assert.AreEqual(DreamStatus.BadRequest, r.Status); Assert.AreEqual(1, redirectCalled, "redirect without forward called incorrectly"); Assert.AreEqual(0, targetCalled, "target without forward called incorrectly"); redirectCalled = 0; targetCalled = 0; r = Plug.New(uri).With("q", "x").With("forward", "true").GetAsync().Wait(); Assert.IsTrue(r.IsSuccessful, r.HasDocument ? r.ToDocument()["message"].AsText : "request failed: " + r.Status); Assert.AreEqual(1, redirectCalled, "redirect with forward called incorrectly"); Assert.AreEqual(1, targetCalled, "target with forward called incorrectly"); } }
/// <summary> /// Create a copy of the instance with a header added. /// </summary> /// <param name="name">Header name.</param> /// <param name="value">Header value.</param> /// <returns>New instance.</returns> public Plug WithHeader(string name, string value) { if(name == null) { throw new ArgumentNullException("name"); } if(value == null) { throw new ArgumentNullException("value"); } DreamHeaders newHeaders = new DreamHeaders(_headers); newHeaders.Add(name, value); return new Plug(Uri, Timeout, newHeaders, _preHandlers, _postHandlers, Credentials, _cookieJarOverride, MaxAutoRedirects); }
public void Get_via_internal_routing_follows_301_and_forwards_headers() { using(var hostInfo = DreamTestHelper.CreateRandomPortHost()) { var mock = MockService.CreateMockService(hostInfo); var redirectCalled = 0; var targetCalled = 0; mock.Service.CatchAllCallback = delegate(DreamContext context, DreamMessage request, Result<DreamMessage> response) { var msg = "nothing here"; var h = request.Headers["h"]; if(context.Uri.LastSegment == "redirect") { _log.Debug("called redirect"); if(h == "y") { redirectCalled++; var headers = new DreamHeaders(); headers.Add(DreamHeaders.LOCATION, context.Service.Self.Uri.At("target").AsPublicUri().ToString()); response.Return(new DreamMessage(DreamStatus.MovedPermanently, headers)); return; } msg = "redirect request lacked header"; } if(context.Uri.LastSegment == "target") { _log.Debug("called target"); if(h == "y") { _log.Debug("target request had header"); targetCalled++; response.Return(DreamMessage.Ok()); return; } msg = "target request lacked header ({1}"; } _log.DebugFormat("called uri: {0} => {1}", context.Uri, msg); response.Return(DreamMessage.NotFound(msg)); }; var uri = mock.AtLocalMachine.At("redirect"); _log.DebugFormat("calling redirect service at {0}", uri); var r = Plug.New(uri).WithHeader("h", "y").GetAsync().Wait(); Assert.IsTrue(r.IsSuccessful, r.HasDocument ? r.ToDocument()["message"].AsText : "request failed: " + r.Status); Assert.AreEqual(1, redirectCalled, "redirect called incorrectly"); Assert.AreEqual(1, targetCalled, "target called incorrectly"); } }