//! HTTP/1.1 编解码的集成测试。 //! Integration tests for the HTTP/1.1 codec. use focus_transport::http::{ body_length, parse_response_head, BodyLength, HttpRequest, HttpResponse, }; use std::collections::HashMap; #[test] fn serializes_post_request() { let req = HttpRequest::post("api.example.com", "/v1/messages") .header("Authorization", "Bearer xyz") .json_body(r#"{"hello":"world"}"#); let wire = req.serialize(); let text = String::from_utf8(wire).unwrap(); assert!(text.starts_with("POST /v1/messages HTTP/1.1\r\n")); assert!(text.contains("Host: api.example.com\r\n")); assert!(text.contains("Authorization: Bearer xyz\r\n")); assert!(text.contains("Content-Type: application/json\r\n")); assert!(text.contains("Content-Length: 17\r\n")); assert!(text.ends_with("{\"hello\":\"world\"}")); } #[test] fn parses_response_head() { let raw = b"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: 5\r\n\r\nhello"; let (resp, consumed) = parse_response_head(raw).unwrap(); assert_eq!(resp.status, 200); assert_eq!( resp.headers.get("content-type").unwrap(), "application/json" ); assert_eq!(resp.headers.get("content-length").unwrap(), "5"); assert_eq!(consumed, raw.len() - 5); assert_eq!(body_length(&resp), BodyLength::Fixed(5)); } #[test] fn detects_chunked() { let raw = b"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"; let (resp, _) = parse_response_head(raw).unwrap(); assert_eq!(body_length(&resp), BodyLength::Chunked); } #[test] fn is_success_for_2xx() { let resp = HttpResponse { status: 204, headers: HashMap::new(), body: vec![], }; assert!(resp.is_success()); } #[test] fn rejects_incomplete_head() { assert!(parse_response_head(b"HTTP/1.1 200 OK\r\n").is_err()); }