summaryrefslogtreecommitdiff
path: root/src/mochiweb/mochiweb_response.erl
blob: 87917c405712b43df7ddcf368354ff48afd532fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
%% @author Bob Ippolito <bob@mochimedia.com>
%% @copyright 2007 Mochi Media, Inc.

%% @doc Response abstraction.

-module(mochiweb_response, [Request, Code, Headers]).
-author('bob@mochimedia.com').

-define(QUIP, "Any of you quaids got a smint?").

-export([get_header_value/1, get/1, dump/0]).
-export([send/1, write_chunk/1]).

%% @spec get_header_value(string() | atom() | binary()) -> string() | undefined
%% @doc Get the value of the given response header.
get_header_value(K) ->
    mochiweb_headers:get_value(K, Headers).

%% @spec get(request | code | headers) -> term()
%% @doc Return the internal representation of the given field.
get(request) ->
    Request;
get(code) ->
    Code;
get(headers) ->
    Headers.

%% @spec dump() -> {mochiweb_request, [{atom(), term()}]}
%% @doc Dump the internal representation to a "human readable" set of terms
%%      for debugging/inspection purposes.
dump() ->
    [{request, Request:dump()},
     {code, Code},
     {headers, mochiweb_headers:to_list(Headers)}].

%% @spec send(iodata()) -> ok
%% @doc Send data over the socket if the method is not HEAD.
send(Data) ->
    case Request:get(method) of
	'HEAD' ->
	    ok;
	_ ->
	    Request:send(Data)
    end.

%% @spec write_chunk(iodata()) -> ok
%% @doc Write a chunk of a HTTP chunked response. If Data is zero length,
%%      then the chunked response will be finished.
write_chunk(Data) ->
    Length = iolist_size(Data),    
    send(io_lib:format("~.16b\r\n", [Length])),
    send([Data, <<"\r\n">>]).