protected override Task Invoke(IDictionary <string, object> env, HttpRequestMessage requestMessage, CancellationToken cancellationToken) { return(this._invoker.SendAsync(requestMessage, cancellationToken).Then(delegate(HttpResponseMessage responseMessage) { if (responseMessage.StatusCode == HttpStatusCode.NotFound) { responseMessage.Dispose(); return this._next.Invoke(env, requestMessage, cancellationToken); } Task result; try { result = OwinHttpMessageUtilities.SendResponseMessage(env, responseMessage, cancellationToken).Finally(delegate { responseMessage.Dispose(); }, true); } catch (Exception) { responseMessage.Dispose(); throw; } return result; }, default(CancellationToken), false)); }
private static Uri CreateRequestUri(IDictionary <string, object> environment, IDictionary <string, string[]> requestHeaders) { var requestScheme = OwinHttpMessageUtilities.Get <string>(environment, Constants.RequestSchemeKey); var requestPathBase = OwinHttpMessageUtilities.Get <string>(environment, Constants.RequestPathBaseKey); var requestPath = OwinHttpMessageUtilities.Get <string>(environment, Constants.RequestPathKey); var requestQueryString = OwinHttpMessageUtilities.Get <string>(environment, Constants.RequestQueryStringKey); // default values, in absence of a host header string host = "127.0.0.1"; int port = String.Equals(requestScheme, Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase) ? 443 : 80; // if a single host header is available string[] hostAndPort; if (requestHeaders.TryGetValue("Host", out hostAndPort) && hostAndPort != null && hostAndPort.Length == 1 && !String.IsNullOrWhiteSpace(hostAndPort[0])) { // try to parse as "host:port" format int delimiterIndex = hostAndPort[0].LastIndexOf(':'); int portValue; if (delimiterIndex != -1 && Int32.TryParse(hostAndPort[0].Substring(delimiterIndex + 1), out portValue)) { // use those two values host = hostAndPort[0].Substring(0, delimiterIndex); port = portValue; } else { // otherwise treat as host name host = hostAndPort[0]; } } var uriBuilder = new UriBuilder(requestScheme, host, port, requestPathBase + requestPath); if (!String.IsNullOrEmpty(requestQueryString)) { uriBuilder.Query = requestQueryString; } return(uriBuilder.Uri); }
internal static HttpRequestMessage GetRequestMessage(IDictionary <string, object> environment) { string method = OwinHttpMessageUtilities.Get <string>(environment, "owin.RequestMethod"); IDictionary <string, string[]> dictionary = OwinHttpMessageUtilities.Get <IDictionary <string, string[]> >(environment, "owin.RequestHeaders"); Stream content = OwinHttpMessageUtilities.Get <Stream>(environment, "owin.RequestBody") ?? Stream.Null; Uri requestUri = OwinHttpMessageUtilities.CreateRequestUri(environment, dictionary); HttpRequestMessage httpRequestMessage = new HttpRequestMessage(new HttpMethod(method), requestUri) { Content = new StreamContent(content) }; OwinHttpMessageUtilities.MapRequestProperties(httpRequestMessage, environment); foreach (KeyValuePair <string, string[]> current in dictionary) { if (!httpRequestMessage.Headers.TryAddWithoutValidation(current.Key, current.Value)) { httpRequestMessage.Content.Headers.TryAddWithoutValidation(current.Key, current.Value); } } return(httpRequestMessage); }
/// <summary> /// Incoming call from prior OWIN middleware /// </summary> public Task Invoke(IDictionary <string, object> env) { return(this.Invoke(env, OwinHttpMessageUtilities.GetRequestMessage(env), OwinHttpMessageUtilities.GetCancellationToken(env))); }