provide_range_callback_h.erl 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. %% This module defines many callbacks relevant to range requests
  2. %% and return something different depending on query string.
  3. -module(provide_range_callback_h).
  4. -export([init/2]).
  5. -export([content_types_provided/2]).
  6. -export([ranges_provided/2]).
  7. -export([expires/2]).
  8. -export([generate_etag/2]).
  9. -export([last_modified/2]).
  10. -export([get_text_plain/2]).
  11. -export([get_text_plain_bytes/2]).
  12. init(Req, State) ->
  13. {cowboy_rest, Req, State}.
  14. content_types_provided(Req, State) ->
  15. {[
  16. {{<<"text">>, <<"plain">>, []}, get_text_plain},
  17. %% This one only exists so we generate a vary header.
  18. {{<<"text">>, <<"html">>, []}, get_text_html}
  19. ], Req, State}.
  20. ranges_provided(Req, State) ->
  21. {[{<<"bytes">>, get_text_plain_bytes}], Req, State}.
  22. generate_etag(Req=#{qs := <<"weak-etag">>}, State) ->
  23. {{weak, <<"weak-no-match">>}, Req, State};
  24. generate_etag(Req, State) ->
  25. {{strong, <<"strong-and-match">>}, Req, State}.
  26. last_modified(Req, State) ->
  27. {{{2222, 2, 22}, {11, 11, 11}}, Req, State}.
  28. expires(Req, State) ->
  29. {{{3333, 3, 3}, {11, 11, 11}}, Req, State}.
  30. get_text_plain(Req, State) ->
  31. {<<"This is REST!">>, Req, State}.
  32. %% Simulate the callback being missing, otherwise expect true/false.
  33. get_text_plain_bytes(#{qs := <<"missing">>}, _) ->
  34. ct_helper_error_h:ignore(cowboy_rest, set_ranged_body_callback, 3),
  35. no_call;
  36. get_text_plain_bytes(Req=#{range := {_, [{From=0, infinity}]}}, State) ->
  37. %% We send everything in one part.
  38. Body = <<"This is ranged REST!">>,
  39. Total = byte_size(Body),
  40. {[{{From, Total - 1, Total}, Body}], Req, State};
  41. get_text_plain_bytes(Req=#{range := {_, Range}}, State) ->
  42. %% We check the range header we get and send everything hardcoded.
  43. [
  44. {0, 3},
  45. {5, 6},
  46. {8, 13},
  47. {15, infinity}
  48. ] = Range,
  49. Body = <<"This is ranged REST!">>,
  50. Total = byte_size(Body),
  51. {[
  52. {{0, 3, Total}, <<"This">>},
  53. {{5, 6, Total}, <<"is">>},
  54. {{8, 13, Total}, <<"ranged">>},
  55. {{15, 19, Total}, <<"REST!">>}
  56. ], Req, State}.