{"id":18616748,"url":"https://github.com/sile/httpcodec","last_synced_at":"2025-08-18T21:14:42.553Z","repository":{"id":62440284,"uuid":"129116905","full_name":"sile/httpcodec","owner":"sile","description":"Encoders and decoders for HTTP/1.x messages based on bytecodec crate.","archived":false,"fork":false,"pushed_at":"2019-08-18T10:56:09.000Z","size":70,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-11T11:42:06.874Z","etag":null,"topics":["asynchronous","http","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sile.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-04-11T15:41:57.000Z","updated_at":"2024-11-29T21:21:40.000Z","dependencies_parsed_at":"2022-11-01T22:16:01.801Z","dependency_job_id":null,"html_url":"https://github.com/sile/httpcodec","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/sile/httpcodec","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sile%2Fhttpcodec","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sile%2Fhttpcodec/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sile%2Fhttpcodec/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sile%2Fhttpcodec/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sile","download_url":"https://codeload.github.com/sile/httpcodec/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sile%2Fhttpcodec/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271061454,"owners_count":24692538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-18T02:00:08.743Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asynchronous","http","rust"],"created_at":"2024-11-07T03:37:48.693Z","updated_at":"2025-08-18T21:14:42.528Z","avatar_url":"https://github.com/sile.png","language":"Rust","readme":"httpcodec\n=========\n\n[![httpcodec](http://meritbadge.herokuapp.com/httpcodec)](https://crates.io/crates/httpcodec)\n[![Documentation](https://docs.rs/httpcodec/badge.svg)](https://docs.rs/httpcodec)\n[![Build Status](https://travis-ci.org/sile/httpcodec.svg?branch=master)](https://travis-ci.org/sile/httpcodec)\n[![Code Coverage](https://codecov.io/gh/sile/httpcodec/branch/master/graph/badge.svg)](https://codecov.io/gh/sile/httpcodec/branch/master)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nEncoders and decoders for HTTP/1.x messages based on [bytecodec] crate.\n\n[Documentation](https://docs.rs/httpcodec)\n\n[bytecodec]: https://crates.io/crates/bytecodec\n\nExamples\n--------\n\nEncodes a HTTP request message:\n\n```rust\nuse bytecodec::Encode;\nuse bytecodec::bytes::BytesEncoder;\nuse bytecodec::io::IoEncodeExt;\nuse httpcodec::{BodyEncoder, HttpVersion, Method, Request, RequestEncoder, RequestTarget};\n\nlet request = Request::new(\n    Method::new(\"GET\").unwrap(),\n    RequestTarget::new(\"/foo\").unwrap(),\n    HttpVersion::V1_1,\n    b\"barbaz\",\n);\n\nlet mut encoder = RequestEncoder::new(BodyEncoder::new(BytesEncoder::new()));\nencoder.start_encoding(request).unwrap();\n\nlet mut buf = Vec::new();\nencoder.encode_all(\u0026mut buf).unwrap();\nassert_eq!(buf, \"GET /foo HTTP/1.1\\r\\nContent-Length: 6\\r\\n\\r\\nbarbaz\".as_bytes());\n```\n\nDecodes a HTTP response message:\n\n```rust\nuse bytecodec::bytes::RemainingBytesDecoder;\nuse bytecodec::io::IoDecodeExt;\nuse httpcodec::{BodyDecoder, HttpVersion, ResponseDecoder};\n\nlet mut decoder =\n    ResponseDecoder::\u003cBodyDecoder\u003cRemainingBytesDecoder\u003e\u003e::default();\n\nlet input = b\"HTTP/1.0 200 OK\\r\\nContent-Length: 6\\r\\n\\r\\nbarbaz\";\nlet response = decoder.decode_exact(input.as_ref()).unwrap();\n\nassert_eq!(response.http_version(), HttpVersion::V1_0);\nassert_eq!(response.status_code().as_u16(), 200);\nassert_eq!(response.reason_phrase().as_str(), \"OK\");\nassert_eq!(\n    response.header()\n        .fields()\n        .map(|f| (f.name().to_owned(), f.value().to_owned()))\n        .collect::\u003cVec\u003c_\u003e\u003e(),\n    vec![(\"Content-Length\".to_owned(), \"6\".to_owned())]\n);\nassert_eq!(response.body(), b\"barbaz\");\n```\n\nReferences\n----------\n\n- [RFC 7230] Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing\n\n[RFC 7230]: https://tools.ietf.org/html/rfc7230\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsile%2Fhttpcodec","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsile%2Fhttpcodec","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsile%2Fhttpcodec/lists"}