[erlang-ibrowse] Ver. 4.0.1

Peter Lemenkov peter at fedoraproject.org
Mon Jun 23 11:21:39 UTC 2014


commit e83bbb331a35f3439c53ced356abea837df42bd9
Author: Peter Lemenkov <lemenkov at gmail.com>
Date:   Mon Jun 23 15:21:35 2014 +0400

    Ver. 4.0.1
    
    Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>

 .gitignore                                         |    1 +
 ...1-Support-SOCKS5-protocol-for-replication.patch |  287 ++++++++++++++++++++
 erlang-ibrowse.spec                                |   51 ++--
 sources                                            |    2 +-
 4 files changed, 310 insertions(+), 31 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index f2d5afc..86cd50b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@ cmullaparthi-ibrowse-07153bc.tar.gz
 /cmullaparthi-ibrowse-v2.1.0-0-gd5d3f1f.tar.gz
 /cmullaparthi-ibrowse-v2.1.3-0-g9c4f414.tar.gz
 /cmullaparthi-ibrowse-v2.2.0-0-g8c46b10.tar.gz
+/ibrowse-4.0.1.tar.gz
diff --git a/erlang-ibrowse-0001-Support-SOCKS5-protocol-for-replication.patch b/erlang-ibrowse-0001-Support-SOCKS5-protocol-for-replication.patch
new file mode 100644
index 0000000..06447ab
--- /dev/null
+++ b/erlang-ibrowse-0001-Support-SOCKS5-protocol-for-replication.patch
@@ -0,0 +1,287 @@
+From 56b181026ef328c4025b3f3cd65c48aa0ac5c47b Mon Sep 17 00:00:00 2001
+From: Robert Newson <rnewson at apache.org>
+Date: Sat, 4 Jan 2014 17:32:00 +0000
+Subject: [PATCH] Support SOCKS5 protocol for replication
+
+Using "socks5" as the protocol in the "proxy" parameter of replication
+requests will cause DNS resolution and data transfer to happen via a
+SOCKS5 proxy server.
+
+COUCHDB-2025
+
+diff --git a/src/ibrowse_http_client.erl b/src/ibrowse_http_client.erl
+index 59b9e08..8a3ce49 100644
+--- a/src/ibrowse_http_client.erl
++++ b/src/ibrowse_http_client.erl
+@@ -39,7 +39,8 @@
+ 
+ -record(state, {host, port, connect_timeout,
+                 inactivity_timer_ref,
+-                use_proxy = false, proxy_auth_digest,
++                use_http_proxy = false, http_proxy_auth_digest,
++                socks5_host, socks5_port, socks5_user, socks5_password,
+                 ssl_options = [], is_ssl = false, socket,
+                 proxy_tunnel_setup = false,
+                 tunnel_setup_queue = [],
+@@ -488,9 +489,21 @@ handle_sock_closed(#state{reply_buffer = Buf, reqs = Reqs, http_status_code = SC
+             State
+     end.
+ 
+-do_connect(Host, Port, Options, #state{is_ssl      = true,
+-                                       use_proxy   = false,
+-                                       ssl_options = SSLOptions},
++do_connect(Host, Port, Options, #state{socks5_host = SocksHost}=State, Timeout)
++  when SocksHost /= undefined ->
++    ProxyOptions = [
++        {user,     State#state.socks5_user},
++        {password, State#state.socks5_password},
++        {host,     SocksHost},
++        {port,     State#state.socks5_port},
++        {is_ssl,   State#state.is_ssl},
++        {ssl_opts, State#state.ssl_options}],
++    ibrowse_socks5:connect(Host, Port, ProxyOptions,
++                           get_sock_options(SocksHost, Options, []),
++                           Timeout);
++do_connect(Host, Port, Options, #state{is_ssl         = true,
++                                       use_http_proxy = false,
++                                       ssl_options    = SSLOptions},
+            Timeout) ->
+     ssl:connect(Host, Port, get_sock_options(Host, Options, SSLOptions), Timeout);
+ do_connect(Host, Port, Options, _State, Timeout) ->
+@@ -541,7 +554,7 @@ filter_sock_options(Opts) ->
+ 
+ do_send(Req, #state{socket = Sock,
+                     is_ssl = true,
+-                    use_proxy = true,
++                    use_http_proxy = true,
+                     proxy_tunnel_setup = Pts}) when Pts /= done ->  gen_tcp:send(Sock, Req);
+ do_send(Req, #state{socket = Sock, is_ssl = true})  ->  ssl:send(Sock, Req);
+ do_send(Req, #state{socket = Sock, is_ssl = false}) ->  gen_tcp:send(Sock, Req).
+@@ -589,7 +602,7 @@ maybe_chunked_encode(Data, true) ->
+ do_close(#state{socket = undefined})            ->  ok;
+ do_close(#state{socket = Sock,
+                 is_ssl = true,
+-                use_proxy = true,
++                use_http_proxy = true,
+                 proxy_tunnel_setup = Pts
+                }) when Pts /= done ->  catch gen_tcp:close(Sock);
+ do_close(#state{socket = Sock, is_ssl = true})  ->  catch ssl:close(Sock);
+@@ -602,7 +615,7 @@ active_once(#state{socket = Socket} = State) ->
+ 
+ do_setopts(_Sock, [],   _)    ->  ok;
+ do_setopts(Sock, Opts, #state{is_ssl = true,
+-                              use_proxy = true,
++                              use_http_proxy = true,
+                               proxy_tunnel_setup = Pts}
+                              ) when Pts /= done ->  inet:setopts(Sock, Opts);
+ do_setopts(Sock, Opts, #state{is_ssl = true}) -> ssl:setopts(Sock, Opts);
+@@ -621,17 +634,28 @@ send_req_1(From,
+                 port = Port} = Url,
+            Headers, Method, Body, Options, Timeout,
+            #state{socket = undefined} = State) ->
++    ProxyHost = get_value(proxy_host, Options, false),
++    ProxyProtocol = get_value(proxy_protocol, Options, http),
+     {Host_1, Port_1, State_1} =
+-        case get_value(proxy_host, Options, false) of
+-            false ->
++        case {ProxyHost, ProxyProtocol} of
++            {false, _} ->
+                 {Host, Port, State};
+-            PHost ->
++            {_, http} ->
+                 ProxyUser     = get_value(proxy_user, Options, []),
+                 ProxyPassword = get_value(proxy_password, Options, []),
+                 Digest        = http_auth_digest(ProxyUser, ProxyPassword),
+-                {PHost, get_value(proxy_port, Options, 80),
+-                 State#state{use_proxy = true,
+-                             proxy_auth_digest = Digest}}
++                {ProxyHost, get_value(proxy_port, Options, 80),
++                 State#state{use_http_proxy = true,
++                             http_proxy_auth_digest = Digest}};
++            {_, socks5} ->
++                ProxyUser     = list_to_binary(get_value(proxy_user, Options, [])),
++                ProxyPassword = list_to_binary(get_value(proxy_password, Options, [])),
++                ProxyPort = get_value(proxy_port, Options, 1080),
++                {Host, Port,
++                 State#state{socks5_host = ProxyHost,
++                             socks5_port = ProxyPort,
++                             socks5_user = ProxyUser,
++                             socks5_password = ProxyPassword}}
+         end,
+     State_2 = check_ssl_options(Options, State_1),
+     do_trace("Connecting...~n", []),
+@@ -662,7 +686,7 @@ send_req_1(From,
+            Headers, Method, Body, Options, Timeout,
+            #state{
+                   proxy_tunnel_setup = false,
+-                  use_proxy = true,
++                  use_http_proxy = true,
+                   is_ssl    = true} = State) ->
+     Ref = case Timeout of
+               infinity ->
+@@ -850,11 +874,11 @@ add_auth_headers(#url{username = User,
+                 end,
+     add_proxy_auth_headers(State, Headers_1).
+ 
+-add_proxy_auth_headers(#state{use_proxy = false}, Headers) ->
++add_proxy_auth_headers(#state{use_http_proxy = false}, Headers) ->
+     Headers;
+-add_proxy_auth_headers(#state{proxy_auth_digest = []}, Headers) ->
++add_proxy_auth_headers(#state{http_proxy_auth_digest = []}, Headers) ->
+     Headers;
+-add_proxy_auth_headers(#state{proxy_auth_digest = Auth_digest}, Headers) ->
++add_proxy_auth_headers(#state{http_proxy_auth_digest = Auth_digest}, Headers) ->
+     [{"Proxy-Authorization", ["Basic ", Auth_digest]} | Headers].
+ 
+ http_auth_digest([], []) ->
+@@ -863,7 +887,7 @@ http_auth_digest(Username, Password) ->
+     ibrowse_lib:encode_base64(Username ++ [$: | Password]).
+ 
+ make_request(Method, Headers, AbsPath, RelPath, Body, Options,
+-             #state{use_proxy = UseProxy, is_ssl = Is_ssl}, ReqId) ->
++             #state{use_http_proxy = UseHttpProxy, is_ssl = Is_ssl}, ReqId) ->
+     HttpVsn = http_vsn_string(get_value(http_vsn, Options, {1,1})),
+     Fun1 = fun({X, Y}) when is_atom(X) ->
+                    {to_lower(atom_to_list(X)), X, Y};
+@@ -906,7 +930,7 @@ make_request(Method, Headers, AbsPath, RelPath, Body, Options,
+                         Headers_2
+                 end,
+     Headers_4 = cons_headers(Headers_3),
+-    Uri = case get_value(use_absolute_uri, Options, false) or UseProxy of
++    Uri = case get_value(use_absolute_uri, Options, false) or UseHttpProxy of
+               true ->
+                   case Is_ssl of
+                       true ->
+diff --git a/src/ibrowse_lib.erl b/src/ibrowse_lib.erl
+index 1ce6bd4..7b12cb3 100644
+--- a/src/ibrowse_lib.erl
++++ b/src/ibrowse_lib.erl
+@@ -362,9 +362,10 @@ parse_url([], get_password, Url, TmpAcc) ->
+ parse_url([], State, Url, TmpAcc) ->
+     {invalid_uri_2, State, Url, TmpAcc}.
+ 
+-default_port(http)  -> 80;
+-default_port(https) -> 443;
+-default_port(ftp)   -> 21.
++default_port(socks5) -> 1080;
++default_port(http)   -> 80;
++default_port(https)  -> 443;
++default_port(ftp)    -> 21.
+ 
+ printable_date() ->
+     {{Y,Mo,D},{H, M, S}} = calendar:local_time(),
+diff --git a/src/ibrowse_socks5.erl b/src/ibrowse_socks5.erl
+new file mode 100644
+index 0000000..d00df44
+--- /dev/null
++++ b/src/ibrowse_socks5.erl
+@@ -0,0 +1,109 @@
++% Licensed under the Apache License, Version 2.0 (the "License"); you may not
++% use this file except in compliance with the License. You may obtain a copy of
++% the License at
++%
++%   http://www.apache.org/licenses/LICENSE-2.0
++%
++% Unless required by applicable law or agreed to in writing, software
++% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
++% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
++% License for the specific language governing permissions and limitations under
++% the License.
++
++-module(ibrowse_socks5).
++
++-define(VERSION, 5).
++-define(CONNECT, 1).
++
++-define(NO_AUTH, 0).
++-define(USERPASS, 2).
++-define(UNACCEPTABLE, 16#FF).
++-define(RESERVED, 0).
++
++-define(ATYP_IPV4, 1).
++-define(ATYP_DOMAINNAME, 3).
++-define(ATYP_IPV6, 4).
++
++-define(SUCCEEDED, 0).
++
++-export([connect/5]).
++
++-import(ibrowse_lib, [get_value/2, get_value/3]).
++
++connect(TargetHost, TargetPort, ProxyOptions, Options, Timeout) ->
++    case gen_tcp:connect(get_value(host, ProxyOptions),
++                         get_value(port, ProxyOptions),
++                         Options, Timeout) of
++        {ok, Socket} ->
++            case handshake(Socket, Options) of
++                ok ->
++                    case connect(TargetHost, TargetPort, Socket) of
++                        ok ->
++                            maybe_ssl(Socket, ProxyOptions, Timeout);
++                        Else ->
++                            gen_tcp:close(Socket),
++                            Else
++                    end;
++                Else ->
++                    gen_tcp:close(Socket),
++                    Else
++            end;
++        Else ->
++            Else
++    end.
++
++handshake(Socket, ProxyOptions) when is_port(Socket) ->
++    {Handshake, Success} = case get_value(user, ProxyOptions, <<>>) of
++        <<>> ->
++            {<<?VERSION, 1, ?NO_AUTH>>, ?NO_AUTH};
++        User ->
++            Password = get_value(password, ProxyOptions, <<>>),
++            {<<?VERSION, 1, ?USERPASS, (byte_size(User)), User,
++               (byte_size(Password)), Password>>, ?USERPASS}
++    end,
++    ok = gen_tcp:send(Socket, Handshake),
++    case gen_tcp:recv(Socket, 0) of
++        {ok, <<?VERSION, Success>>} ->
++            ok;
++        {ok, <<?VERSION, ?UNACCEPTABLE>>} ->
++            {error, unacceptable};
++        {error, Reason} ->
++            {error, Reason}
++    end.
++
++connect(Host, Port, Via) when is_list(Host) ->
++    connect(list_to_binary(Host), Port, Via);
++connect(Host, Port, Via) when is_binary(Host), is_integer(Port),
++                              is_port(Via) ->
++    ok = gen_tcp:send(Via,
++        <<?VERSION, ?CONNECT, ?RESERVED, ?ATYP_DOMAINNAME,
++          (byte_size(Host)), Host/binary,
++          (Port):16>>),
++    case gen_tcp:recv(Via, 0) of
++        {ok, <<?VERSION, ?SUCCEEDED, ?RESERVED, _/binary>>} ->
++            ok;
++        {ok, <<?VERSION, Rep, ?RESERVED, _/binary>>} ->
++            {error, rep(Rep)};
++        {error, Reason} ->
++            {error, Reason}
++    end.
++
++maybe_ssl(Socket, ProxyOptions, Timeout) ->
++    IsSsl = get_value(is_ssl, ProxyOptions, false),
++    SslOpts = get_value(ssl_opts, ProxyOptions, []),
++    case IsSsl of
++        false ->
++            {ok, Socket};
++        true ->
++            ssl:connect(Socket, SslOpts, Timeout)
++    end.
++
++rep(0) -> succeeded;
++rep(1) -> server_fail;
++rep(2) -> disallowed_by_ruleset;
++rep(3) -> network_unreachable;
++rep(4) -> host_unreachable;
++rep(5) -> connection_refused;
++rep(6) -> ttl_expired;
++rep(7) -> command_not_supported;
++rep(8) -> address_type_not_supported.
diff --git a/erlang-ibrowse.spec b/erlang-ibrowse.spec
index a8e3a43..6d9727b 100644
--- a/erlang-ibrowse.spec
+++ b/erlang-ibrowse.spec
@@ -1,63 +1,48 @@
 %global realname ibrowse
 %global debug_package %{nil}
-%global git_tag 8c46b10
 
 
 Name:		erlang-%{realname}
-Version:	2.2.0
-Release:	9%{?dist}
+Version:	4.0.1
+Release:	1%{?dist}
 Summary:	Erlang HTTP client
 Group:		Development/Languages
 License:	BSD or LGPLv2+
 URL:		http://github.com/cmullaparthi/ibrowse
-# wget --no-check-certificate https://github.com/cmullaparthi/ibrowse/tarball/v2.1.3
-Source0:	cmullaparthi-%{realname}-v%{version}-0-g%{git_tag}.tar.gz
-BuildRoot:	%(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
-BuildRequires:	erlang-erts
-BuildRequires:	erlang-eunit
-%if 0%{?el6}%{?fc14}%{?fc15}%{?fc16}
-# FIXME
+VCS:		scm:git:https://github.com/cmullaparthi/ibrowse.git
+Source0:	https://github.com/cmullaparthi/ibrowse/archive/v%{version}/%{realname}-%{version}.tar.gz
+# CouchDB-specific patch
+Patch1:		erlang-ibrowse-0001-Support-SOCKS5-protocol-for-replication.patch
 BuildRequires:	erlang-rebar
-%endif
 BuildRequires:	sed
 Requires:	erlang-erts
 Requires:	erlang-kernel
-Requires:	erlang-sasl
 Requires:	erlang-ssl
 Requires:	erlang-stdlib
 
 
 %description
-Erlang HTTP client.
+%{summary}.
 
 
 %prep
-%setup -q -n cmullaparthi-%{realname}-%{git_tag}
-iconv -f iso8859-1 -t utf-8 README > README.utf8 && \
-	mv -f README.utf8 README || rm -f README.utf8
-rm -f ebin/%{realname}.app
+%setup -q -n %{realname}-%{version}
 
-# FIX  version
-sed -i -e "s,\"2.1.3\",\"2.2.0\",g" src/ibrowse.app.src
+# Use system-wide rebar
+sed -i -e "s,./rebar,rebar,g" Makefile
 
-# Wait until we'll add rebar to EL-5
-#sed -i -e "s,./rebar,rebar -v,g" Makefile
+%patch1 -p1 -b .socks5
 
 
 %build
-make %{?_smp_mflags}
+CFLAGS="%{optflags}" REBAR_FLAGS="--verbose 2" make %{?_smp_mflags}
 
 
 %install
-rm -rf $RPM_BUILD_ROOT
 make install DESTDIR=$RPM_BUILD_ROOT%{_libdir}/erlang
 rm -f $RPM_BUILD_ROOT%{_libdir}/erlang/lib/%{realname}-%{version}/ebin/%{realname}_test.beam
 sed -i -e "s,\,ibrowse_test,,g" $RPM_BUILD_ROOT%{_libdir}/erlang/lib/%{realname}-%{version}/ebin/%{realname}.app
-install -p -m 0644 -D src/ibrowse.hrl $RPM_BUILD_ROOT%{_libdir}/erlang/lib/%{realname}-%{version}/include/ibrowse.hrl
-
-
-%clean
-rm -rf $RPM_BUILD_ROOT
+install -p -m 0644 -D include/ibrowse.hrl $RPM_BUILD_ROOT%{_libdir}/erlang/lib/%{realname}-%{version}/include/ibrowse.hrl
 
 
 %check
@@ -65,8 +50,8 @@ make test
 
 
 %files
-%defattr(-,root,root,-)
-%doc BSD_LICENSE LICENSE README
+%doc BSD_LICENSE LICENSE
+%doc CHANGELOG CONTRIBUTORS README.md
 %dir %{_libdir}/erlang/lib/%{realname}-%{version}
 %dir %{_libdir}/erlang/lib/%{realname}-%{version}/ebin
 %dir %{_libdir}/erlang/lib/%{realname}-%{version}/include
@@ -76,11 +61,17 @@ make test
 %{_libdir}/erlang/lib/%{realname}-%{version}/ebin/%{realname}_http_client.beam
 %{_libdir}/erlang/lib/%{realname}-%{version}/ebin/%{realname}_lb.beam
 %{_libdir}/erlang/lib/%{realname}-%{version}/ebin/%{realname}_lib.beam
+%{_libdir}/erlang/lib/%{realname}-%{version}/ebin/%{realname}_socks5.beam
 %{_libdir}/erlang/lib/%{realname}-%{version}/ebin/%{realname}_sup.beam
 %{_libdir}/erlang/lib/%{realname}-%{version}/include/%{realname}.hrl
 
 
 %changelog
+* Mon Jun 23 2014 Peter Lemenkov <lemenkov at gmail.com> - 4.0.1-1
+- Ver. 4.0.1
+- Support only Fedora 18+, EL6+
+- Added patch for CouchDB 1.6.0
+
 * Sat Jun 07 2014 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 2.2.0-9
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
 
diff --git a/sources b/sources
index cfddb8e..72ecaec 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-7e7cfcde09e5ee1b63d617f7c30132f8  cmullaparthi-ibrowse-v2.2.0-0-g8c46b10.tar.gz
+b3e1cd30e6e966f11321e8322a37214a  ibrowse-4.0.1.tar.gz


More information about the scm-commits mailing list