Skip to content

Commit 5b00b02

Browse files
committed
Actix 4.0.0-beta.5, et al
Based on cloudevents#140 branch
1 parent 2cae3f0 commit 5b00b02

File tree

5 files changed

+34
-53
lines changed

5 files changed

+34
-53
lines changed

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ snafu = "^0.6"
3333
bitflags = "^1.2"
3434

3535
# runtime optional deps
36-
actix-web = { version = "^3", default-features = false, optional = true }
36+
actix-web = { version = "=4.0.0-beta.5", default-features = false, optional = true }
37+
actix-http = { version = "=3.0.0-beta.5", default-features = false, optional = true }
38+
actix-service = { version = "=2.0.0-beta.5", default-features = false, optional = true }
3739
reqwest-lib = { version = "^0.11", default-features = false, features = ["rustls-tls"], optional = true, package = "reqwest" }
3840
rdkafka-lib = { version = "^0.25", features = ["cmake-build"], optional = true, package = "rdkafka" }
3941
warp-lib = { version = "^0.3", optional = true, package = "warp" }

src/binding/actix/headers.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ use std::str::FromStr;
77

88
macro_rules! unwrap_optional_header {
99
($headers:expr, $name:expr) => {
10-
$headers
11-
.get::<&'static HeaderName>(&$name)
12-
.map(|a| header_value_to_str!(a))
10+
$headers.get($name).map(|a| header_value_to_str!(a))
1311
};
1412
}
1513

src/binding/actix/mod.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
//!
2525
//! #[get("/")]
2626
//! async fn get_event() -> Result<HttpResponse, actix_web::Error> {
27-
//! Ok(HttpResponse::Ok()
27+
//! HttpResponse::Ok()
2828
//! .event(
2929
//! EventBuilderV10::new()
3030
//! .id("0001")
@@ -34,8 +34,6 @@
3434
//! .build()
3535
//! .expect("No error while building the event"),
3636
//! )
37-
//! .await?
38-
//! )
3937
//! }
4038
//! ```
4139

src/binding/actix/server_request.rs

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use crate::message::{
55
Result, StructuredDeserializer, StructuredSerializer,
66
};
77
use crate::{message, Event};
8-
use actix_web::http::HeaderName;
98
use actix_web::web::{Bytes, BytesMut};
109
use actix_web::{web, HttpMessage, HttpRequest};
1110
use async_trait::async_trait;
@@ -32,7 +31,8 @@ impl<'a> BinaryDeserializer for HttpRequestDeserializer<'a> {
3231
}
3332

3433
let spec_version = SpecVersion::try_from(
35-
unwrap_optional_header!(self.req.headers(), headers::SPEC_VERSION_HEADER).unwrap()?,
34+
unwrap_optional_header!(self.req.headers(), headers::SPEC_VERSION_HEADER.to_owned())
35+
.unwrap()?,
3636
)?;
3737

