2011/12/21 Michael Blumenkrantz <[email protected]>:
> On Wed, 21 Dec 2011 17:42:22 +0900
> Bluezery <[email protected]> wrote:
>
>> Hi,
>>
>> I have heard that ECORE_CON_SOCKS_V4 is used for socks proxy.
>> So, I add to read this value when econ_con_url is used.
>> But I can not test this. because I cannot access socks proxy server.
>> @discomfitor can help to review this patch.
>>
> also, you can easily test this by doing something like:
>
> Create the ssh tunnel to localhost:
> ssh -D 9999 127.0.0.1
>
> Start an app with the proxy variable which uses the localhost tunnel:
> ECORE_CON_SOCKS_V4=127.0.0.1:9999:1 ./app
Oops.. I have forgotten a patch file :(
And sorry for later response
I have tested as you suggested. It works well :)
Also I have realized that proxy username/password set APIs are needed
and added them.
Please review attached patch.
--
BRs,
Kim.
Index: src/lib/ecore_con/ecore_con_url.c
===================================================================
--- src/lib/ecore_con/ecore_con_url.c (리비전 66443)
+++ src/lib/ecore_con/ecore_con_url.c (작업 사본)
@@ -171,6 +171,7 @@ ecore_con_url_new(const char *url)
#ifdef HAVE_CURL
Ecore_Con_Url *url_con;
CURLcode ret;
+ const char *socks;
if (!_init_count)
return NULL;
@@ -196,6 +197,33 @@ ecore_con_url_new(const char *url)
return NULL;
}
+ /* Copied & modified somewhat from ecore_con_socks_init() */
+ /* ECORE_CON_SOCKS_V4=user@host:port:[1|0] */
+ socks = getenv("ECORE_CON_SOCKS_V4");
+ if ((socks) && (socks[0]) && (strlen(socks) <= 64))
+ {
+ char *u = NULL;
+ char *h, *p;
+ char buf[128];
+
+ strncpy(buf, socks, sizeof(buf));
+ h = strchr(buf, '@');
+ u = NULL;
+ if (h && (h - buf > 0)) *h++ = 0, u = buf;
+ else h = buf;
+
+ if (u) ecore_con_url_proxy_username_set(url_con, u);
+
+ p = strrchr(h, ':');
+ if (p) *p++ = 0;
+ if (h)
+ {
+ char host[64];
+ snprintf(host, sizeof(host), "socks4://%s", h);
+ ecore_con_url_proxy_set(url_con, host);
+ }
+ }
+
ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING, "gzip,deflate");
if (ret != CURLE_OK)
{
@@ -1074,6 +1102,8 @@ ecore_con_url_proxy_set(Ecore_Con_Url *u
{
#ifdef HAVE_CURL
int res = -1;
+ curl_version_info_data *vers = NULL;
+
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_set");
@@ -1083,12 +1113,31 @@ ecore_con_url_proxy_set(Ecore_Con_Url *u
if (eina_list_data_find(_url_con_list, url_con)) return EINA_FALSE;
if (!url_con->url) return EINA_FALSE;
- if (proxy == NULL) res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, "");
- else res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, proxy);
-
+ if (!proxy) res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, "");
+ else
+ {
+ // before curl version 7.21.7, socks protocol:// prefix is not supported
+ // (e.g. socks4://, socks4a://, socks5:// or socks5h://, etc.)
+ vers = curl_version_info(CURLVERSION_NOW);
+ if (vers->age >=0 && vers->version_num < 0x71507)
+ {
+ long type = CURLPROXY_HTTP;
+ if (strstr(proxy, "socks4")) type = CURLPROXY_SOCKS4;
+ else if (strstr(proxy, "socks4a")) type = CURLPROXY_SOCKS4A;
+ else if (strstr(proxy, "socks5")) type = CURLPROXY_SOCKS5;
+ else if (strstr(proxy, "socks5h")) type = CURLPROXY_SOCKS5_HOSTNAME;
+ res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXYTYPE, type);
+ if (res != CURLE_OK)
+ {
+ ERR("curl proxy type setting failed: %s", curl_easy_strerror(res));
+ return EINA_FALSE;
+ }
+ }
+ res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, proxy);
+ }
if (res != CURLE_OK)
{
- ERR("curl_easy_setopt() failed");
+ ERR("curl proxy setting failed: %s", curl_easy_strerror(res));
return EINA_FALSE;
}
return EINA_TRUE;
@@ -1120,6 +1169,63 @@ ecore_con_url_timeout_set(Ecore_Con_Url
#endif
}
+EAPI Eina_Bool
+ecore_con_url_proxy_username_set(Ecore_Con_Url *url_con, const char *username)
+{
+#ifdef HAVE_CURL
+ int res = -1;
+ if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+ {
+ ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_username_set");
+ return EINA_FALSE;
+ }
+
+ if (eina_list_data_find(_url_con_list, url_con)) return EINA_FALSE;
+ if (!url_con->url) return EINA_FALSE;
+ if (!username) return EINA_FALSE;
+
+ res = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
+ if (res != CURLE_OK)
+ {
+ ERR("curl_easy_setopt() failed: %s", curl_easy_strerror(res));
+ return EINA_FALSE;
+ }
+ return EINA_TRUE;
+#else
+ return EINA_FALSE;
+ (void)url_con;
+ (void)username;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_con_url_proxy_password_set(Ecore_Con_Url *url_con, const char *password)
+{
+#ifdef HAVE_CURL
+ int res = -1;
+ if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+ {
+ ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_password_set");
+ return EINA_FALSE;
+ }
+ if (eina_list_data_find(_url_con_list, url_con)) return EINA_FALSE;
+ if (!url_con->url) return EINA_FALSE;
+ if (!password) return EINA_FALSE;
+
+ res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password);
+ if (res != CURLE_OK)
+ {
+ ERR("curl_easy_setopt() failed: %s", curl_easy_strerror(res));
+ return EINA_FALSE;
+ }
+ return EINA_TRUE;
+#else
+ return EINA_FALSE;
+ (void)url_con;
+ (void)password;
+#endif
+}
+
/**
* @}
*/
Index: src/lib/ecore_con/Ecore_Con.h
===================================================================
--- src/lib/ecore_con/Ecore_Con.h (리비전 66443)
+++ src/lib/ecore_con/Ecore_Con.h (작업 사본)
@@ -1864,6 +1864,28 @@ EAPI int ecore_con_url_ssl
EAPI Eina_Bool ecore_con_url_proxy_set(Ecore_Con_Url *url_con, const char *proxy);
/**
+ * Set zero terminated username to use for proxy.
+ *
+ * @param url_con Connection object that will use the proxy.
+ * @param username Username string.
+ *
+ * @return #EINA_TRUE on success, #EINA_FALSE on error.
+ * @since 1.2
+ */
+EAPI Eina_Bool ecore_con_url_proxy_username_set(Ecore_Con_Url *url_con, const char *username);
+
+/**
+ * Set zero terminated password to use for proxy.
+ *
+ * @param url_con Connection object that will use the proxy.
+ * @param password Password string.
+ *
+ * @return #EINA_TRUE on success, #EINA_FALSE on error.
+ * @since 1.2
+ */
+EAPI Eina_Bool ecore_con_url_proxy_password_set(Ecore_Con_Url *url_con, const char *password);
+
+/**
* Set timeout in seconds.
*
* the maximum time in seconds that you allow the ecore con url transfer
Index: NEWS
===================================================================
--- NEWS (리비전 66443)
+++ NEWS (작업 사본)
@@ -13,6 +13,8 @@ Additions:
- ECORE_CON_REMOTE_CORK
- ecore_con_url_proxy_set()
- ecore_con_url_timeout_set()
+ - ecore_con_url_proxy_username_set
+ - ecore_con_url_proxy_password_set()
* ecore_x:
- ecore_x_randr_output_backlight_available()
Index: ChangeLog
===================================================================
--- ChangeLog (리비전 66443)
+++ ChangeLog (작업 사본)
@@ -433,3 +433,7 @@
2011-12-21 Tae-Hwan Kim (Bluezery)
* Add proxy set and timeout set functions in ecore_con.
+
+2011-12-26 Tae-Hwan Kim (Bluezery)
+
+ * Add proxy username/password set functions in ecore_con.
------------------------------------------------------------------------------
Write once. Port to many.
Get the SDK and tools to simplify cross-platform app development. Create
new or port existing apps to sell to consumers worldwide. Explore the
Intel AppUpSM program developer opportunity. appdeveloper.intel.com/join
http://p.sf.net/sfu/intel-appdev
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel