Forked from
jmjoy/fastcgi-client-rs
to providefastcgi
with the RustSend
trait implemented. This is needed for Kvarn. The releases of this crate are kept in sync with upstream to the best of my ability.
Fastcgi client implemented for Rust, power by tokio.
Add dependencies to your Cargo.toml
by cargo add
:
cargo add tokio --features full
cargo add kvarn-fastcgi-client
Short connection mode:
use kvarn_fastcgi_client::{Client, Params, Request};
use std::env;
use tokio::{io, net::TcpStream};
#[tokio::main]
async fn main() {
let script_filename = env::current_dir()
.unwrap()
.join("tests")
.join("php")
.join("index.php");
let script_filename = script_filename.to_str().unwrap();
let script_name = "/index.php";
// Connect to php-fpm default listening address.
let stream = TcpStream::connect(("127.0.0.1", 9000)).await.unwrap();
let mut client = Client::new(stream);
// Fastcgi params, please reference to nginx-php-fpm config.
let params = Params::default()
.request_method("GET")
.script_name(script_name)
.script_filename(script_filename)
.request_uri(script_name)
.document_uri(script_name)
.remote_addr("127.0.0.1")
.remote_port(12345)
.server_addr("127.0.0.1")
.server_port(80)
.server_name("jmjoy-pc")
.content_type("")
.content_length(0);
// Fetch fastcgi server(php-fpm) response.
let output = client.execute_once(Request::new(params, &mut io::empty())).await.unwrap();
// "Content-type: text/html; charset=UTF-8\r\n\r\nhello"
let stdout = String::from_utf8(output.stdout.unwrap()).unwrap();
assert!(stdout.contains("Content-type: text/html; charset=UTF-8"));
assert!(stdout.contains("hello"));
assert_eq!(output.stderr, None);
}
Keep alive mode:
use kvarn_fastcgi_client::{Client, Params, Request};
use std::env;
use tokio::{io, net::TcpStream};
#[tokio::main]
async fn main() {
// Connect to php-fpm default listening address.
let stream = TcpStream::connect(("127.0.0.1", 9000)).await.unwrap();
let mut client = Client::new_keep_alive(stream);
// Fastcgi params, please reference to nginx-php-fpm config.
let params = Params::default();
for _ in (0..3) {
// Fetch fastcgi server(php-fpm) response.
let output = client.execute(Request::new(params.clone(), &mut io::empty())).await.unwrap();
// "Content-type: text/html; charset=UTF-8\r\n\r\nhello"
let stdout = String::from_utf8(output.stdout.unwrap()).unwrap();
assert!(stdout.contains("Content-type: text/html; charset=UTF-8"));
assert!(stdout.contains("hello"));
assert_eq!(output.stderr, None);
}
}