%% @author Bob Ippolito %% @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) -> case Request:get(version) of Version when Version >= {1, 1} -> Length = iolist_size(Data), send([io_lib:format("~.16b\r\n", [Length]), Data, <<"\r\n">>]); _ -> send(Data) end. %% %% Tests %% -include_lib("eunit/include/eunit.hrl"). -ifdef(TEST). -endif.