fn test_parse_headers()

in src/connection.rs [1169:1231]


    fn test_parse_headers() {
        let (_, receiver) = UnixStream::pair().unwrap();
        let mut conn = HttpConnection::new(receiver);

        // Error case: end_cursor past buffer end.
        assert_eq!(
            conn.parse_headers(&mut 0, conn.buffer.len() + 1)
                .unwrap_err(),
            ConnectionError::ParseError(RequestError::Overflow)
        );

        // Error case: line_start_index is past end_cursor.
        assert_eq!(
            conn.parse_headers(&mut 1, 0).unwrap_err(),
            ConnectionError::ParseError(RequestError::Underflow)
        );

        // Error case: no request pending.
        // CRLF can be at the start of the buffer...
        conn.buffer[0] = CR;
        conn.buffer[1] = LF;
        assert_eq!(
            conn.parse_headers(&mut 0, BUFFER_SIZE).unwrap_err(),
            ConnectionError::ParseError(RequestError::HeadersWithoutPendingRequest)
        );
        // ...or somewhere in the middle.
        conn.buffer[0] = 0;
        conn.buffer[1] = CR;
        conn.buffer[2] = LF;
        assert_eq!(
            conn.parse_headers(&mut 0, BUFFER_SIZE).unwrap_err(),
            ConnectionError::ParseError(RequestError::HeadersWithoutPendingRequest)
        );

        // Error case: invalid header.
        conn.pending_request = Some(Request {
            request_line: RequestLine::new(Method::Get, "http://foo/bar", Version::Http11),
            headers: Headers::new(0, true, true),
            body: None,
            files: Vec::new(),
        });
        assert_eq!(
            conn.parse_headers(&mut 0, BUFFER_SIZE).unwrap_err(),
            ConnectionError::ParseError(RequestError::HeaderError(HttpHeaderError::InvalidFormat(
                "\0".to_string()
            )))
        );

        // OK case: incomplete header line.
        let hdr = b"Custom-Header-Testing: 1";
        conn.buffer[..hdr.len()].copy_from_slice(hdr);
        assert_eq!(conn.parse_headers(&mut 0, hdr.len()), Ok(false));

        // OK case: complete header line.
        let hdr = b"Custom-Header-Testing: 1\r\n";
        conn.buffer[..hdr.len()].copy_from_slice(hdr);
        assert_eq!(conn.parse_headers(&mut 0, hdr.len()), Ok(true));

        // OK case: complete header line, end of header.
        let hdr = b"\r\n";
        conn.buffer[..hdr.len()].copy_from_slice(hdr);
        assert_eq!(conn.parse_headers(&mut 0, hdr.len()), Ok(true));
    }