Skip to content

Commit ddb48ae

Browse files
Update HTTP runtime for ureq v3
Agent-Logs-Url: https://github.com/code0-tech/taurus/sessions/e7ff2af7-5fa3-402f-8d1d-2da327e70630 Co-authored-by: raphael-goetz <52959657+raphael-goetz@users.noreply.github.com>
1 parent 1571801 commit ddb48ae

1 file changed

Lines changed: 61 additions & 15 deletions

File tree

  • crates/taurus-core/src/runtime/functions

crates/taurus-core/src/runtime/functions/http.rs

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ use std::io::Read;
1515
use tucana::shared::helper::value::{ToValue, from_json_value, to_json_value};
1616
use tucana::shared::value::Kind;
1717
use tucana::shared::{Struct, Value};
18+
use ureq::http;
19+
use ureq::{Body, RequestExt};
1820

1921
pub(crate) const FUNCTIONS: &[FunctionRegistration] = &[
2022
FunctionRegistration::eager("http::request::create", create_request, 4),
@@ -158,28 +160,69 @@ fn send_request(
158160
headers.insert("content-type".to_string(), default_content_type.to_string());
159161
}
160162

161-
let mut request = ureq::request(&method, &url);
163+
let http_method = match http::Method::from_bytes(method.as_bytes()) {
164+
Ok(value) => value,
165+
Err(_) => {
166+
return fail(
167+
"InvalidArgumentRuntimeError",
168+
format!("Invalid HTTP method '{}'", method),
169+
);
170+
}
171+
};
172+
173+
let mut request_builder = http::Request::builder().method(http_method).uri(&url);
162174
for (name, value) in &headers {
163-
request = request.set(name, value);
175+
request_builder = request_builder.header(name, value);
164176
}
165177

166178
let response_result = match request_body {
167-
Some(bytes) => request.send_bytes(bytes.as_slice()),
168-
None => request.call(),
179+
Some(bytes) => {
180+
let request = match request_builder.body(bytes) {
181+
Ok(request) => request,
182+
Err(err) => {
183+
return fail(
184+
"InvalidArgumentRuntimeError",
185+
format!("Invalid HTTP request: {}", err),
186+
);
187+
}
188+
};
189+
request
190+
.with_default_agent()
191+
.configure()
192+
.http_status_as_error(false)
193+
.allow_non_standard_methods(true)
194+
.run()
195+
}
196+
None => {
197+
let request = match request_builder.body(()) {
198+
Ok(request) => request,
199+
Err(err) => {
200+
return fail(
201+
"InvalidArgumentRuntimeError",
202+
format!("Invalid HTTP request: {}", err),
203+
);
204+
}
205+
};
206+
request
207+
.with_default_agent()
208+
.configure()
209+
.http_status_as_error(false)
210+
.allow_non_standard_methods(true)
211+
.run()
212+
}
169213
};
170214

171215
let response = match response_result {
172216
Ok(response) => response,
173-
Err(ureq::Error::Status(_, response)) => response,
174-
Err(ureq::Error::Transport(err)) => {
217+
Err(err) => {
175218
return fail(
176219
"HttpRequestRuntimeError",
177-
format!("HTTP transport error while sending request: {}", err),
220+
format!("HTTP request error while sending request: {}", err),
178221
);
179222
}
180223
};
181224

182-
let status_code = response.status() as i64;
225+
let status_code = response.status().as_u16() as i64;
183226
let response_headers = decode_headers(&response);
184227
let response_payload = match decode_response_payload(response) {
185228
Ok(result) => result,
@@ -364,23 +407,26 @@ fn encode_request_payload(
364407
}
365408
}
366409

367-
fn decode_headers(response: &ureq::Response) -> Struct {
410+
fn decode_headers(response: &http::Response<Body>) -> Struct {
368411
let mut fields = HashMap::new();
369-
for name in response.headers_names() {
370-
if let Some(value) = response.header(&name) {
371-
fields.insert(name, value.to_string().to_value());
412+
for (name, value) in response.headers().iter() {
413+
if let Ok(value) = value.to_str() {
414+
fields.insert(name.as_str().to_string(), value.to_string().to_value());
372415
}
373416
}
374417
Struct { fields }
375418
}
376419

377-
fn decode_response_payload(response: ureq::Response) -> Result<Value, String> {
420+
fn decode_response_payload(response: http::Response<Body>) -> Result<Value, String> {
378421
let content_type = response
379-
.header("content-type")
422+
.headers()
423+
.get(http::header::CONTENT_TYPE)
424+
.and_then(|value| value.to_str().ok())
380425
.map(|value| value.to_ascii_lowercase());
381426

382427
let mut bytes = Vec::new();
383-
let mut reader = response.into_reader();
428+
let (_, body) = response.into_parts();
429+
let mut reader = body.into_reader();
384430
reader
385431
.read_to_end(&mut bytes)
386432
.map_err(|err| format!("Unable to read HTTP response payload: {}", err))?;

0 commit comments

Comments
 (0)