19个版本

0.5.0 2024年7月24日
0.4.0 2023年4月5日
0.4.0-pre42023年3月8日
0.3.1 2022年6月20日
0.1.3 2021年3月12日

#29 in 模板引擎

Download history 37/week @ 2024-05-03 9/week @ 2024-05-17 28/week @ 2024-06-21 3/week @ 2024-06-28 261/week @ 2024-07-05 44/week @ 2024-07-12 94/week @ 2024-07-19 62/week @ 2024-07-26 14/week @ 2024-08-02

每月下载 236
esi_fastly中使用

MIT许可

38KB
831

Fastly的ESI

此crate提供了一个为Fastly Compute设计的流式Edge Side Includes解析器和执行器。

实现是ESI语言规范1.0的子集,支持以下标签

  • <esi:include> (+ alt, onerror="continue")
  • <esi:try> | <esi:attempt> | <esi:except>
  • <esi:注释>
  • <esi:删除>

其他标签将被忽略,并按原样提供给客户端。

示例用法

use fastly::{http::StatusCode, mime, Error, Request, Response};

fn main() {
    if let Err(err) = handle_request(Request::from_client()) {
        println!("returning error response");

        Response::from_status(StatusCode::INTERNAL_SERVER_ERROR)
            .with_body(err.to_string())
            .send_to_client();
    }
}

fn handle_request(req: Request) -> Result<(), Error> {
    // Fetch ESI document from backend.
    let mut beresp = req.clone_without_body().send("origin_0")?;

    // If the response is HTML, we can parse it for ESI tags.
    if beresp
        .get_content_type()
        .map(|c| c.subtype() == mime::HTML)
        .unwrap_or(false)
    {
        let processor = esi::Processor::new(
            // The original client request.
            Some(req),
            // Use the default ESI configuration.
            esi::Configuration::default()
        );

        processor.process_response(
            // The ESI source document. Note that the body will be consumed.
            &mut beresp,
            // Optionally provide a template for the client response.
            Some(Response::from_status(StatusCode::OK).with_content_type(mime::TEXT_HTML)),
            // Provide logic for sending fragment requests, otherwise the hostname
            // of the request URL will be used as the backend name.
            Some(&|req| {
                println!("Sending request {} {}", req.get_method(), req.get_path());
                Ok(Some(req.with_ttl(120).send_async("mock-s3")?))
            }),
            // Optionally provide a method to process fragment responses before they
            // are streamed to the client.
            Some(&|req, resp| {
                println!(
                    "Received response for {} {}",
                    req.get_method(),
                    req.get_path()
                );
                Ok(resp)
            }),
        )?;
    } else {
        // Otherwise, we can just return the response.
        beresp.send_to_client();
    }

    Ok(())
}

请参阅examples子目录中的示例应用程序或阅读docs.rs/esi上的托管文档。由于此处理器在数据可用时立即将片段流式传输到客户端,因此在开始向客户端流式传输响应后,无法返回有关后续错误的适当状态码。因此,建议您参考esi_example_advanced_error_handling应用程序,该应用程序允许您通过保留输出流的所有权来优雅地处理错误。

测试

为了运行本仓库中包的测试套件,viceroy 必须在您的PATH中可用。您可以通过运行以下命令安装 viceroy 的最新版本:

cargo install viceroy

许可协议

本项目源代码和文档在MIT 许可协议下发布。

依赖项

~7.5MB
~171K SLoC