diff --git a/library/network/http_client/src/spec/libcurl/libcurl_http_client_request.e b/library/network/http_client/src/spec/libcurl/libcurl_http_client_request.e index c3721a26..c46c8e9b 100644 --- a/library/network/http_client/src/spec/libcurl/libcurl_http_client_request.e +++ b/library/network/http_client/src/spec/libcurl/libcurl_http_client_request.e @@ -47,6 +47,7 @@ feature -- Execution l_result: INTEGER l_curl_string: detachable CURL_STRING l_url: READABLE_STRING_8 + l_use_curl_form: BOOLEAN l_form: detachable CURL_FORM l_last: CURL_FORM l_upload_file: detachable RAW_FILE @@ -166,19 +167,24 @@ feature -- Execution if l_upload_data = Void and l_upload_filename = Void then -- Send as form-urlencoded if - l_headers.has_key ("Content-Type") and then - attached l_headers.found_item as l_ct + attached l_headers.item ("Content-Type") as l_ct then if l_ct.starts_with ("application/x-www-form-urlencoded") then -- Content-Type is already application/x-www-form-urlencoded l_upload_data := ctx.form_parameters_to_url_encoded_string + elseif l_ct.starts_with ("multipart/form-data") then + l_use_curl_form := True else - -- Existing Content-Type and not application/x-www-form-urlencoded + -- Not supported, use libcurl form. + l_use_curl_form := True end else l_upload_data := ctx.form_parameters_to_url_encoded_string end else + l_use_curl_form := True + end + if l_use_curl_form then create l_form.make create l_last.make from @@ -434,7 +440,7 @@ feature {NONE} -- Implementation end note - copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software diff --git a/library/network/http_client/src/spec/net/net_http_client_request.e b/library/network/http_client/src/spec/net/net_http_client_request.e index 5a3acfa5..8c9b1776 100644 --- a/library/network/http_client/src/spec/net/net_http_client_request.e +++ b/library/network/http_client/src/spec/net/net_http_client_request.e @@ -194,16 +194,36 @@ feature -- Access if ctx.has_form_data then l_form_data := ctx.form_parameters if l_upload_data = Void and l_upload_filename = Void then - -- Send as form-urlencoded - headers.extend ("application/x-www-form-urlencoded", "Content-Type") - l_upload_data := ctx.form_parameters_to_url_encoded_string - headers.force (l_upload_data.count.out, "Content-Length") + if + attached headers.item ("Content-Type") as l_ct + then + if l_ct.starts_with ("application/x-www-form-urlencoded") then + l_upload_data := ctx.form_parameters_to_url_encoded_string + elseif l_ct.starts_with ("multipart/form-data") then + -- create form using multipart/form-data encoding + l_boundary := new_mime_boundary (l_form_data) + headers.extend ("multipart/form-data; boundary=" + l_boundary, "Content-Type") + l_upload_data := form_date_and_uploaded_files_to_mime_string (l_form_data, l_upload_filename, l_boundary) + else + -- not supported ! + -- Send as form-urlencoded + headers.extend ("application/x-www-form-urlencoded", "Content-Type") + l_upload_data := ctx.form_parameters_to_url_encoded_string + end + else + -- Send as form-urlencoded + headers.extend ("application/x-www-form-urlencoded", "Content-Type") + l_upload_data := ctx.form_parameters_to_url_encoded_string + end + headers.extend (l_upload_data.count.out, "Content-Length") if l_is_chunked_transfer_encoding then -- Discard chunked transfer encoding headers.remove ("Transfer-Encoding") l_is_chunked_transfer_encoding := False end elseif l_form_data /= Void then + check l_upload_data = Void end + -- create form using multipart/form-data encoding l_boundary := new_mime_boundary (l_form_data) headers.extend ("multipart/form-data; boundary=" + l_boundary, "Content-Type") @@ -400,9 +420,9 @@ feature -- Access end -- follow redirect - if + if is_redirection_http_status (Result.status) and - l_location /= Void + l_location /= Void then if Result.redirections_count < max_redirects then initialize (l_location, ctx) @@ -906,7 +926,7 @@ feature {NONE} -- Helpers invariant note - copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software