@@ -15,6 +15,8 @@ use std::io::Read;
1515use tucana:: shared:: helper:: value:: { ToValue , from_json_value, to_json_value} ;
1616use tucana:: shared:: value:: Kind ;
1717use tucana:: shared:: { Struct , Value } ;
18+ use ureq:: http;
19+ use ureq:: { Body , RequestExt } ;
1820
1921pub ( 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