From 29043aa7b4d11e377bc76d453f592ea5a6df1f43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Wed, 7 Nov 2018 18:55:06 +0100 Subject: Add support for range requests (RFC7233) in cowboy_rest This is currently undocumented but is planned to be documented in the next version. --- test/handlers/provide_range_callback_h.erl | 66 ++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 test/handlers/provide_range_callback_h.erl (limited to 'test/handlers/provide_range_callback_h.erl') diff --git a/test/handlers/provide_range_callback_h.erl b/test/handlers/provide_range_callback_h.erl new file mode 100644 index 0000000..f14a544 --- /dev/null +++ b/test/handlers/provide_range_callback_h.erl @@ -0,0 +1,66 @@ +%% This module defines the range_satisfiable callback +%% and return something different depending on query string. + +-module(provide_range_callback_h). + +-export([init/2]). +-export([content_types_provided/2]). +-export([ranges_provided/2]). +-export([expires/2]). +-export([generate_etag/2]). +-export([last_modified/2]). +-export([get_text_plain/2]). +-export([get_text_plain_bytes/2]). + +init(Req, State) -> + {cowboy_rest, Req, State}. + +content_types_provided(Req, State) -> + {[ + {{<<"text">>, <<"plain">>, []}, get_text_plain}, + %% This one only exists so we generate a vary header. + {{<<"text">>, <<"html">>, []}, get_text_html} + ], Req, State}. + +ranges_provided(Req, State) -> + {[{<<"bytes">>, get_text_plain_bytes}], Req, State}. + +generate_etag(Req=#{qs := <<"weak-etag">>}, State) -> + {{weak, <<"weak-no-match">>}, Req, State}; +generate_etag(Req, State) -> + {{strong, <<"strong-and-match">>}, Req, State}. + +last_modified(Req, State) -> + {{{2222, 2, 22}, {11, 11, 11}}, Req, State}. + +expires(Req, State) -> + {{{3333, 3, 3}, {11, 11, 11}}, Req, State}. + +get_text_plain(Req, State) -> + {<<"This is REST!">>, Req, State}. + +%% Simulate the callback being missing, otherwise expect true/false. +get_text_plain_bytes(#{qs := <<"missing">>}, _) -> + ct_helper_error_h:ignore(cowboy_rest, set_ranged_body, 3), + no_call; +get_text_plain_bytes(Req=#{range := {_, [{From=0, infinity}]}}, State) -> + %% We send everything in one part. + Body = <<"This is ranged REST!">>, + Total = byte_size(Body), + {[{{From, Total - 1, Total}, Body}], Req, State}; +get_text_plain_bytes(Req=#{range := {_, Range}}, State) -> + %% We check the range header we get and send everything hardcoded. + [ + {0, 3}, + {5, 6}, + {8, 13}, + {15, infinity} + ] = Range, + Body = <<"This is ranged REST!">>, + Total = byte_size(Body), + {[ + {{0, 3, Total}, <<"This">>}, + {{5, 6, Total}, <<"is">>}, + {{8, 13, Total}, <<"ranged">>}, + {{15, 19, Total}, <<"REST!">>} + ], Req, State}. -- cgit v1.2.3