%% Licensed under the Apache License, Version 2.0 (the "License"); you may not
%% use this file except in compliance with the License. You may obtain a copy of
%% the License at
%%
%%   http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
%% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
%% License for the specific language governing permissions and limitations under
%% the License.

-module(mock_request, [Socket, Method, RawPath, Version, Headers]).

-compile(export_all).

get_header_value(_) ->
    undefined.

parse_qs() ->
    [].

get(method) ->
    Method;
get(raw_path) ->
    RawPath;
get(version) ->
    Version.

should_close() ->
    false.

respond({Code, ResponseHeaders, _}) ->
    mochiweb:new_response({THIS, Code, ResponseHeaders}).

send(_) ->
    ok.
