public SspProxyRequestMiddlewareTests() { var sspApiSettingsMock = new Mock <IOptionsSnapshot <ApiSetting> >(); sspApiSettingsMock.Setup(op => op.Get(It.IsAny <string>())).Returns(AppSettings.SspApiSettings); var responseContent = FhirBinaries.Html.AsJsonString(); var response = new CommandResponse { StatusCode = 200, Headers = new Dictionary <string, IEnumerable <string> > { { HeaderNames.ContentType, new StringValues(new string[] { "application/fhir+json" }) }, { HeaderNames.ContentLength, new StringValues(new string[] { "80" }) } }, Content = Encoding.UTF8.GetBytes(responseContent) }; var sspServiceMock = new Mock <ISspProxyService>(); sspServiceMock.Setup(op => op.ForwardRequest(It.IsAny <CommandRequest>())).Returns(Task.FromResult(response)); _sspProxyService = sspServiceMock.Object; _sspApiSettings = sspApiSettingsMock.Object; }
public void Dispose() { _sspApiSettings = null; _sspProxyService = null; }
public async SystemTasks.Task Invoke(HttpContext context, IOptionsSnapshot <ApiSetting> apiSettings, ISspProxyService _sspProxyService) { _sspApiSettings = apiSettings.Get("SspApiSetting"); var request = new CommandRequest(); var forwardingUrl = context.Request.Path.Value.Replace($"{_sspApiSettings.BasePath}/", ""); request.Headers = context.Request.Headers.Select(h => KeyValuePair.Create(h.Key, string.Join("; ", (h.Value.ToList())))); request.Method = HttpMethod.Get; //could be more types in future, so fetch from context request.ForwardUrl = new Uri(WebUtility.UrlDecode(forwardingUrl)); request.Forwarded = new Forwarded { By = context.Connection.LocalIpAddress.ToString(), For = context.Connection.RemoteIpAddress.ToString(), Host = request.ForwardUrl.Host, Protocol = _sspApiSettings.Secure ? "https" : "http" }; var result = await _sspProxyService.ForwardRequest(request); context.Response.StatusCode = result.StatusCode; foreach (var resHeader in result.Headers) { context.Response.Headers.Add(resHeader.Key, new StringValues(resHeader.Value.ToArray())); } await context.Response.Body.WriteAsync(result.Content, 0, result.Content.Length); }