#http #codec #http-request #encoder #http-1 #decoder #bytecodec

httpcodec

Encoders and decoders for HTTP/1.x messages based on bytecodec crate

15 releases

Uses old Rust 2015

0.2.3 Aug 18, 2019
0.2.2 May 19, 2018
0.1.10 May 2, 2018
0.1.6 Apr 30, 2018

#1313 in Network programming

Download history 1021/week @ 2024-11-20 1161/week @ 2024-11-27 1402/week @ 2024-12-04 1575/week @ 2024-12-11 1065/week @ 2024-12-18 263/week @ 2024-12-25 606/week @ 2025-01-01 969/week @ 2025-01-08 1247/week @ 2025-01-15 1408/week @ 2025-01-22 1142/week @ 2025-01-29 1259/week @ 2025-02-05 1634/week @ 2025-02-12 1162/week @ 2025-02-19 1871/week @ 2025-02-26 1580/week @ 2025-03-05

6,371 downloads per month
Used in 13 crates

MIT license

85KB
2K SLoC

httpcodec

Documentation Build Status Code Coverage License: MIT

Encoders and decoders for HTTP/1.x messages based on bytecodec crate.

Documentation

Examples

Encodes a HTTP request message:

use bytecodec::Encode;
use bytecodec::bytes::BytesEncoder;
use bytecodec::io::IoEncodeExt;
use httpcodec::{BodyEncoder, HttpVersion, Method, Request, RequestEncoder, RequestTarget};

let request = Request::new(
    Method::new("GET").unwrap(),
    RequestTarget::new("/foo").unwrap(),
    HttpVersion::V1_1,
    b"barbaz",
);

let mut encoder = RequestEncoder::new(BodyEncoder::new(BytesEncoder::new()));
encoder.start_encoding(request).unwrap();

let mut buf = Vec::new();
encoder.encode_all(&mut buf).unwrap();
assert_eq!(buf, "GET /foo HTTP/1.1\r\nContent-Length: 6\r\n\r\nbarbaz".as_bytes());

Decodes a HTTP response message:

use bytecodec::bytes::RemainingBytesDecoder;
use bytecodec::io::IoDecodeExt;
use httpcodec::{BodyDecoder, HttpVersion, ResponseDecoder};

let mut decoder =
    ResponseDecoder::<BodyDecoder<RemainingBytesDecoder>>::default();

let input = b"HTTP/1.0 200 OK\r\nContent-Length: 6\r\n\r\nbarbaz";
let response = decoder.decode_exact(input.as_ref()).unwrap();

assert_eq!(response.http_version(), HttpVersion::V1_0);
assert_eq!(response.status_code().as_u16(), 200);
assert_eq!(response.reason_phrase().as_str(), "OK");
assert_eq!(
    response.header()
        .fields()
        .map(|f| (f.name().to_owned(), f.value().to_owned()))
        .collect::<Vec<_>>(),
    vec![("Content-Length".to_owned(), "6".to_owned())]
);
assert_eq!(response.body(), b"barbaz");

References

  • RFC 7230 Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing

Dependencies

~2MB
~45K SLoC