private static ParserState ParseBufferInSteps( HttpStatusLineParser parser, byte[] buffer, int readsize, out int totalBytesConsumed ) { ParserState state = ParserState.Invalid; totalBytesConsumed = 0; while (totalBytesConsumed <= buffer.Length) { int size = Math.Min(buffer.Length - totalBytesConsumed, readsize); byte[] parseBuffer = new byte[size]; Buffer.BlockCopy(buffer, totalBytesConsumed, parseBuffer, 0, size); int bytesConsumed = 0; state = parser.ParseBuffer(parseBuffer, parseBuffer.Length, ref bytesConsumed); totalBytesConsumed += bytesConsumed; if (state != ParserState.NeedMoreData) { return(state); } } return(state); }
public void HttpStatusLineParserConstructorTest() { HttpUnsortedResponse statusLine = new HttpUnsortedResponse(); Assert.NotNull(statusLine); Assert.ThrowsArgumentGreaterThanOrEqualTo( () => new HttpStatusLineParser(statusLine, ParserData.MinStatusLineSize - 1), "maxStatusLineSize", ParserData.MinStatusLineSize.ToString(), ParserData.MinStatusLineSize - 1 ); HttpStatusLineParser parser = new HttpStatusLineParser( statusLine, ParserData.MinStatusLineSize ); Assert.NotNull(parser); Assert.ThrowsArgumentNull( () => { new HttpStatusLineParser(null, ParserData.MinStatusLineSize); }, "httpResponse" ); }
public void StatusLineParserNullBuffer() { HttpUnsortedResponse statusLine = new HttpUnsortedResponse(); HttpStatusLineParser parser = new HttpStatusLineParser(statusLine, ParserData.MinStatusLineSize); Assert.NotNull(parser); int bytesConsumed = 0; Assert.ThrowsArgumentNull(() => { parser.ParseBuffer(null, 0, ref bytesConsumed); }, "buffer"); }
public void HttpStatusLineParserConstructorTest() { HttpUnsortedResponse statusLine = new HttpUnsortedResponse(); Assert.NotNull(statusLine); Assert.ThrowsArgumentGreaterThanOrEqualTo(() => new HttpStatusLineParser(statusLine, ParserData.MinStatusLineSize - 1), "maxStatusLineSize", ParserData.MinStatusLineSize.ToString(), ParserData.MinStatusLineSize - 1); HttpStatusLineParser parser = new HttpStatusLineParser(statusLine, ParserData.MinStatusLineSize); Assert.NotNull(parser); Assert.ThrowsArgumentNull(() => { new HttpStatusLineParser(null, ParserData.MinStatusLineSize); }, "httpResponse"); }
public void StatusLineParserRejectsLws() { byte[] data = CreateBuffer("HTTP/1.1", "200", "Reason", true); for (var cnt = 1; cnt <= data.Length; cnt++) { HttpUnsortedResponse statusLine = new HttpUnsortedResponse(); HttpStatusLineParser parser = new HttpStatusLineParser(statusLine, data.Length); Assert.NotNull(parser); int totalBytesConsumed = 0; ParserState state = ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed); Assert.Equal(ParserState.Invalid, state); } }
public void StatusLineParserMinimumBuffer() { byte[] data = CreateBuffer("HTTP/1.1", "200", ""); HttpUnsortedResponse statusLine = new HttpUnsortedResponse(); HttpStatusLineParser parser = new HttpStatusLineParser(statusLine, ParserData.MinStatusLineSize); Assert.NotNull(parser); int bytesConsumed = 0; ParserState state = parser.ParseBuffer(data, data.Length, ref bytesConsumed); Assert.Equal(ParserState.Done, state); Assert.Equal(data.Length, bytesConsumed); ValidateResult(statusLine, new Version("1.1"), HttpStatusCode.OK, ""); }
/// <summary> /// Initializes a new instance of the <see cref="HttpResponseHeaderParser"/> class. /// </summary> /// <param name="httpResponse">The parsed HTTP response without any header sorting.</param> /// <param name="maxResponseLineSize">The max length of the HTTP status line.</param> /// <param name="maxHeaderSize">The max length of the HTTP header.</param> public HttpResponseHeaderParser(HttpUnsortedResponse httpResponse, int maxResponseLineSize, int maxHeaderSize) { if (httpResponse == null) { throw new ArgumentNullException("httpResponse"); } _httpResponse = httpResponse; // Create status line parser _statusLineParser = new HttpStatusLineParser(_httpResponse, maxResponseLineSize); // Create header parser _headerParser = new InternetMessageFormatHeaderParser(_httpResponse.HttpHeaders, maxHeaderSize); }
public void StatusLineParserAcceptsValidReasonPhrase(string validReasonPhrase) { byte[] data = CreateBuffer("HTTP/1.1", "200", validReasonPhrase); for (var cnt = 1; cnt <= data.Length; cnt++) { HttpUnsortedResponse statusLine = new HttpUnsortedResponse(); HttpStatusLineParser parser = new HttpStatusLineParser(statusLine, 256); Assert.NotNull(parser); int totalBytesConsumed = 0; ParserState state = ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed); ValidateResult(statusLine, new Version("1.1"), HttpStatusCode.OK, validReasonPhrase); } }
public void StatusLineParserAcceptsValidVersion(Version version) { byte[] data = CreateBuffer(String.Format("HTTP/{0}", version.ToString(2)), "200", "Reason"); for (var cnt = 1; cnt <= data.Length; cnt++) { HttpUnsortedResponse statusLine = new HttpUnsortedResponse(); HttpStatusLineParser parser = new HttpStatusLineParser(statusLine, 256); Assert.NotNull(parser); int totalBytesConsumed = 0; ParserState state = ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed); Assert.Equal(data.Length, totalBytesConsumed); ValidateResult(statusLine, version, HttpStatusCode.OK, "Reason"); } }
public void StatusLineParserRejectsInvalidStatusCodes() { foreach (string invalidStatus in ParserData.InvalidStatusCodes) { byte[] data = CreateBuffer("HTTP/1.1", invalidStatus, "Reason"); for (var cnt = 1; cnt <= data.Length; cnt++) { HttpUnsortedResponse statusLine = new HttpUnsortedResponse(); HttpStatusLineParser parser = new HttpStatusLineParser(statusLine, 256); Assert.NotNull(parser); int totalBytesConsumed = 0; ParserState state = ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed); Assert.Equal(ParserState.Invalid, state); } } }
public void StatusLineParserAcceptsStandardStatusCodes(HttpStatusCode status) { byte[] data = CreateBuffer("HTTP/1.1", ((int)status).ToString(), "Reason"); for (var cnt = 1; cnt <= data.Length; cnt++) { HttpUnsortedResponse statusLine = new HttpUnsortedResponse(); HttpStatusLineParser parser = new HttpStatusLineParser(statusLine, data.Length); Assert.NotNull(parser); int totalBytesConsumed = 0; ParserState state = ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed); Assert.Equal(ParserState.Done, state); Assert.Equal(data.Length, totalBytesConsumed); ValidateResult(statusLine, new Version("1.1"), status, "Reason"); } }
public void StatusLineParserAcceptsCustomStatusCodes(HttpStatusCode status) { byte[] data = CreateBuffer("HTTP/1.1", ((int)status).ToString(), "Reason"); for (var cnt = 1; cnt <= data.Length; cnt++) { HttpUnsortedResponse statusLine = new HttpUnsortedResponse(); HttpStatusLineParser parser = new HttpStatusLineParser(statusLine, data.Length); Assert.NotNull(parser); int totalBytesConsumed = 0; ParserState state = ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed); Assert.Equal(ParserState.Done, state); Assert.Equal(data.Length, totalBytesConsumed); ValidateResult(statusLine, new Version("1.1"), status, "Reason"); } }
private static ParserState ParseBufferInSteps(HttpStatusLineParser parser, byte[] buffer, int readsize, out int totalBytesConsumed) { ParserState state = ParserState.Invalid; totalBytesConsumed = 0; while (totalBytesConsumed <= buffer.Length) { int size = Math.Min(buffer.Length - totalBytesConsumed, readsize); byte[] parseBuffer = new byte[size]; Buffer.BlockCopy(buffer, totalBytesConsumed, parseBuffer, 0, size); int bytesConsumed = 0; state = parser.ParseBuffer(parseBuffer, parseBuffer.Length, ref bytesConsumed); totalBytesConsumed += bytesConsumed; if (state != ParserState.NeedMoreData) { return state; } } return state; }