protected override async Task<HttpResponseMessage> SendAsync (HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { if (connection == null) { connection = new Http2Connection (request.RequestUri.Host, (uint)request.RequestUri.Port, request.RequestUri.Scheme == Uri.UriSchemeHttps); } else { // TODO: Check if they tried to use a new host/port } await connection.Connect (); var resetComplete = new ManualResetEventSlim (false); var stream = await connection.CreateStream (); stream.OnFrameReceived += frame => { if (frame.IsEndStream) resetComplete.Set (); }; var headersFrame = new HeadersFrame (stream.StreamIdentifer); headersFrame.Headers.Add (":method", request.Method.Method.ToUpperInvariant ()); headersFrame.Headers.Add (":path", request.RequestUri.PathAndQuery); headersFrame.Headers.Add (":scheme", request.RequestUri.Scheme); headersFrame.Headers.Add (":authority", request.RequestUri.Authority); headersFrame.EndHeaders = true; headersFrame.EndStream = true; await connection.SendFrame (headersFrame); resetComplete.Wait (connection.ConnectionTimeout); var responseData = new List<byte> (); var responseHeaders = new NameValueCollection (); foreach (var f in stream.Frames) { if (f.Type == FrameType.Headers) { responseHeaders = (f as HeadersFrame)?.Headers ?? new NameValueCollection (); } else if (f.Type == FrameType.Data) { responseData.AddRange ((f as DataFrame).Data); //responseData += Encoding.ASCII.GetString ((f as DataFrame).Data); } else if (f.Type == FrameType.Continuation) { // TODO: } } var httpStatusStr = responseHeaders.GetValues (":status")?.FirstOrDefault (); var httpStatus = HttpStatusCode.InternalServerError; Enum.TryParse<HttpStatusCode> (httpStatusStr, out httpStatus); var httpResponseMsg = new HttpResponseMessage (httpStatus); foreach (var h in responseHeaders.AllKeys) { if (!h.StartsWith (":")) httpResponseMsg.Headers.TryAddWithoutValidation (h, responseHeaders [h]); } httpResponseMsg.Content = new ByteArrayContent (responseData.ToArray ()); return httpResponseMsg; }
public Http2Client (Http2ConnectionSettings connectionSettings, IStreamManager streamManager = null, IFlowControlManager flowControlManager = null) { this.flowControlManager = flowControlManager ?? new FlowControlManager (); this.streamManager = streamManager ?? new StreamManager (this.flowControlManager); this.ConnectionSettings = connectionSettings; connection = new Http2Connection (ConnectionSettings, this.streamManager, this.flowControlManager); }
public Http2Client(Http2ConnectionSettings connectionSettings, IStreamManager streamManager = null, IFlowControlManager flowControlManager = null) { FlowControlManager = flowControlManager ?? new FlowControlManager(); StreamManager = streamManager ?? new StreamManager(this.FlowControlManager); ConnectionSettings = connectionSettings; connection = new Http2Connection(ConnectionSettings, this.StreamManager, this.FlowControlManager); }
public async Task Connect() { if (connection != null && !connection.IsConnected()) { connection.Disconnect(); connection = null; } if (connection == null) { streamManager.Reset(); connection = new Http2Connection(ConnectionSettings, this.streamManager, this.flowControlManager); await connection.Connect().ConfigureAwait(false); } }
void Init (string host, uint port, bool useTls = false) { connection = new Http2Connection (host, port, useTls); }
protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { if (connection == null) { connection = new Http2Connection(request.RequestUri.Host, (uint)request.RequestUri.Port, request.RequestUri.Scheme == Uri.UriSchemeHttps); } else { // TODO: Check if they tried to use a new host/port } await connection.Connect(); var resetComplete = new ManualResetEventSlim(false); var stream = await connection.CreateStream(); stream.OnFrameReceived += frame => { if (frame.IsEndStream) { resetComplete.Set(); } }; var headersFrame = new HeadersFrame(stream.StreamIdentifer); headersFrame.Headers.Add(":method", request.Method.Method.ToUpperInvariant()); headersFrame.Headers.Add(":path", request.RequestUri.PathAndQuery); headersFrame.Headers.Add(":scheme", request.RequestUri.Scheme); headersFrame.Headers.Add(":authority", request.RequestUri.Authority); headersFrame.EndHeaders = true; headersFrame.EndStream = true; await connection.SendFrame(headersFrame); resetComplete.Wait(connection.ConnectionTimeout); var responseData = new List <byte> (); var responseHeaders = new NameValueCollection(); foreach (var f in stream.Frames) { if (f.Type == FrameType.Headers) { responseHeaders = (f as HeadersFrame)?.Headers ?? new NameValueCollection(); } else if (f.Type == FrameType.Data) { responseData.AddRange((f as DataFrame).Data); //responseData += Encoding.ASCII.GetString ((f as DataFrame).Data); } else if (f.Type == FrameType.Continuation) { // TODO: } } var httpStatusStr = responseHeaders.GetValues(":status")?.FirstOrDefault(); var httpStatus = HttpStatusCode.InternalServerError; Enum.TryParse <HttpStatusCode> (httpStatusStr, out httpStatus); var httpResponseMsg = new HttpResponseMessage(httpStatus); foreach (var h in responseHeaders.AllKeys) { if (!h.StartsWith(":")) { httpResponseMsg.Headers.TryAddWithoutValidation(h, responseHeaders [h]); } } httpResponseMsg.Content = new ByteArrayContent(responseData.ToArray()); return(httpResponseMsg); }
void Init(string host, uint port, bool useTls = false) { connection = new Http2Connection(host, port, useTls); }