Skip to content

Commit 93722cb

Browse files
fix(server): make tower::Service impl generic over HttpBody (#1475)
* fix: compatibility issue of CompressionLayer in http middleware * changelog * revert tower* upgrade * bump patch versions * Update CHANGELOG.md * Update CHANGELOG.md * Update CHANGELOG.md * Update CHANGELOG.md * update links in README.md * Update README.md --------- Co-authored-by: Niklas Adolfsson <[email protected]>
1 parent 52147d8 commit 93722cb

File tree

11 files changed

+43
-25
lines changed

11 files changed

+43
-25
lines changed

CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ The format is based on [Keep a Changelog].
44

55
[Keep a Changelog]: http://keepachangelog.com/en/1.0.0/
66

7+
## [v0.24.7]
8+
9+
This is a bug-fix release that fixes the tower::Service implementation to be generic over the HttpBody to work with all middleware layers.
10+
For instance, this makes `tower_http::compression::CompressionLayer` work, which didn't compile before.
11+
12+
### [Fixed]
13+
- fix(server): make tower::Service impl generic over HttpBody ([#1475](https://github.com/paritytech/jsonrpsee/pull/1475))
14+
715
## [v0.24.6] - 2024-10-07
816

917
This is a bug-fix release that fixes that the `ConnectionGuard` was dropped before the future was resolved which,

Cargo.toml

+12-9
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ resolver = "2"
2020

2121
[workspace.package]
2222
authors = ["Parity Technologies <[email protected]>", "Pierre Krieger <[email protected]>"]
23-
version = "0.24.6"
23+
version = "0.24.7"
2424
edition = "2021"
2525
rust-version = "1.74.1"
2626
license = "MIT"
@@ -31,11 +31,14 @@ keywords = ["jsonrpc", "json", "http", "websocket", "WASM"]
3131
readme = "README.md"
3232

3333
[workspace.dependencies]
34-
jsonrpsee-types = { path = "types", version = "0.24.6" }
35-
jsonrpsee-core = { path = "core", version = "0.24.6" }
36-
jsonrpsee-server = { path = "server", version = "0.24.6" }
37-
jsonrpsee-ws-client = { path = "client/ws-client", version = "0.24.6" }
38-
jsonrpsee-http-client = { path = "client/http-client", version = "0.24.6" }
39-
jsonrpsee-wasm-client = { path = "client/wasm-client", version = "0.24.6" }
40-
jsonrpsee-client-transport = { path = "client/transport", version = "0.24.6" }
41-
jsonrpsee-proc-macros = { path = "proc-macros", version = "0.24.6" }
34+
jsonrpsee-types = { path = "types", version = "0.24.7" }
35+
jsonrpsee-core = { path = "core", version = "0.24.7" }
36+
jsonrpsee-server = { path = "server", version = "0.24.7" }
37+
jsonrpsee-ws-client = { path = "client/ws-client", version = "0.24.7" }
38+
jsonrpsee-http-client = { path = "client/http-client", version = "0.24.7" }
39+
jsonrpsee-wasm-client = { path = "client/wasm-client", version = "0.24.7" }
40+
jsonrpsee-client-transport = { path = "client/transport", version = "0.24.7" }
41+
jsonrpsee-proc-macros = { path = "proc-macros", version = "0.24.7" }
42+
43+
tower = "0.4"
44+
tower-http = "0.5"

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
![MIT](https://img.shields.io/crates/l/jsonrpsee.svg)
77
[![CI](https://github.com/paritytech/jsonrpsee/actions/workflows/ci.yml/badge.svg)](https://github.com/paritytech/jsonrpsee/actions/workflows/ci.yml)
88
[![Benchmarks](https://github.com/paritytech/jsonrpsee/actions/workflows/benchmarks_gitlab.yml/badge.svg)](https://github.com/paritytech/jsonrpsee/actions/workflows/benchmarks_gitlab.yml)
9-
[![dependency status](https://deps.rs/crate/jsonrpsee/0.24.6/status.svg)](https://deps.rs/crate/jsonrpsee/0.24.6)
9+
[![dependency status](https://deps.rs/crate/jsonrpsee/latest/status.svg)](https://deps.rs/crate/jsonrpsee)
1010

1111
JSON-RPC library designed for async/await in Rust.
1212

client/http-client/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ serde_json = "1"
2929
thiserror = "1"
3030
tokio = { version = "1.23.1", features = ["time"] }
3131
tracing = "0.1.34"
32-
tower = { version = "0.4.13", features = ["util"] }
32+
tower = { workspace = true, features = ["util"] }
3333
url = "2.4.0"
3434

3535
[dev-dependencies]

examples/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ tokio = { version = "1.23.1", features = ["full"] }
1919
tokio-stream = { version = "0.1", features = ["sync"] }
2020
serde_json = { version = "1" }
2121
tower-http = { version = "0.5.2", features = ["full"] }
22-
tower = { version = "0.4.13", features = ["full"] }
22+
tower = { workspace = true, features = ["full"] }
2323
hyper = "1.3"
2424
hyper-util = { version = "0.1.3", features = ["client", "client-legacy"]}
2525
console-subscriber = "0.4.0"

examples/examples/http_middleware.rs

+2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ use jsonrpsee::rpc_params;
4040
use std::iter::once;
4141
use std::net::SocketAddr;
4242
use std::time::Duration;
43+
use tower_http::compression::CompressionLayer;
4344
use tower_http::cors::CorsLayer;
4445
use tower_http::sensitive_headers::SetSensitiveRequestHeadersLayer;
4546
use tower_http::trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer};
@@ -107,6 +108,7 @@ async fn run_server() -> anyhow::Result<SocketAddr> {
107108
// Mark the `Authorization` request header as sensitive so it doesn't show in logs
108109
.layer(SetSensitiveRequestHeadersLayer::new(once(hyper::header::AUTHORIZATION)))
109110
.layer(cors)
111+
.layer(CompressionLayer::new())
110112
.timeout(Duration::from_secs(2));
111113

112114
let server =

examples/examples/jsonrpsee_as_service.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ use jsonrpsee::ws_client::{HeaderValue, WsClientBuilder};
4848
use jsonrpsee::{MethodResponse, Methods};
4949
use tokio::net::TcpListener;
5050
use tower::Service;
51+
use tower_http::compression::CompressionLayer;
5152
use tower_http::cors::CorsLayer;
5253
use tracing_subscriber::util::SubscriberInitExt;
5354

@@ -202,14 +203,18 @@ async fn run_server(metrics: Metrics) -> anyhow::Result<ServerHandle> {
202203
let transport_label = if is_websocket { "ws" } else { "http" };
203204
let PerConnection { methods, stop_handle, metrics, svc_builder } = per_conn2.clone();
204205

206+
let http_middleware = tower::ServiceBuilder::new().layer(CompressionLayer::new());
205207
// NOTE, the rpc middleware must be initialized here to be able to created once per connection
206208
// with data from the connection such as the headers in this example
207209
let headers = req.headers().clone();
208210
let rpc_middleware = RpcServiceBuilder::new().rpc_logger(1024).layer_fn(move |service| {
209211
AuthorizationMiddleware { inner: service, headers: headers.clone(), transport_label }
210212
});
211213

212-
let mut svc = svc_builder.set_rpc_middleware(rpc_middleware).build(methods, stop_handle);
214+
let mut svc = svc_builder
215+
.set_http_middleware(http_middleware)
216+
.set_rpc_middleware(rpc_middleware)
217+
.build(methods, stop_handle);
213218

214219
if is_websocket {
215220
// Utilize the session close future to know when the actual WebSocket

proc-macros/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,4 @@ serde_json = "1"
3333
serde = "1"
3434
trybuild = "1.0.97"
3535
tokio = { version = "1.23.1", features = ["rt", "macros"] }
36-
tower = "0.4"
36+
tower = { workspace = true }

server/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ hyper-util = { version = "0.1", features = ["tokio", "service", "tokio", "server
2929
http = "1"
3030
http-body = "1"
3131
http-body-util = "0.1.0"
32-
tower = { version = "0.4.13", features = ["util"] }
32+
tower = { workspace = true, features = ["util"] }
3333
thiserror = "1"
3434
route-recognizer = "0.3.1"
3535
pin-project = "1.1.3"
3636

3737
[dev-dependencies]
3838
jsonrpsee-test-utils = { path = "../test-utils" }
3939
tracing-subscriber = { version = "0.3.3", features = ["env-filter"] }
40-
tower = { version = "0.4.13", features = ["timeout"] }
40+
tower = { workspace = true, features = ["timeout"] }
4141
socket2 = "0.5.1"

server/src/server.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -970,28 +970,28 @@ impl<RpcMiddleware, HttpMiddleware> TowerService<RpcMiddleware, HttpMiddleware>
970970
}
971971
}
972972

973-
impl<Body, RpcMiddleware, HttpMiddleware> Service<HttpRequest<Body>> for TowerService<RpcMiddleware, HttpMiddleware>
973+
impl<RequestBody, ResponseBody, RpcMiddleware, HttpMiddleware> Service<HttpRequest<RequestBody>> for TowerService<RpcMiddleware, HttpMiddleware>
974974
where
975975
RpcMiddleware: for<'a> tower::Layer<RpcService> + Clone,
976976
<RpcMiddleware as Layer<RpcService>>::Service: Send + Sync + 'static,
977977
for<'a> <RpcMiddleware as Layer<RpcService>>::Service: RpcServiceT<'a>,
978978
HttpMiddleware: Layer<TowerServiceNoHttp<RpcMiddleware>> + Send + 'static,
979979
<HttpMiddleware as Layer<TowerServiceNoHttp<RpcMiddleware>>>::Service:
980-
Send + Service<HttpRequest<Body>, Response = HttpResponse, Error = Box<(dyn StdError + Send + Sync + 'static)>>,
981-
<<HttpMiddleware as Layer<TowerServiceNoHttp<RpcMiddleware>>>::Service as Service<HttpRequest<Body>>>::Future:
980+
Send + Service<HttpRequest<RequestBody>, Response = HttpResponse<ResponseBody>, Error = Box<(dyn StdError + Send + Sync + 'static)>>,
981+
<<HttpMiddleware as Layer<TowerServiceNoHttp<RpcMiddleware>>>::Service as Service<HttpRequest<RequestBody>>>::Future:
982982
Send + 'static,
983-
Body: http_body::Body<Data = Bytes> + Send + 'static,
984-
Body::Error: Into<BoxError>,
983+
RequestBody: http_body::Body<Data = Bytes> + Send + 'static,
984+
RequestBody::Error: Into<BoxError>,
985985
{
986-
type Response = HttpResponse;
986+
type Response = HttpResponse<ResponseBody>;
987987
type Error = BoxError;
988988
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send>>;
989989

990990
fn poll_ready(&mut self, _cx: &mut std::task::Context<'_>) -> Poll<Result<(), Self::Error>> {
991991
Poll::Ready(Ok(()))
992992
}
993993

994-
fn call(&mut self, request: HttpRequest<Body>) -> Self::Future {
994+
fn call(&mut self, request: HttpRequest<RequestBody>) -> Self::Future {
995995
Box::pin(self.http_middleware.service(self.rpc_middleware.clone()).call(request))
996996
}
997997
}

tests/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ serde_json = "1"
2222
tokio = { version = "1.23.1", features = ["full"] }
2323
tokio-stream = "0.1"
2424
tokio-util = { version = "0.7", features = ["compat"]}
25-
tower = { version = "0.4.13", features = ["full"] }
26-
tower-http = { version = "0.5.2", features = ["full"] }
25+
tower = { workspace = true, features = ["full"] }
26+
tower-http = { workspace = true, features = ["full"] }
2727
tracing = "0.1.34"
2828
tracing-subscriber = { version = "0.3.3", features = ["env-filter"] }
2929
pin-project = "1"

0 commit comments

Comments
 (0)