summaryrefslogtreecommitdiff
path: root/src/couch_inets/httpc_request.erl
diff options
context:
space:
mode:
authorChristopher Lenz <cmlenz@apache.org>2008-04-15 12:21:00 +0000
committerChristopher Lenz <cmlenz@apache.org>2008-04-15 12:21:00 +0000
commit39de3072bcf9fdeec6d3faeb125924c401242205 (patch)
treeda55307c8762f9ff16f7a7e478d971c0f352d281 /src/couch_inets/httpc_request.erl
parent53968ddfd93bfe1aa403478de715ae0ac77db177 (diff)
Merged mochiweb branch back into trunk.
git-svn-id: https://svn.apache.org/repos/asf/incubator/couchdb/trunk@648222 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/couch_inets/httpc_request.erl')
-rw-r--r--src/couch_inets/httpc_request.erl193
1 files changed, 0 insertions, 193 deletions
diff --git a/src/couch_inets/httpc_request.erl b/src/couch_inets/httpc_request.erl
deleted file mode 100644
index 1c74dc7b..00000000
--- a/src/couch_inets/httpc_request.erl
+++ /dev/null
@@ -1,193 +0,0 @@
-%% ``The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved via the world wide web at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
-%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
-%% AB. All Rights Reserved.''
-%%
-%% $Id$
-
--module(httpc_request).
-
--include("http_internal.hrl").
--include("httpc_internal.hrl").
-
-%% We will not make the change to use base64 in stdlib in inets just yet.
-%% it will be included in the next major release of inets.
--compile({nowarn_deprecated_function, {http_base_64, encode, 1}}).
-
-%%% Internal API
--export([send/3, is_idempotent/1, is_client_closing/1]).
-
-%%%=========================================================================
-%%% Internal application API
-%%%=========================================================================
-%%-------------------------------------------------------------------------
-%% send(MaybeProxy, Request) ->
-%% MaybeProxy - {Host, Port}
-%% Host = string()
-%% Port = integer()
-%% Request - #request{}
-%% Socket - socket()
-%% CookieSupport - enabled | disabled | verify
-%%
-%% Description: Composes and sends a HTTP-request.
-%%-------------------------------------------------------------------------
-send(SendAddr, #request{method = Method, scheme = Scheme,
- path = Path, pquery = Query, headers = Headers,
- content = Content, address = Address,
- abs_uri = AbsUri, headers_as_is = HeadersAsIs,
- settings = HttpOptions,
- userinfo = UserInfo},
- Socket) ->
-
- TmpHeaders = handle_user_info(UserInfo, Headers),
-
- {TmpHeaders2, Body} = post_data(Method, TmpHeaders, Content, HeadersAsIs),
-
- {NewHeaders, Uri} = case Address of
- SendAddr ->
- {TmpHeaders2, Path ++ Query};
- _Proxy ->
- TmpHeaders3 =
- handle_proxy(HttpOptions, TmpHeaders2),
- {TmpHeaders3, AbsUri}
- end,
-
- FinalHeaders = case NewHeaders of
- HeaderList when is_list(HeaderList) ->
- headers(HeaderList, []);
- _ ->
- http_request:http_headers(NewHeaders)
- end,
-
- Message =
- lists:append([method(Method), " ", Uri, " HTTP/1.1", ?CRLF,
- FinalHeaders, ?CRLF, Body]),
-
- http_transport:send(socket_type(Scheme), Socket, Message).
-
-%%-------------------------------------------------------------------------
-%% is_idempotent(Method) ->
-%% Method = atom()
-%%
-%% Description: Checks if Methode is considered idempotent.
-%%-------------------------------------------------------------------------
-
-%% In particular, the convention has been established that the GET and
-%% HEAD methods SHOULD NOT have the significance of taking an action
-%% other than retrieval. These methods ought to be considered "safe".
-is_idempotent(head) ->
- true;
-is_idempotent(get) ->
- true;
-%% Methods can also have the property of "idempotence" in that (aside
-%% from error or expiration issues) the side-effects of N > 0
-%% identical requests is the same as for a single request.
-is_idempotent(put) ->
- true;
-is_idempotent(delete) ->
- true;
-%% Also, the methods OPTIONS and TRACE SHOULD NOT have side effects,
-%% and so are inherently idempotent.
-is_idempotent(trace) ->
- true;
-is_idempotent(options) ->
- true;
-is_idempotent(_) ->
- false.
-
-%%-------------------------------------------------------------------------
-%% is_client_closing(Headers) ->
-%% Headers = #http_request_h{}
-%%
-%% Description: Checks if the client has supplied a "Connection: close" header.
-%%-------------------------------------------------------------------------
-is_client_closing(Headers) ->
- case Headers#http_request_h.connection of
- "close" ->
- true;
- _ ->
- false
- end.
-
-%%%========================================================================
-%%% Internal functions
-%%%========================================================================
-post_data(Method, Headers, {ContentType, Body}, HeadersAsIs)
- when Method == post; Method == put ->
- ContentLength = body_length(Body),
- NewBody = case Headers#http_request_h.expect of
- "100-continue" ->
- "";
- _ ->
- Body
- end,
-
- NewHeaders = case HeadersAsIs of
- [] ->
- Headers#http_request_h{'content-type' =
- ContentType,
- 'content-length' =
- ContentLength};
- _ ->
- HeadersAsIs
- end,
-
- {NewHeaders, NewBody};
-
-post_data(_, Headers, _, []) ->
- {Headers, ""};
-post_data(_, _, _, HeadersAsIs = [_|_]) ->
- {HeadersAsIs, ""}.
-
-body_length(Body) when is_binary(Body) ->
- integer_to_list(size(Body));
-
-body_length(Body) when is_list(Body) ->
- integer_to_list(length(Body)).
-
-method(Method) ->
- http_util:to_upper(atom_to_list(Method)).
-
-socket_type(http) ->
- ip_comm;
-socket_type(https) ->
- {ssl, []}.
-
-headers([], Headers) ->
- lists:flatten(Headers);
-headers([{Key,Value} | Rest], Headers) ->
- Header = Key ++ ": " ++ Value ++ ?CRLF,
- headers(Rest, [Header | Headers]).
-
-handle_proxy(_, Headers) when is_list(Headers) ->
- Headers; %% Headers as is option was specified
-handle_proxy(HttpOptions, Headers) ->
- case HttpOptions#http_options.proxy_auth of
- undefined ->
- Headers;
- {User, Password} ->
- UserPasswd = http_base_64:encode(User ++ ":" ++ Password),
- Headers#http_request_h{'proxy-authorization' =
- "Basic " ++ UserPasswd}
- end.
-
-handle_user_info([], Headers) ->
- Headers;
-handle_user_info(UserInfo, Headers) ->
- case string:tokens(UserInfo, ":") of
- [User, Passwd] ->
- UserPasswd = http_base_64:encode(User ++ ":" ++ Passwd),
- Headers#http_request_h{authorization = "Basic " ++ UserPasswd};
- _ ->
- Headers
- end.