internal RequestState(HttpRequestMessage request, CancellationToken cancellationToken)
{
_request = request;
_responseTcs = new TaskCompletionSource<HttpResponseMessage>();
_sendingHeaders = () => { };
request.Headers.Host = request.RequestUri.IsDefaultPort
? request.RequestUri.Host
: request.RequestUri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped);
OwinContext = new OwinContext();
OwinContext.Set("owin.Version", "1.0");
var owinRequest = OwinContext.Request;
owinRequest.Protocol = "HTTP/" + request.Version.ToString(2);
owinRequest.Scheme = request.RequestUri.Scheme;
owinRequest.Method = request.Method.ToString();
owinRequest.Path = PathString.FromUriComponent(request.RequestUri);
owinRequest.PathBase = PathString.Empty;
owinRequest.QueryString = QueryString.FromUriComponent(request.RequestUri);
owinRequest.CallCancelled = cancellationToken;
owinRequest.Set<Action<Action<object>, object>>("server.OnSendingHeaders", (callback, state) =>
{
var prior = _sendingHeaders;
_sendingHeaders = () =>
{
callback(state);
prior();
};
});
foreach (var header in request.Headers)
{
owinRequest.Headers.AppendValues(header.Key, header.Value.ToArray());
}
if (request.Content != null)
{
// Need to touch the ContentLength property for it to be calculated and added
// to the request.Content.Headers collection.
var d = request.Content.Headers.ContentLength;
foreach (var header in request.Content.Headers)
{
owinRequest.Headers.AppendValues(header.Key, header.Value.ToArray());
}
}
_responseStream = new ResponseStream(CompleteResponse);
OwinContext.Response.Body = _responseStream;
OwinContext.Response.StatusCode = 200;
}