Skip to content

Commit 8c23834

Browse files
authored
Release 0.6.1.
2 parents 6f11f73 + c9fa2e6 commit 8c23834

File tree

7 files changed

+138
-5
lines changed

7 files changed

+138
-5
lines changed

.github/workflows/rust.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Rust
22

33
on:
44
push:
5-
branches: [ master, tokio-1 ]
5+
branches: [ master, develop ]
66
pull_request:
77
branches: [ "**" ]
88

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "fastcgi-client"
3-
version = "0.6.0"
3+
version = "0.6.1"
44
authors = ["jmjoy <918734043@qq.com>"]
55
edition = "2018"
66
description = "Fastcgi client implemented for Rust."

benches/async_client_bench.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#![feature(test)]
2+
3+
extern crate test;
4+
5+
use fastcgi_client::{request::Request, Client, Params};
6+
use std::env::current_dir;
7+
use test::Bencher;
8+
use tokio::{
9+
io::{self, AsyncRead, AsyncWrite},
10+
net::TcpStream,
11+
};
12+
13+
mod common;
14+
15+
async fn test_client<S: AsyncRead + AsyncWrite + Send + Sync + Unpin>(client: &mut Client<S>) {
16+
let document_root = current_dir().unwrap().join("tests").join("php");
17+
let document_root = document_root.to_str().unwrap();
18+
let script_name = current_dir()
19+
.unwrap()
20+
.join("tests")
21+
.join("php")
22+
.join("index.php");
23+
let script_name = script_name.to_str().unwrap();
24+
25+
let params = Params::default()
26+
.set_request_method("GET")
27+
.set_document_root(document_root)
28+
.set_script_name("/index.php")
29+
.set_script_filename(script_name)
30+
.set_request_uri("/index.php")
31+
.set_document_uri("/index.php")
32+
.set_remote_addr("127.0.0.1")
33+
.set_remote_port("12345")
34+
.set_server_addr("127.0.0.1")
35+
.set_server_port("80")
36+
.set_server_name("jmjoy-pc")
37+
.set_content_type("")
38+
.set_content_length("0");
39+
40+
let output = client
41+
.execute(Request::new(params, &mut io::empty()))
42+
.await
43+
.unwrap();
44+
45+
let stdout = String::from_utf8(output.get_stdout().unwrap_or(Default::default())).unwrap();
46+
assert!(stdout.contains("Content-type: text/html; charset=UTF-8"));
47+
assert!(stdout.contains("\r\n\r\n"));
48+
assert!(stdout.contains("hello"));
49+
assert_eq!(output.get_stderr(), None);
50+
}
51+
52+
#[bench]
53+
fn bench_execute(b: &mut Bencher) {
54+
common::setup();
55+
56+
let rt = tokio::runtime::Builder::new_multi_thread()
57+
.worker_threads(6)
58+
.enable_all()
59+
.build()
60+
.unwrap();
61+
62+
let mut client = rt.block_on(async {
63+
let stream = TcpStream::connect(("127.0.0.1", 9000)).await.unwrap();
64+
Client::new(stream, true)
65+
});
66+
67+
b.iter(|| {
68+
rt.block_on(async {
69+
test_client(&mut client).await;
70+
});
71+
});
72+
}

benches/common.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
use std::sync::Once;
2+
3+
static START: Once = Once::new();
4+
5+
/// Setup function that is only run once, even if called multiple times.
6+
pub fn setup() {
7+
START.call_once(|| {
8+
env_logger::init();
9+
});
10+
}

src/meta.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ impl Header {
8080

8181
loop {
8282
let read = content.read(&mut buf).await?;
83-
if had_writen && (read == 0 || read < MAX_LENGTH) {
83+
if had_writen && read == 0 {
8484
break;
8585
}
8686

tests/async_client_post_test.rs

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use fastcgi_client::{request::Request, Client, Params};
2-
use std::env::current_dir;
3-
use tokio::net::TcpStream;
2+
use std::{env::current_dir, time::Duration};
3+
use tokio::{net::TcpStream, time::timeout};
44

55
mod common;
66

@@ -57,3 +57,52 @@ async fn test() {
5757
let stderr = dbg!(stderr);
5858
assert!(stderr.contains("PHP message: PHP Fatal error: Uncaught Exception: TEST"));
5959
}
60+
61+
#[tokio::test]
62+
async fn post_big_body() {
63+
common::setup();
64+
65+
let stream = TcpStream::connect(("127.0.0.1", 9000)).await.unwrap();
66+
let mut client = Client::new(stream, true);
67+
68+
let document_root = current_dir().unwrap().join("tests").join("php");
69+
let document_root = document_root.to_str().unwrap();
70+
let script_name = current_dir()
71+
.unwrap()
72+
.join("tests")
73+
.join("php")
74+
.join("body-size.php");
75+
let script_name = script_name.to_str().unwrap();
76+
77+
let body = [0u8; 131072];
78+
let len = format!("{}", body.len());
79+
80+
let params = Params::default()
81+
.set_request_method("POST")
82+
.set_document_root(document_root)
83+
.set_script_name("/body-size.php")
84+
.set_script_filename(script_name)
85+
.set_request_uri("/body-size.php")
86+
.set_query_string("")
87+
.set_document_uri("/body-size.php")
88+
.set_remote_addr("127.0.0.1")
89+
.set_remote_port("12345")
90+
.set_server_addr("127.0.0.1")
91+
.set_server_port("80")
92+
.set_server_name("jmjoy-pc")
93+
.set_content_type("text/plain")
94+
.set_content_length(&len);
95+
96+
let output = timeout(
97+
Duration::from_secs(3),
98+
client.execute(Request::new(params.clone(), &mut &body[..])),
99+
)
100+
.await
101+
.unwrap()
102+
.unwrap();
103+
104+
let stdout = String::from_utf8(output.get_stdout().unwrap_or(Default::default())).unwrap();
105+
assert!(stdout.contains("Content-type: text/html; charset=UTF-8"));
106+
assert!(stdout.contains("\r\n\r\n"));
107+
assert!(stdout.contains("131072"));
108+
}

tests/php/body-size.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<?php
2+
echo strlen(file_get_contents("php://input"));

0 commit comments

Comments
 (0)