Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/wasi-http/src/p3/conv.rs
3050 views
1
use crate::p3::bindings::http::types::{ErrorCode, Method, Scheme};
2
use core::convert::Infallible;
3
use core::error::Error as _;
4
use tracing::warn;
5
6
impl From<Infallible> for ErrorCode {
7
fn from(x: Infallible) -> Self {
8
match x {}
9
}
10
}
11
12
impl ErrorCode {
13
/// Translate a [`hyper::Error`] to a wasi-http [ErrorCode] in the context of a request.
14
pub fn from_hyper_request_error(err: hyper::Error) -> Self {
15
// If there's a source, we might be able to extract a wasi-http error from it.
16
if let Some(cause) = err.source() {
17
if let Some(err) = cause.downcast_ref::<Self>() {
18
return err.clone();
19
}
20
}
21
22
warn!("hyper request error: {err:?}");
23
24
Self::HttpProtocolError
25
}
26
27
/// Translate a [`hyper::Error`] to a wasi-http [ErrorCode] in the context of a response.
28
#[cfg(feature = "default-send-request")]
29
pub(crate) fn from_hyper_response_error(err: hyper::Error) -> Self {
30
if err.is_timeout() {
31
return ErrorCode::HttpResponseTimeout;
32
}
33
34
// If there's a source, we might be able to extract a wasi-http error from it.
35
if let Some(cause) = err.source() {
36
if let Some(err) = cause.downcast_ref::<Self>() {
37
return err.clone();
38
}
39
}
40
41
warn!("hyper response error: {err:?}");
42
43
ErrorCode::HttpProtocolError
44
}
45
}
46
47
impl From<http::Method> for Method {
48
fn from(method: http::Method) -> Self {
49
Self::from(&method)
50
}
51
}
52
53
impl From<&http::Method> for Method {
54
fn from(method: &http::Method) -> Self {
55
if method == http::Method::GET {
56
Self::Get
57
} else if method == http::Method::HEAD {
58
Self::Head
59
} else if method == http::Method::POST {
60
Self::Post
61
} else if method == http::Method::PUT {
62
Self::Put
63
} else if method == http::Method::DELETE {
64
Self::Delete
65
} else if method == http::Method::CONNECT {
66
Self::Connect
67
} else if method == http::Method::OPTIONS {
68
Self::Options
69
} else if method == http::Method::TRACE {
70
Self::Trace
71
} else if method == http::Method::PATCH {
72
Self::Patch
73
} else {
74
Self::Other(method.as_str().into())
75
}
76
}
77
}
78
79
impl TryFrom<Method> for http::Method {
80
type Error = http::method::InvalidMethod;
81
82
fn try_from(method: Method) -> Result<Self, Self::Error> {
83
Self::try_from(&method)
84
}
85
}
86
87
impl TryFrom<&Method> for http::Method {
88
type Error = http::method::InvalidMethod;
89
90
fn try_from(method: &Method) -> Result<Self, Self::Error> {
91
match method {
92
Method::Get => Ok(Self::GET),
93
Method::Head => Ok(Self::HEAD),
94
Method::Post => Ok(Self::POST),
95
Method::Put => Ok(Self::PUT),
96
Method::Delete => Ok(Self::DELETE),
97
Method::Connect => Ok(Self::CONNECT),
98
Method::Options => Ok(Self::OPTIONS),
99
Method::Trace => Ok(Self::TRACE),
100
Method::Patch => Ok(Self::PATCH),
101
Method::Other(s) => s.parse(),
102
}
103
}
104
}
105
106
impl From<http::uri::Scheme> for Scheme {
107
fn from(scheme: http::uri::Scheme) -> Self {
108
Self::from(&scheme)
109
}
110
}
111
112
impl From<&http::uri::Scheme> for Scheme {
113
fn from(scheme: &http::uri::Scheme) -> Self {
114
if *scheme == http::uri::Scheme::HTTP {
115
Self::Http
116
} else if *scheme == http::uri::Scheme::HTTPS {
117
Self::Https
118
} else {
119
Self::Other(scheme.as_str().into())
120
}
121
}
122
}
123
124
impl TryFrom<Scheme> for http::uri::Scheme {
125
type Error = http::uri::InvalidUri;
126
127
fn try_from(scheme: Scheme) -> Result<Self, Self::Error> {
128
Self::try_from(&scheme)
129
}
130
}
131
132
impl TryFrom<&Scheme> for http::uri::Scheme {
133
type Error = http::uri::InvalidUri;
134
135
fn try_from(scheme: &Scheme) -> Result<Self, Self::Error> {
136
match scheme {
137
Scheme::Http => Ok(Self::HTTP),
138
Scheme::Https => Ok(Self::HTTPS),
139
Scheme::Other(s) => s.parse(),
140
}
141
}
142
}
143
144