barehttp 0.0.1

A minimal, explicit HTTP client for Rust with no_std support and blocking I/O
Documentation
use crate::parser::*;

#[test]
fn test_incomplete_status_line_no_crlf() {
  let input = b"HTTP/1.1 200 OK";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_incomplete_header_section() {
  let input = b"HTTP/1.1 200 OK\r\nContent-Type: text/html";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_incomplete_chunked_no_terminator() {
  let input = b"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nHello\r\n";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_incomplete_chunked_partial_chunk_data() {
  let input = b"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\nA\r\n12345";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_incomplete_content_length_body() {
  let input = b"HTTP/1.1 200 OK\r\nContent-Length: 100\r\n\r\nPartialBody";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_incomplete_content_length_exact() {
  let input = b"HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\nPartialBody";
  let result = Response::parse(input);
  assert!(result.is_ok());
  let response = result.unwrap();
  assert_eq!(response.body.as_bytes(), b"PartialBody");
}

#[test]
fn test_incomplete_chunked_missing_final_crlf() {
  let input = b"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nHello\r\n0\r\n";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_incomplete_header_no_value() {
  let input = b"HTTP/1.1 200 OK\r\nContent-Type:";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_truncated_http_version() {
  let input = b"HTTP/1";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_truncated_status_code() {
  let input = b"HTTP/1.1 20";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_incomplete_chunked_size_line() {
  let input = b"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n5";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_response_with_only_headers_no_body_separator() {
  let input = b"HTTP/1.1 200 OK\r\nContent-Length: 0";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_zero_content_length_complete() {
  let input = b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n";
  let result = Response::parse(input);
  assert!(result.is_ok());
  let response = result.unwrap();
  assert!(response.body.is_empty());
}

#[test]
fn test_chunked_incomplete_trailer() {
  let input = b"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nHello\r\n0\r\nX-Trailer: incomplete";
  let result = Response::parse(input);
  assert!(result.is_err());
}

#[test]
fn test_header_without_final_empty_line() {
  let input = b"HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n";
  let result = Response::parse(input);
  assert!(result.is_err());
}