anchor.diff:  		["Connection:", "close"] ->
   		    parse_header(Socket, Timeout, SslOption,
   				 Header#header{connection = close});
  +		["Authorization:", Authorization] ->
  +		    parse_header(Socket, Timeout, SslOption,
  +				 Header#header{authorization = Authorization});
  +		["Cookie:", Cookie] ->
  +			Cookies = [ Cookie | Header#header.cookies ],
  +		    parse_header(Socket, Timeout, SslOption,
  +				 Header#header{cookies = Cookies});
   		_ ->
   		    parse_header(Socket, Timeout, SslOption, Header)
   	    end;
   	{error, Reason} -> {error, Reason}
       end.
   
  -handle_payload(Socket, KeepAlive, Timeout, SslOption, Header) ->
  -    case get_payload(Socket, Timeout, SslOption, Header#header.content_length) of
  +handle_payload(Socket, KeepAlive, Timeout, Options, Header) ->
  +    case get_payload(Socket, Timeout, Options, Header#header.content_length) of
   	{ok, Payload} ->
   	    ?DEBUG_LOG({encoded_response, Payload}),
   	    case xmlrpc_decode:payload(Payload) of
  -		{ok, DecodedPayload} when KeepAlive == false ->
  +		{ok, {response, DecodedPayload}} when KeepAlive == false ->
   		    ?DEBUG_LOG({decoded_response, DecodedPayload}),
  -		    comm_close(SslOption, Socket),
  -		    {ok, DecodedPayload};
  -		{ok, DecodedPayload} when KeepAlive == true,
  +		    comm_close(Options, Socket),
  +			case has_header_option(Options) of
  +				true ->
  +		    		{ok, {response, DecodedPayload, Header}};
  +				_ ->
  +		    		{ok, {response, DecodedPayload}}
  +			end;
  +		{ok, {response, DecodedPayload}} when KeepAlive == true,
   					  Header#header.connection == close ->
   		    ?DEBUG_LOG({decoded_response, DecodedPayload}),
  -		    comm_close(SslOption, Socket),
  -		    {ok, Socket, DecodedPayload};
  -		{ok, DecodedPayload} ->
  +		    comm_close(Options, Socket),
  +			case has_header_option(Options) of
  +				true ->
  +				    {ok, Socket, {response, DecodedPayload, Header}};
  +				_ ->
  +				    {ok, Socket, {response, DecodedPayload}}
  +			end;
  +		{ok, {response, DecodedPayload}} ->
   		    ?DEBUG_LOG({decoded_response, DecodedPayload}),
  -		    {ok, Socket, DecodedPayload};
  +			case has_header_option(Options) of
  +				true ->
  +				    {ok, Socket, {response, DecodedPayload, Header}};
  +				_ ->
  +				    {ok, Socket, {response, DecodedPayload}}
  +			end;
   		{error, Reason} when KeepAlive == false ->
  -		    comm_close(SslOption, Socket),
  +		    comm_close(Options, Socket),
   		    {error, Reason};
   		{error, Reason} when KeepAlive == true,
   				     Header#header.connection == close ->
  -		    comm_close(SslOption, Socket),
  +		    comm_close(Options, Socket),
   		    {error, Socket, Reason};
   		{error, Reason} ->
   		    {error, Socket, Reason}
  
positive.code: 		{error, Reason} -> {error, Reason}
  	end.
  
  fetch_comm_module(SslOption) ->
  	case lists:keyfind(ssl, 1, SslOption) of
  		{ssl, true} -> ssl;
  		{ssl, false} -> gen_tcp
  	end.
  
  fetch_sets_module(SslOption) ->
  	case lists:keyfind(ssl, 1, SslOption) of
  		{ssl, true} -> ssl;
  		{ssl, false} -> inet
  	end.
  
  comm_close(SslOption, Socket) ->
  	M = fetch_comm_module(SslOption),
  	apply(M, close, [ Socket ]).
  	
  parse_header(Socket, Timeout, SslOption) -> parse_header(Socket, Timeout, SslOption, #header{}).
  
negative.code: 	    {error, Reason};
  	{error, Reason} when KeepAlive == true,
  			     Header#header.connection == close ->
  	    comm_close(Options, Socket),
  	    {error, Socket, Reason};
  	{error, Reason} -> {error, Socket, Reason}
      end.
  