public void ReadHeadersAndInspectHandshake() { try { _response = Read11Headers(); _wasResponseReceived = true; } catch (Exception ex) { Http2Logger.LogError(ex.Message); throw; } }
// We've found a CRLFCRLF sequence. Confirm the status code is 101 for upgrade. private HandshakeResponse InspectHanshake(byte[] buffer, int split, int limit) { var handshake = new HandshakeResponse { ResponseBytes = new ArraySegment <byte>(buffer, 0, split), ExtraData = new ArraySegment <byte>(buffer, split, limit), }; // Must be at least "HTTP/1.1 101\r\nConnection: Upgrade\r\nUpgrade: HTTP/2.0\r\n\r\n" Contract.Assert(split >= 0 && split - 1 < buffer.Length); var response = Encoding.ASCII.GetString(buffer, 0, split); if (_end == ConnectionEnd.Client) { int status = StatusCode.Code101SwitchingProtocols; string reasonPhrase = StatusCode.GetReasonPhrase(status); if (response.StartsWith(String.Format("{0} {1} {2}", Protocols.Http1, status.ToString(), reasonPhrase), StringComparison.OrdinalIgnoreCase) && response.IndexOf(String.Format("\r\n{0}: {1}\r\n", CommonHeaders.Connection, CommonHeaders.Upgrade), StringComparison.OrdinalIgnoreCase) >= 0 && response.IndexOf(String.Format("\r\n{0}: {1}\r\n", CommonHeaders.Upgrade, Protocols.Http2NoTls), StringComparison.OrdinalIgnoreCase) >= 0) { handshake.Result = HandshakeResult.Upgrade; } else { handshake.Result = HandshakeResult.NonUpgrade; } } else { if ( response.IndexOf(String.Format("\r\n{0}: {1}, {2}\r\n", CommonHeaders.Connection, CommonHeaders.Upgrade, CommonHeaders.Http2Settings), StringComparison.OrdinalIgnoreCase) >= 0 && response.IndexOf(String.Format("\r\n{0}: {1}\r\n", CommonHeaders.Upgrade, Protocols.Http2NoTls), StringComparison.OrdinalIgnoreCase) >= 0 && response.IndexOf(String.Format("\r\n{0}:", CommonHeaders.Http2Settings), StringComparison.OrdinalIgnoreCase) >= 0) { GetHeaders(response); handshake.Result = HandshakeResult.Upgrade; } else { handshake.Result = HandshakeResult.NonUpgrade; } } return(handshake); }
// We've found a CRLFCRLF sequence. Confirm the status code is 101 for upgrade. private HandshakeResponse InspectHanshake(byte[] buffer, int split, int limit) { var handshake = new HandshakeResponse { ResponseBytes = new ArraySegment<byte>(buffer, 0, split), ExtraData = new ArraySegment<byte>(buffer, split, limit), }; // Must be at least "HTTP/1.1 101\r\nConnection: Upgrade\r\nUpgrade: HTTP/2.0\r\n\r\n" Contract.Assert(split >= 0 && split - 1 < buffer.Length); var response = Encoding.ASCII.GetString(buffer, 0, split); if (_end == ConnectionEnd.Client) { int status = StatusCode.Code101SwitchingProtocols; string reasonPhrase = StatusCode.GetReasonPhrase(status); if (response.StartsWith(String.Format("{0} {1} {2}", Protocols.Http1, status.ToString(), reasonPhrase), StringComparison.OrdinalIgnoreCase) && response.IndexOf(String.Format("\r\n{0}: {1}\r\n", CommonHeaders.Connection, CommonHeaders.Upgrade), StringComparison.OrdinalIgnoreCase) >= 0 && response.IndexOf(String.Format("\r\n{0}: {1}\r\n", CommonHeaders.Upgrade, Protocols.Http2), StringComparison.OrdinalIgnoreCase) >= 0) { handshake.Result = HandshakeResult.Upgrade; } else { handshake.Result = HandshakeResult.NonUpgrade; } } else { if ( response.IndexOf(String.Format("\r\n{0}: {1}, {2}\r\n", CommonHeaders.Connection, CommonHeaders.Upgrade, CommonHeaders.Http2Settings), StringComparison.OrdinalIgnoreCase) >= 0 && response.IndexOf(String.Format("\r\n{0}: {1}\r\n", CommonHeaders.Upgrade, Protocols.Http2), StringComparison.OrdinalIgnoreCase) >= 0 && response.IndexOf(String.Format("\r\n{0}:", CommonHeaders.Http2Settings), StringComparison.OrdinalIgnoreCase) >= 0) { GetHeaders(response); handshake.Result = HandshakeResult.Upgrade; } else { handshake.Result = HandshakeResult.NonUpgrade; } } return handshake; }