19个版本
0.5.0 | 2024年7月24日 |
---|---|
0.4.0 | 2023年4月5日 |
0.4.0-pre4 | 2023年3月8日 |
0.3.1 | 2022年6月20日 |
0.1.3 | 2021年3月12日 |
#29 in 模板引擎
每月下载 236 次
在esi_fastly中使用
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