3838
visitor = visitor.set_spec_version(spec_version.clone())?;
@@ -90,8 +90,7 @@ impl<'a> MessageDeserializer for HttpRequestDeserializer<'a> {
9090
} else if self
9191
.req
9292
.headers()
93-
.get::<&'static HeaderName>(&super::headers::SPEC_VERSION_HEADER)
94-
.is_some()
93+
.contains_key(super::headers::SPEC_VERSION_HEADER.to_owned())
9594
{
9695
Encoding::BINARY
9796
} else {
@@ -173,11 +172,11 @@ mod tests {
173172
.unwrap();
174173

175174
let (req, payload) = test::TestRequest::post()
176-
.header("ce-specversion", "1.0")
177-
.header("ce-id", "0001")
178-
.header("ce-type", "example.test")
179-
.header("ce-source", "http://localhost/")
180-
.header("ce-someint", "10")
175+
.insert_header(("ce-specversion", "1.0"))
176+
.insert_header(("ce-id", "0001"))
177+
.insert_header(("ce-type", "example.test"))
178+
.insert_header(("ce-source", "http://localhost/"))
179+
.insert_header(("ce-someint", "10"))
181180
.to_http_parts();
182181

183182
let resp = req.to_event(web::Payload(payload)).await.unwrap();
@@ -198,12 +197,12 @@ mod tests {
198197
.unwrap();
199198

200199
let (req, payload) = test::TestRequest::post()
201-
.header("ce-specversion", "1.0")
202-
.header("ce-id", "0001")
203-
.header("ce-type", "example.test")
204-
.header("ce-source", "http://localhost")
205-
.header("ce-someint", "10")
206-
.header("content-type", "application/json")
200+
.insert_header(("ce-specversion", "1.0"))
201+
.insert_header(("ce-id", "0001"))
202+
.insert_header(("ce-type", "example.test"))
203+
.insert_header(("ce-source", "http://localhost"))
204+
.insert_header(("ce-someint", "10"))
205+
.insert_header(("content-type", "application/json"))
207206
.set_json(&j)
208207
.to_http_parts();
209208

@@ -235,7 +234,7 @@ mod tests {
235234
.unwrap();
236235

237236
let (req, payload) = test::TestRequest::post()
238-
.header("content-type", "application/cloudevents+json")
237+
.insert_header(("content-type", "application/cloudevents+json"))
239238
.set_payload(bytes)
240239
.to_http_parts();
241240

src/binding/actix/server_response.rs

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@ use crate::Event;
77
use actix_web::dev::HttpResponseBuilder;
88
use actix_web::http::{HeaderName, HeaderValue, StatusCode};
99
use actix_web::HttpResponse;
10-
use async_trait::async_trait;
11-
use futures::future::LocalBoxFuture;
12-
use futures::FutureExt;
1310
use std::str::FromStr;
1411

1512
/// Wrapper for [`HttpResponseBuilder`] that implements [`StructuredSerializer`] and [`BinarySerializer`].
@@ -25,26 +22,26 @@ impl HttpResponseSerializer {
2522

2623
impl BinarySerializer<HttpResponse> for HttpResponseSerializer {
2724
fn set_spec_version(mut self, spec_version: SpecVersion) -> Result<Self> {
28-
self.builder.set_header(
25+
self.builder.insert_header((
2926
headers::SPEC_VERSION_HEADER.clone(),
3027
str_to_header_value!(spec_version.as_str())?,
31-
);
28+
));
3229
Ok(self)
3330
}
3431

3532
fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> {
36-
self.builder.set_header(
33+
self.builder.insert_header((
3734
headers::ATTRIBUTES_TO_HEADERS.get(name).unwrap().clone(),
3835
str_to_header_value!(value.to_string().as_str())?,
39-
);
36+
));
4037
Ok(self)
4138
}
4239

4340
fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> {
44-
self.builder.set_header(
41+
self.builder.insert_header((
4542
attribute_name_to_header!(name)?,
4643
str_to_header_value!(value.to_string().as_str())?,
47-
);
44+
));
4845
Ok(self)
4946
}
5047

@@ -61,16 +58,16 @@ impl StructuredSerializer<HttpResponse> for HttpResponseSerializer {
6158
fn set_structured_event(mut self, bytes: Vec<u8>) -> Result<HttpResponse> {
6259
Ok(self
6360
.builder
64-
.set_header(
61+
.insert_header((
6562
actix_web::http::header::CONTENT_TYPE,
6663
headers::CLOUDEVENTS_JSON_HEADER.clone(),
67-
)
64+
))
6865
.body(bytes))
6966
}
7067
}
7168

7269
/// Method to fill an [`HttpResponseBuilder`] with an [`Event`].
73-
pub async fn event_to_response(
70+
pub fn event_to_response(
7471
event: Event,
7572
response: HttpResponseBuilder,
7673
) -> std::result::Result<HttpResponse, actix_web::error::Error> {
@@ -80,33 +77,22 @@ pub async fn event_to_response(
8077

8178
/// So that an actix-web handler may return an Event
8279
impl actix_web::Responder for Event {
83-
type Error = actix_web::Error;
84-
type Future = LocalBoxFuture<'static, std::result::Result<HttpResponse, Self::Error>>;
85-
86-
fn respond_to(self, _: &actix_web::HttpRequest) -> Self::Future {
87-
async { HttpResponse::build(StatusCode::OK).event(self).await }.boxed_local()
80+
fn respond_to(self, _: &actix_web::HttpRequest) -> HttpResponse {
81+
HttpResponse::build(StatusCode::OK).event(self).unwrap()
8882
}
8983
}
9084

9185
/// Extension Trait for [`HttpResponseBuilder`] which acts as a wrapper for the function [`event_to_response()`].
9286
///
9387
/// This trait is sealed and cannot be implemented for types outside of this crate.
94-
#[async_trait(?Send)]
9588
pub trait HttpResponseBuilderExt: private::Sealed {
9689
/// Fill this [`HttpResponseBuilder`] with an [`Event`].
97-
async fn event(
98-
self,
99-
event: Event,
100-
) -> std::result::Result<HttpResponse, actix_web::error::Error>;
90+
fn event(self, event: Event) -> std::result::Result<HttpResponse, actix_web::error::Error>;
10191
}
10292

103-
#[async_trait(?Send)]
10493
impl HttpResponseBuilderExt for HttpResponseBuilder {
105-
async fn event(
106-
self,
107-
event: Event,
108-
) -> std::result::Result<HttpResponse, actix_web::error::Error> {
109-
event_to_response(event, self).await
94+
fn event(self, event: Event) -> std::result::Result<HttpResponse, actix_web::error::Error> {
95+
event_to_response(event, self)
11096
}
11197
}
11298

@@ -138,7 +124,6 @@ mod tests {
138124

139125
let resp = HttpResponseBuilder::new(StatusCode::OK)
140126
.event(input)
141-
.await
142127
.unwrap();
143128

144129
assert_eq!(
@@ -182,7 +167,6 @@ mod tests {
182167

183168
let mut resp = HttpResponseBuilder::new(StatusCode::OK)
184169
.event(input)
185-
.await
186170
.unwrap();
187171

188172
assert_eq!(

0 commit comments

Comments
 (0)