/// <summary> /// Creates a new <see cref="Error"/> from a list of headers /// </summary> /// <param name="headers">The <see cref="HeaderCollection"/> used to populate the object</param> /// <returns><see cref="Error"/></returns> public static Error FromHeaders(HeaderCollection headers) { int errorCode = headers.GetHeaderIntValue(Header.ERROR_CODE, true); string description = headers.GetHeaderStringValue(Header.ERROR_DESCRIPTION, false); Error error = new Error(errorCode, description); SetInhertiedAttributesFromHeaders(error, headers); return(error); }
/// <summary> /// Creates a new <see cref="Response"/> from a list of headers /// </summary> /// <param name="headers">The <see cref="HeaderCollection"/> used to populate the response</param> /// <returns><see cref="Response"/></returns> public new static Response FromHeaders(HeaderCollection headers) { int errorCode = headers.GetHeaderIntValue(Header.ERROR_CODE, true); string description = headers.GetHeaderStringValue(Header.ERROR_DESCRIPTION, false); Response response = new Response(errorCode, description); SetInhertiedAttributesFromHeaders(response, headers); return(response); }
/// <summary> /// Parses a response message and returns the corresponding <see cref="Response"/> object /// </summary> /// <param name="message">The entire GNTP response message</param> /// <param name="headers">The <see cref="HeaderCollection"/> of parsed header values</param> /// <returns><see cref="Response"/></returns> private Response Parse(string message, out HeaderCollection headers) { ResponseType responseType = ResponseType.ERROR; Response response = null; headers = new HeaderCollection(); byte[] bytes = System.Text.Encoding.UTF8.GetBytes(message); System.IO.MemoryStream stream = new System.IO.MemoryStream(bytes); using (stream) { GNTPStreamReader reader = new GNTPStreamReader(stream); using (reader) { bool isError = false; bool isFirstLine = true; while (!reader.EndOfStream) { string line = reader.ReadLine(); if (isFirstLine) { Match match = ParseGNTPHeaderLine(line); if (match.Success) { this.version = match.Groups["Version"].Value; this.directive = match.Groups["Directive"].Value; if (this.directive.StartsWith("-", StringComparison.InvariantCulture)) { this.directive = this.directive.Remove(0, 1); } if (version == GNTP_SUPPORTED_VERSION) { if (Enum.IsDefined(typeof(ResponseType), this.directive)) { responseType = (ResponseType)Enum.Parse(typeof(ResponseType), this.directive, false); response = new Response(); if (responseType == ResponseType.ERROR) { isError = true; } isFirstLine = false; } else { // invalid directive response = new Response(ErrorCode.INVALID_REQUEST, "Unrecognized response type"); break; } } else { // invalid version response = new Response(ErrorCode.UNKNOWN_PROTOCOL_VERSION, "Unsupported version"); break; } } else { // invalid message header response = new Response(ErrorCode.UNKNOWN_PROTOCOL, "Unrecognized response"); break; } } else { Header header = Header.ParseHeader(line); headers.AddHeader(header); } } if (response != null) { if (isError) { int errorCode = headers.GetHeaderIntValue(Header.ERROR_CODE, false); string errorDescription = headers.GetHeaderStringValue(Header.ERROR_DESCRIPTION, false); if (errorCode > 0 && errorDescription != null) { response = new Response(errorCode, errorDescription); } else { response = new Response(ErrorCode.INTERNAL_SERVER_ERROR, ErrorDescription.INTERNAL_SERVER_ERROR); } } else { string inResponseTo = headers.GetHeaderStringValue(Header.RESPONSE_ACTION, false); response.InResponseTo = inResponseTo; } response.SetAttributesFromHeaders(headers, (responseType == ResponseType.CALLBACK)); } else { // if we got here, that is bad. response = new Response(ErrorCode.INTERNAL_SERVER_ERROR, ErrorDescription.INTERNAL_SERVER_ERROR); } } } return(response); }