barbieri pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=f1c691d0f54c13ad76163ce419cbc54f2b3b2afc

commit f1c691d0f54c13ad76163ce419cbc54f2b3b2afc
Author: Gustavo Sverzut Barbieri <barbi...@profusion.mobi>
Date:   Mon Aug 29 14:50:33 2016 -0300

    efl_net_dialer_http: allow incompatible configurations such as GET + upload.
    
    CURL is smart and when you ask for CURLOPT_HTTPGET, it will
    automatically configure UPLOAD=false. Likewise, if you ask for
    UPLOAD=1 it will configure CURLOPT_PUT...
    
    However, to do things like WebSocket we need to do a GET request where
    we need to send data, then UPLOAD=true must be used.
    
    Then use both information in order to setup the request method and
    upload, using CURLOPT_CUSTOMREQUEST to force a given HTTP method.
---
 src/lib/ecore_con/efl_net_dialer_http.c | 65 +++++++++++++++++++++++++++------
 1 file changed, 53 insertions(+), 12 deletions(-)

diff --git a/src/lib/ecore_con/efl_net_dialer_http.c 
b/src/lib/ecore_con/efl_net_dialer_http.c
index f80bd4e..68477ac 100644
--- a/src/lib/ecore_con/efl_net_dialer_http.c
+++ b/src/lib/ecore_con/efl_net_dialer_http.c
@@ -1378,25 +1378,65 @@ _efl_net_dialer_http_efl_io_sizer_size_get(Eo *o, 
Efl_Net_Dialer_Http_Data *pd)
    return len;
 }
 
-EOLIAN static void
-_efl_net_dialer_http_method_set(Eo *o, Efl_Net_Dialer_Http_Data *pd, const 
char *method)
+static void
+_efl_net_dialer_http_request_apply(Eo *o, Efl_Net_Dialer_Http_Data *pd, const 
char *method, Efl_Net_Dialer_Http_Primary_Mode primary_mode)
 {
    CURLcode r;
 
-   EINA_SAFETY_ON_NULL_RETURN(method);
-
-   if (strcasecmp(method, "GET") == 0)
-     r = curl_easy_setopt(pd->easy, CURLOPT_HTTPGET, 1L);
-   else if (strcasecmp(method, "POST") == 0)
-     r = curl_easy_setopt(pd->easy, CURLOPT_POST, 1L);
-   else if (strcasecmp(method, "PUT") == 0)
-     r = curl_easy_setopt(pd->easy, CURLOPT_PUT, 1L);
+   if (primary_mode == EFL_NET_DIALER_HTTP_PRIMARY_MODE_UPLOAD)
+     {
+        if (strcasecmp(method, "PUT") == 0)
+          r = curl_easy_setopt(pd->easy, CURLOPT_PUT, 1L);
+        else
+          {
+             /* upload with non PUT method:
+              *  1 - set CURLOPT_UPLOAD = 1, this forces httpreq = PUT
+              *  2 - set CURLOPT_CUSTOMREQUEST = method, this overrides
+              *      the string to send.
+              */
+             r = curl_easy_setopt(pd->easy, CURLOPT_UPLOAD, 1L);
+             if (r != CURLE_OK)
+               ERR("dialer=%p could not configure upload mode: %s",
+                   o, curl_easy_strerror(r));
+
+             r = curl_easy_setopt(pd->easy, CURLOPT_CUSTOMREQUEST, method);
+          }
+     }
    else
-     r = curl_easy_setopt(pd->easy, CURLOPT_CUSTOMREQUEST, method);
+     {
+        if (strcasecmp(method, "GET") == 0)
+          r = curl_easy_setopt(pd->easy, CURLOPT_HTTPGET, 1L);
+        else if (strcasecmp(method, "POST") == 0)
+          r = curl_easy_setopt(pd->easy, CURLOPT_POST, 1L);
+        else if (strcasecmp(method, "PUT") == 0)
+          {
+             if (primary_mode == EFL_NET_DIALER_HTTP_PRIMARY_MODE_AUTO)
+               r = curl_easy_setopt(pd->easy, CURLOPT_PUT, 1L);
+             else
+               {
+                  r = curl_easy_setopt(pd->easy, CURLOPT_UPLOAD, 0L);
+                  if (r != CURLE_OK)
+                    ERR("dialer=%p could not configure no-upload mode: %s",
+                        o, curl_easy_strerror(r));
+
+                  r = curl_easy_setopt(pd->easy, CURLOPT_CUSTOMREQUEST, 
method);
+               }
+          }
+        else
+          r = curl_easy_setopt(pd->easy, CURLOPT_CUSTOMREQUEST, method);
+     }
+
    if (r != CURLE_OK)
      ERR("dialer=%p could not configure HTTP method: %s: %s",
          o, method, curl_easy_strerror(r));
+}
+
+EOLIAN static void
+_efl_net_dialer_http_method_set(Eo *o, Efl_Net_Dialer_Http_Data *pd, const 
char *method)
+{
+   EINA_SAFETY_ON_NULL_RETURN(method);
 
+   _efl_net_dialer_http_request_apply(o, pd, method, pd->primary_mode);
    eina_stringshare_replace(&pd->method, method);
 }
 
@@ -1407,8 +1447,9 @@ _efl_net_dialer_http_method_get(Eo *o EINA_UNUSED, 
Efl_Net_Dialer_Http_Data *pd)
 }
 
 EOLIAN static void
-_efl_net_dialer_http_primary_mode_set(Eo *o EINA_UNUSED, 
Efl_Net_Dialer_Http_Data *pd, Efl_Net_Dialer_Http_Primary_Mode primary_mode)
+_efl_net_dialer_http_primary_mode_set(Eo *o, Efl_Net_Dialer_Http_Data *pd, 
Efl_Net_Dialer_Http_Primary_Mode primary_mode)
 {
+   _efl_net_dialer_http_request_apply(o, pd, pd->method, primary_mode);
    pd->primary_mode = primary_mode;
 }
 

-- 


Reply via email to