6个稳定版本

使用旧Rust 2015

2.1.1 2023年4月27日
2.1.0 2020年5月28日
2.0.1 2020年4月14日
2.0.0 2020年3月20日
1.0.0 2018年10月13日

#106HTTP服务器

Download history 166/week @ 2024-03-13 150/week @ 2024-03-20 118/week @ 2024-03-27 193/week @ 2024-04-03 192/week @ 2024-04-10 278/week @ 2024-04-17 158/week @ 2024-04-24 127/week @ 2024-05-01 189/week @ 2024-05-08 102/week @ 2024-05-15 132/week @ 2024-05-22 129/week @ 2024-05-29 86/week @ 2024-06-05 172/week @ 2024-06-12 190/week @ 2024-06-19 196/week @ 2024-06-26

668 每月下载量
3 crates 中使用

MIT/Apache

66KB
1K SLoC

HTTP测试服务器

Documentation Build Status

程序化创建端点,监听连接并返回预定义响应。

  • 支持多个端点和同时的客户端连接
  • 流式支持
  • 辅助函数,用于检索数据,如请求数量、连接客户端数量和请求元数据
  • 自动分配空闲端口,并在使用后关闭服务器

示例

接受POST请求

extern crate http_test_server;

use http_test_server::{TestServer, Resource};
use http_test_server::http::{Status, Method};

let server = TestServer::new().unwrap();
let resource = server.create_resource("/some-endpoint/new");

resource
    .status(Status::Created)
    .method(Method::POST)
    .header("Content-Type", "application/json")
    .header("Cache-Control", "no-cache")
    .body("{ \"message\": \"this is a message\" }");

// request: POST /some-endpoint/new

// HTTP/1.1 201 Created\r\n
// Content-Type: application/json\r\n
// Cache-Control: no-cache\r\n
// \r\n
// { "message": "this is a message" }

使用路径和查询参数

extern crate http_test_server;

use http_test_server::{TestServer, Resource};
use http_test_server::http::{Status, Method};

let server = TestServer::new().unwrap();
let resource = server.create_resource("/user/{userId}?filter=*");

resource
    .status(Status::OK)
    .header("Content-Type", "application/json")
    .header("Cache-Control", "no-cache")
    .body(r#"{ "id": "{path.userId}", "filter": "{query.filter}" }"#);

// request: GET /user/abc123?filter=all

// HTTP/1.1 200 Ok\r\n
// Content-Type: application/json\r\n
// Cache-Control: no-cache\r\n
// \r\n
// { "id": "abc123", "filter": "all" }

公开持久流

let server = TestServer::new().unwrap();
let resource = server.create_resource("/sub");

resource
    .header("Content-Type", "text/event-stream")
    .header("Cache-Control", "no-cache")
    .stream()
    .body(": initial data");

// ...

resource
    .send("some data")
    .send(" some extra data\n")
    .send_line("some extra data with line break")
    .close_open_connections();

// request: GET /sub

// HTTP/1.1 200 Ok\r\n
// Content-Type: text/event-stream\r\n
// Cache-Control: no-cache\r\n
// \r\n
// : initial data
// some data some extra data\n
// some extra data with line break\n

重定向

let server = TestServer::new().unwrap();
let resource_redirect = server.create_resource("/original");
let resource_target = server.create_resource("/new");

resource_redirect
    .status(Status::SeeOther)
    .header("Location", "/new" );

resource_target.body("Hi!");

// request: GET /original

// HTTP/1.1 303 See Other\r\n
// Location: /new\r\n
// \r\n

正则表达式URI

let server = TestServer::new().unwrap();
let resource = server.create_resource("/hello/[0-9]/[A-z]/.*");

// request: GET /hello/8/b/doesntmatter-hehe

// HTTP/1.1 200 Ok\r\n
// \r\n

查看 /tests/integration_test.rs 获取更多使用示例。


注意:这并不是一个功能齐全的服务器。因此,许多验证和行为都没有实现。例如:带有不支持 Content-TypeAccept 标头的请求不会触发 406 不接受

由于这个crate是为了在测试中使用而设计的,因此智能行为可能会令人困惑和误导。话虽如此,为了方便起见,实现了一些默认行为

  • 服务器在请求未配置的资源时返回 404 未找到
  • 当尝试使用与配置不同的方法访问资源时,服务器返回 405 方法不允许
  • 默认情况下,当创建资源时,它将响应 GET 并返回 200 Ok

许可证

许可协议为以下之一

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交的、旨在包含在工作中的任何贡献,应按上述方式双重授权,无需附加条款或条件。

依赖项

约2-3MB
约53K SLoC