Release 2.1.1. Various fixes. See README
diff --git a/README b/README
index 098a698..e6f8cd5 100644
--- a/README
+++ b/README
@@ -18,7 +18,7 @@
 
 Comments to : Chandrashekhar.Mullaparthi@gmail.com
 
-Version : 2.1.0
+Version : 2.1.1
 
 Latest version : git://github.com/cmullaparthi/ibrowse.git
 
@@ -42,11 +42,11 @@
 Filipe David Manana
 Geoff Cant
 Jeroen Koops
-João Lopes
+João Lopes
 Karol Skocik
 Kostis Sagonas
 Matthew Reilly
-Oscar Hellström
+Oscar Hellström
 Paul J. Davis
 Peter Kristensen
 Ram Krishnan
@@ -55,11 +55,23 @@
 Seth Falcon
 Steve Vinoski
 Thomas Lindgren
-Younès Hafri
+Younès Hafri
 tholschuh (https://github.com/tholschuh/)
 
 CONTRIBUTIONS & CHANGE HISTORY
 ==============================
+10-12-2010 - v2.1.1
+             * Fix for https://github.com/cmullaparthi/ibrowse/issues/issue/20 
+               by Filipe David Manana
+
+             * Fix for https://github.com/cmullaparthi/ibrowse/issues/issue/21 
+               by Filipe David Manana
+
+             * Fix for https://github.com/cmullaparthi/ibrowse/issues/issue/23 
+               by Filipe David Manana
+
+             * Fix for bugs when using SSL by João Lopes
+
 25-10-2010 - v2.1.0
              * Fixed build on OpenSolaris. Bug report and patch from 
                tholschuh.
@@ -70,7 +82,7 @@
                http://github.com/cmullaparthi/ibrowse/issues/issue/11
 
              * Prevent atom table pollution when bogus URLs are input to 
-               ibrowse. Bug report by João Lopes.
+               ibrowse. Bug report by João Lopes.
                http://github.com/cmullaparthi/ibrowse/issues/issue/13
 
              * Automatically do Chunked-Transfer encoding of request body 
@@ -94,7 +106,7 @@
 
              * Added ibrowse:stream_close/1 to close the connection 
                associated with a certain response stream. Patch provided by
-               João Lopes. 
+               João Lopes. 
 
              * Prevent port number being included in the Host header when port
                443 is intended. Bug reported by Andrew Tunnell-Jones
@@ -183,7 +195,7 @@
            - Patch submitted by Steve Vinoski to remove compiler warnings
              about the use of obsolete guards
 
-29-06-2009 - * Fixed following issues reported by Oscar Hellström
+29-06-2009 - * Fixed following issues reported by Oscar Hellström
                - Use {active, once} instead of {active, true}
                - Fix 'dodgy' timeout handling
                - Use binaries internally instead of lists to reduce memory
@@ -263,7 +275,7 @@
 12-01-2007 -  Derek Upham sent in a bug fix. The reset_state function was not
               behaving correctly when the transfer encoding was not chunked.
 
-13-11-2006 -  Youns Hafri reported a bug where ibrowse was not returning the 
+13-11-2006 -  Youns Hafri reported a bug where ibrowse was not returning the 
                 temporary filename when the server was closing the connection 
                 after sending the data (as in HTTP/1.0).
               Released ibrowse under the BSD license
@@ -282,7 +294,7 @@
 22-Nov-2005 - Added ability to generate requests using the Chunked 
               Transfer-Encoding.
 
-08-May-2005 - Youns Hafri made a CRUX LINUX port of ibrowse.
+08-May-2005 - Youns Hafri made a CRUX LINUX port of ibrowse.
               http://yhafri.club.fr/crux/index.html
 
 Here are some usage examples. Enjoy!
diff --git a/ebin/ibrowse.app b/ebin/ibrowse.app
index e8580d1..aee0f20 100644
--- a/ebin/ibrowse.app
+++ b/ebin/ibrowse.app
@@ -1,6 +1,6 @@
 {application, ibrowse,
         [{description, "HTTP client application"},
-         {vsn, "2.1.0"},
+         {vsn, "2.1.1"},
          {modules, [ ibrowse, 
 		     ibrowse_http_client, 
 		     ibrowse_app, 
diff --git a/src/ibrowse.erl b/src/ibrowse.erl
index 1a42f4b..6e20cfb 100644
--- a/src/ibrowse.erl
+++ b/src/ibrowse.erl
@@ -7,7 +7,7 @@
 %%%-------------------------------------------------------------------
 %% @author Chandrashekhar Mullaparthi <chandrashekhar dot mullaparthi at gmail dot com>
 %% @copyright 2005-2010 Chandrashekhar Mullaparthi
-%% @version 2.1.0
+%% @version 2.1.1
 %% @doc The ibrowse application implements an HTTP 1.1 client in erlang. This
 %% module implements the API of the HTTP client. There is one named
 %% process called 'ibrowse' which assists in load balancing and maintaining configuration. There is one load balancing process per unique webserver. There is
diff --git a/src/ibrowse_http_client.erl b/src/ibrowse_http_client.erl
index cd6d492..0135a49 100644
--- a/src/ibrowse_http_client.erl
+++ b/src/ibrowse_http_client.erl
@@ -69,7 +69,7 @@
                      ]).
 
 -define(DEFAULT_STREAM_CHUNK_SIZE, 1024*1024).
-
+-define(dec2hex(X), erlang:integer_to_list(X, 16)).
 %%====================================================================
 %% External functions
 %%====================================================================
@@ -369,15 +369,6 @@
         {error, Reason} ->
             {error, {file_write_error, Reason}}
     end;
-%% accumulate_response(<<>>, #state{cur_req = #request{caller_controls_socket = Ccs},
-%%                                  socket = Socket} = State) ->
-%%     case Ccs of
-%%         true ->
-%%             do_setopts(Socket, [{active, once}], State);
-%%         false ->
-%%             ok
-%%     end,
-%%     State;
 accumulate_response(Data, #state{reply_buffer      = RepBuf,
                                  rep_buf_size      = RepBufSize,
                                  streamed_size     = Streamed_size,
@@ -544,7 +535,7 @@
 maybe_chunked_encode(Data, false) ->
     Data;
 maybe_chunked_encode(Data, true) ->
-    [ibrowse_lib:dec2hex(4, size(to_binary(Data))), "\r\n", Data, "\r\n"].
+    [?dec2hex(size(to_binary(Data))), "\r\n", Data, "\r\n"].
 
 do_close(#state{socket = undefined})            ->  ok;
 do_close(#state{socket = Sock,
@@ -830,13 +821,14 @@
     Headers_0 = [Fun1(X) || X <- Headers],
     Headers_1 =
         case lists:keysearch("content-length", 1, Headers_0) of
-            false when (Body == [] orelse Body == <<>>) andalso
-                       (Method == post orelse Method == put) ->
+            false when (Body =:= [] orelse Body =:= <<>>) andalso
+                       (Method =:= post orelse Method =:= put) ->
                 [{"content-length", "Content-Length", "0"} | Headers_0];
             false when is_binary(Body) orelse is_list(Body) ->
                 [{"content-length", "Content-Length", integer_to_list(iolist_size(Body))} | Headers_0];
             _ ->
-                %% Content-Length is already specified or Body is a function or function/state pair
+                %% Content-Length is already specified or Body is a
+                %% function or function/state pair
                 Headers_0
         end,
     {Headers_2, Body_1} =
@@ -922,23 +914,23 @@
 chunk_request_body(Body, ChunkSize, Acc) when is_binary(Body),
                                               size(Body) >= ChunkSize ->
     <<ChunkBody:ChunkSize/binary, Rest/binary>> = Body,
-    Chunk = [ibrowse_lib:dec2hex(4, ChunkSize),"\r\n",
+    Chunk = [?dec2hex(ChunkSize),"\r\n",
              ChunkBody, "\r\n"],
     chunk_request_body(Rest, ChunkSize, [Chunk | Acc]);
 chunk_request_body(Body, _ChunkSize, Acc) when is_binary(Body) ->
     BodySize = size(Body),
-    Chunk = [ibrowse_lib:dec2hex(4, BodySize),"\r\n",
+    Chunk = [?dec2hex(BodySize),"\r\n",
              Body, "\r\n"],
     LastChunk = "0\r\n",
     lists:reverse(["\r\n", LastChunk, Chunk | Acc]);
 chunk_request_body(Body, ChunkSize, Acc) when length(Body) >= ChunkSize ->
     {ChunkBody, Rest} = split_list_at(Body, ChunkSize),
-    Chunk = [ibrowse_lib:dec2hex(4, ChunkSize),"\r\n",
+    Chunk = [?dec2hex(ChunkSize),"\r\n",
              ChunkBody, "\r\n"],
     chunk_request_body(Rest, ChunkSize, [Chunk | Acc]);
 chunk_request_body(Body, _ChunkSize, Acc) when is_list(Body) ->
     BodySize = length(Body),
-    Chunk = [ibrowse_lib:dec2hex(4, BodySize),"\r\n",
+    Chunk = [?dec2hex(BodySize),"\r\n",
              Body, "\r\n"],
     LastChunk = "0\r\n",
     lists:reverse(["\r\n", LastChunk, Chunk | Acc]).
diff --git a/src/ibrowse_lib.erl b/src/ibrowse_lib.erl
index c463c7b..696d0f6 100644
--- a/src/ibrowse_lib.erl
+++ b/src/ibrowse_lib.erl
@@ -19,9 +19,6 @@
          url_encode/1,
          decode_rfc822_date/1,
          status_code/1,
-         dec2hex/2,
-         drv_ue/1,
-         drv_ue/2,
          encode_base64/1,
          decode_base64/1,
          get_value/2,
@@ -33,17 +30,6 @@
 get_trace_status(Host, Port) ->
     ibrowse:get_config_value({trace, Host, Port}, false).
 
-drv_ue(Str) ->
-    [{port, Port}| _] = ets:lookup(ibrowse_table, port),
-    drv_ue(Str, Port).
-drv_ue(Str, Port) ->
-    case erlang:port_control(Port, 1, Str) of
-        [] ->
-            Str;
-        Res ->
-            Res
-    end.
-
 %% @doc URL-encodes a string based on RFC 1738. Returns a flat list.
 %% @spec url_encode(Str) -> UrlEncodedStr
 %% Str = string()
@@ -163,15 +149,6 @@
 status_code(X) when is_list(X) -> status_code(list_to_integer(X));
 status_code(_)   -> unknown_status_code.
 
-%% @doc dec2hex taken from gtk.erl in std dist
-%% M = integer() -- number of hex digits required
-%% N = integer() -- the number to represent as hex
-%% @spec dec2hex(M::integer(), N::integer()) -> string()
-dec2hex(M,N) -> dec2hex(M,N,[]).
-
-dec2hex(0,_N,Ack) -> Ack;
-dec2hex(M,N,Ack) -> dec2hex(M-1,N bsr 4,[d2h(N band 15)|Ack]).
-
 %% @doc Implements the base64 encoding algorithm. The output data type matches in the input data type.
 %% @spec encode_base64(In) -> Out
 %% In = string() | binary()
diff --git a/vsn.mk b/vsn.mk
index 9e6b36d..264a1a1 100644
--- a/vsn.mk
+++ b/vsn.mk
@@ -1,2 +1,2 @@
-IBROWSE_VSN = 2.1.0
+IBROWSE_VSN = 2.1.1