Skip to content

Commit e36599e

Browse files
Try some HTTP/2 support.
1 parent a0f1c47 commit e36599e

File tree

3 files changed

+125
-25
lines changed

3 files changed

+125
-25
lines changed

Cargo.lock

Lines changed: 101 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/hyper_ruby/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ bytes = "1.5"
1616
tokio-stream = { version = "0.1", features = ["net"] }
1717
crossbeam-channel = "0.5.14"
1818
rb-sys = "0.9.110"
19-
hyper = { version = "1.0", features = ["http1", "server"] }
20-
hyper-util = { version = "0.1", features = ["tokio"] }
19+
hyper = { version = "1.0", features = ["http1", "http2", "server"] }
20+
hyper-util = { version = "0.1", features = ["tokio", "server", "http1", "http2"] }
2121
http-body-util = "0.1.2"

ext/hyper_ruby/src/lib.rs

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ use tokio::sync::{Mutex, oneshot};
2323
use tokio::task::JoinHandle;
2424
use crossbeam_channel;
2525

26-
use hyper::server::conn::http1;
2726
use hyper::service::service_fn;
2827
use hyper::{Error, Request as HyperRequest, Response as HyperResponse, StatusCode};
2928
use hyper::body::Incoming;
3029
use hyper_util::rt::TokioIo;
30+
use hyper_util::server::conn::auto;
3131
use http_body_util::BodyExt; // You'll need this
3232
use http_body_util::Full;
3333

@@ -177,20 +177,10 @@ impl Server {
177177

178178
loop {
179179
let (stream, _) = listener.accept().await.unwrap();
180-
let io = TokioIo::new(stream);
181180
let work_tx = work_tx.clone();
182181

183182
tokio::task::spawn(async move {
184-
let service = service_fn(move |req: HyperRequest<Incoming>| {
185-
let work_tx = work_tx.clone();
186-
handle_request(req, work_tx)
187-
});
188-
189-
if let Err(err) = http1::Builder::new()
190-
.serve_connection(io, service)
191-
.await {
192-
eprintln!("Error serving connection: {:?}", err);
193-
}
183+
handle_connection(stream, work_tx).await;
194184
});
195185
}
196186
} else {
@@ -200,20 +190,10 @@ impl Server {
200190

201191
loop {
202192
let (stream, _) = listener.accept().await.unwrap();
203-
let io = TokioIo::new(stream);
204193
let work_tx = work_tx.clone();
205194

206195
tokio::task::spawn(async move {
207-
let service = service_fn(move |req: HyperRequest<Incoming>| {
208-
let work_tx = work_tx.clone();
209-
handle_request(req, work_tx)
210-
});
211-
212-
if let Err(err) = http1::Builder::new()
213-
.serve_connection(io, service)
214-
.await {
215-
eprintln!("Error serving connection: {:?}", err);
216-
}
196+
handle_connection(stream, work_tx).await;
217197
});
218198
}
219199
}
@@ -294,6 +274,25 @@ async fn handle_request(
294274
}
295275
}
296276

277+
async fn handle_connection(
278+
stream: impl tokio::io::AsyncRead + tokio::io::AsyncWrite + Unpin + Send + 'static,
279+
work_tx: Arc<crossbeam_channel::Sender<RequestWithCompletion>>,
280+
) {
281+
let service = service_fn(move |req: HyperRequest<Incoming>| {
282+
let work_tx = work_tx.clone();
283+
handle_request(req, work_tx)
284+
});
285+
286+
let io = TokioIo::new(stream);
287+
288+
if let Err(err) = auto::Builder::new(hyper_util::rt::TokioExecutor::new())
289+
.serve_connection(io, service)
290+
.await
291+
{
292+
eprintln!("Error serving connection: {:?}", err);
293+
}
294+
}
295+
297296
#[magnus::init]
298297
fn init(ruby: &Ruby) -> Result<(), MagnusError> {
299298
let module = ruby.define_module("HyperRuby")?;

0 commit comments

Comments
 (0)