cow_hpack.erl 79 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300
  1. %% Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
  2. %%
  3. %% Permission to use, copy, modify, and/or distribute this software for any
  4. %% purpose with or without fee is hereby granted, provided that the above
  5. %% copyright notice and this permission notice appear in all copies.
  6. %%
  7. %% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. %% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. %% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  10. %% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. %% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  12. %% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  13. %% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  14. %% The current implementation is not suitable for use in
  15. %% intermediaries as the information about headers that
  16. %% should never be indexed is currently lost.
  17. -module(cow_hpack).
  18. -export([init/0]).
  19. -export([init/1]).
  20. -export([decode/1]).
  21. -export([decode/2]).
  22. -export([decode/3]).
  23. -export([encode/1]).
  24. -export([encode/2]).
  25. -export([encode/3]).
  26. -record(state, {
  27. size = 0 :: non_neg_integer(),
  28. max_size = 4096 :: non_neg_integer(),
  29. dyn_table = [] :: [{pos_integer(), {binary(), binary()}}]
  30. }).
  31. -opaque state() :: #state{}.
  32. -export_type([state/0]).
  33. -type opts() :: map().
  34. -export_type([opts/0]).
  35. -ifdef(TEST).
  36. -include_lib("triq/include/triq.hrl").
  37. -endif.
  38. %% State initialization.
  39. -spec init() -> state().
  40. init() ->
  41. #state{}.
  42. -spec init(non_neg_integer()) -> state().
  43. init(MaxSize) ->
  44. #state{max_size=MaxSize}.
  45. %% Decoding.
  46. -spec decode(binary()) -> {cow_http:headers(), state()}.
  47. decode(Data) ->
  48. decode(Data, init(), #{}).
  49. -spec decode(binary(), State) -> {cow_http:headers(), State} when State::state().
  50. decode(Data, State) ->
  51. decode(Data, State, #{}).
  52. -spec decode(binary(), State, opts()) -> {cow_http:headers(), State} when State::state().
  53. decode(Data, State, Opts) ->
  54. decode(Data, State, Opts, []).
  55. decode(<<>>, State, _, Acc) ->
  56. {lists:reverse(Acc), State};
  57. %% Indexed header field representation.
  58. decode(<< 1:1, Rest/bits >>, State, Opts, Acc) ->
  59. dec_indexed(Rest, State, Opts, Acc);
  60. %% Literal header field with incremental indexing: new name.
  61. decode(<< 0:1, 1:1, 0:6, Rest/bits >>, State, Opts, Acc) ->
  62. dec_lit_index_new_name(Rest, State, Opts, Acc);
  63. %% Literal header field with incremental indexing: indexed name.
  64. decode(<< 0:1, 1:1, Rest/bits >>, State, Opts, Acc) ->
  65. dec_lit_index_indexed_name(Rest, State, Opts, Acc);
  66. %% Literal header field without indexing: new name.
  67. decode(<< 0:8, Rest/bits >>, State, Opts, Acc) ->
  68. dec_lit_no_index_new_name(Rest, State, Opts, Acc);
  69. %% Literal header field without indexing: indexed name.
  70. decode(<< 0:4, Rest/bits >>, State, Opts, Acc) ->
  71. dec_lit_no_index_indexed_name(Rest, State, Opts, Acc);
  72. %% Literal header field never indexed: new name.
  73. %% @todo Keep track of "never indexed" headers.
  74. decode(<< 0:3, 1:1, 0:4, Rest/bits >>, State, Opts, Acc) ->
  75. dec_lit_no_index_new_name(Rest, State, Opts, Acc);
  76. %% Literal header field never indexed: indexed name.
  77. %% @todo Keep track of "never indexed" headers.
  78. decode(<< 0:3, 1:1, Rest/bits >>, State, Opts, Acc) ->
  79. dec_lit_no_index_indexed_name(Rest, State, Opts, Acc);
  80. %% Dynamic table size update.
  81. decode(<< 0:2, 1:1, Rest/bits >>, State, Opts, Acc) ->
  82. dec_table_size_update(Rest, State, Opts, Acc).
  83. %% Indexed header field representation.
  84. dec_indexed(Rest, State, Opts, Acc) ->
  85. {Index, Rest2} = dec_int7(Rest),
  86. {Name, Value} = table_get(Index, State),
  87. decode(Rest2, State, Opts, [{Name, Value}|Acc]).
  88. %% Literal header field with incremental indexing.
  89. dec_lit_index_new_name(Rest, State, Opts, Acc) ->
  90. {Name, Rest2} = dec_str(Rest),
  91. dec_lit_index(Rest2, State, Opts, Acc, Name).
  92. dec_lit_index_indexed_name(Rest, State, Opts, Acc) ->
  93. {Index, Rest2} = dec_int6(Rest),
  94. Name = table_get_name(Index, State),
  95. dec_lit_index(Rest2, State, Opts, Acc, Name).
  96. dec_lit_index(Rest, State, Opts, Acc, Name) ->
  97. {Value, Rest2} = dec_str(Rest),
  98. State2 = table_insert({Name, Value}, State),
  99. decode(Rest2, State2, Opts, [{Name, Value}|Acc]).
  100. %% Literal header field without indexing.
  101. dec_lit_no_index_new_name(Rest, State, Opts, Acc) ->
  102. {Name, Rest2} = dec_str(Rest),
  103. dec_lit_no_index(Rest2, State, Opts, Acc, Name).
  104. dec_lit_no_index_indexed_name(Rest, State, Opts, Acc) ->
  105. {Index, Rest2} = dec_int4(Rest),
  106. Name = table_get_name(Index, State),
  107. dec_lit_no_index(Rest2, State, Opts, Acc, Name).
  108. dec_lit_no_index(Rest, State, Opts, Acc, Name) ->
  109. {Value, Rest2} = dec_str(Rest),
  110. decode(Rest2, State, Opts, [{Name, Value}|Acc]).
  111. %% @todo Literal header field never indexed.
  112. %% Dynamic table size update.
  113. dec_table_size_update(Rest, State, Opts, Acc) ->
  114. {MaxSize, Rest2} = dec_int5(Rest),
  115. State2 = table_update_size(MaxSize, State),
  116. decode(Rest2, State2, Opts, Acc).
  117. %% Decode an integer.
  118. %% The HPACK format has 4 different integer prefixes length (from 4 to 7)
  119. %% and each can be used to create an indefinite length integer if all bits
  120. %% of the prefix are set to 1.
  121. dec_int4(<< 2#1111:4, Rest/bits >>) ->
  122. dec_big_int(Rest, 15, 0);
  123. dec_int4(<< Int:4, Rest/bits >>) ->
  124. {Int, Rest}.
  125. dec_int5(<< 2#11111:5, Rest/bits >>) ->
  126. dec_big_int(Rest, 31, 0);
  127. dec_int5(<< Int:5, Rest/bits >>) ->
  128. {Int, Rest}.
  129. dec_int6(<< 2#111111:6, Rest/bits >>) ->
  130. dec_big_int(Rest, 63, 0);
  131. dec_int6(<< Int:6, Rest/bits >>) ->
  132. {Int, Rest}.
  133. dec_int7(<< 2#1111111:7, Rest/bits >>) ->
  134. dec_big_int(Rest, 127, 0);
  135. dec_int7(<< Int:7, Rest/bits >>) ->
  136. {Int, Rest}.
  137. dec_big_int(<< 0:1, Value:7, Rest/bits >>, Int, M) ->
  138. {Int + (Value bsl M), Rest};
  139. dec_big_int(<< 1:1, Value:7, Rest/bits >>, Int, M) ->
  140. dec_big_int(Rest, Int + (Value bsl M), M + 7).
  141. %% Decode a string.
  142. dec_str(<< 0:1, Rest/bits >>) ->
  143. {Length, Rest2} = dec_int7(Rest),
  144. << Str:Length/binary, Rest3/bits >> = Rest2,
  145. {Str, Rest3};
  146. dec_str(<< 1:1, Rest/bits >>) ->
  147. {Length, Rest2} = dec_int7(Rest),
  148. dec_huffman(Rest2, Length * 8, <<>>).
  149. %% HPACK uses a static code table for Huffman encoded strings.
  150. %% It has been converted into one clause per code in the following function.
  151. %% EOS.
  152. dec_huffman(Rest, 0, String) -> {String, Rest};
  153. dec_huffman(<<2#1:1, Rest/bits>>, 1, String) -> {String, Rest};
  154. dec_huffman(<<2#11:2, Rest/bits>>, 2, String) -> {String, Rest};
  155. dec_huffman(<<2#111:3, Rest/bits>>, 3, String) -> {String, Rest};
  156. dec_huffman(<<2#1111:4, Rest/bits>>, 4, String) -> {String, Rest};
  157. dec_huffman(<<2#11111:5, Rest/bits>>, 5, String) -> {String, Rest};
  158. dec_huffman(<<2#111111:6, Rest/bits>>, 6, String) -> {String, Rest};
  159. dec_huffman(<<2#1111111:7, Rest/bits>>, 7, String) -> {String, Rest};
  160. %% Static code table.
  161. dec_huffman(<<2#00000:5, R/bits>>, L, A) -> dec_huffman(R, L - 5, <<A/binary, 48>>);
  162. dec_huffman(<<2#00001:5, R/bits>>, L, A) -> dec_huffman(R, L - 5, <<A/binary, 49>>);
  163. dec_huffman(<<2#00010:5, R/bits>>, L, A) -> dec_huffman(R, L - 5, <<A/binary, 50>>);
  164. dec_huffman(<<2#00011:5, R/bits>>, L, A) -> dec_huffman(R, L - 5, <<A/binary, 97>>);
  165. dec_huffman(<<2#00100:5, R/bits>>, L, A) -> dec_huffman(R, L - 5, <<A/binary, 99>>);
  166. dec_huffman(<<2#00101:5, R/bits>>, L, A) -> dec_huffman(R, L - 5, <<A/binary, 101>>);
  167. dec_huffman(<<2#00110:5, R/bits>>, L, A) -> dec_huffman(R, L - 5, <<A/binary, 105>>);
  168. dec_huffman(<<2#00111:5, R/bits>>, L, A) -> dec_huffman(R, L - 5, <<A/binary, 111>>);
  169. dec_huffman(<<2#01000:5, R/bits>>, L, A) -> dec_huffman(R, L - 5, <<A/binary, 115>>);
  170. dec_huffman(<<2#01001:5, R/bits>>, L, A) -> dec_huffman(R, L - 5, <<A/binary, 116>>);
  171. dec_huffman(<<2#010100:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 32>>);
  172. dec_huffman(<<2#010101:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 37>>);
  173. dec_huffman(<<2#010110:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 45>>);
  174. dec_huffman(<<2#010111:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 46>>);
  175. dec_huffman(<<2#011000:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 47>>);
  176. dec_huffman(<<2#011001:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 51>>);
  177. dec_huffman(<<2#011010:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 52>>);
  178. dec_huffman(<<2#011011:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 53>>);
  179. dec_huffman(<<2#011100:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 54>>);
  180. dec_huffman(<<2#011101:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 55>>);
  181. dec_huffman(<<2#011110:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 56>>);
  182. dec_huffman(<<2#011111:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 57>>);
  183. dec_huffman(<<2#100000:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 61>>);
  184. dec_huffman(<<2#100001:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 65>>);
  185. dec_huffman(<<2#100010:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 95>>);
  186. dec_huffman(<<2#100011:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 98>>);
  187. dec_huffman(<<2#100100:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 100>>);
  188. dec_huffman(<<2#100101:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 102>>);
  189. dec_huffman(<<2#100110:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 103>>);
  190. dec_huffman(<<2#100111:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 104>>);
  191. dec_huffman(<<2#101000:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 108>>);
  192. dec_huffman(<<2#101001:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 109>>);
  193. dec_huffman(<<2#101010:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 110>>);
  194. dec_huffman(<<2#101011:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 112>>);
  195. dec_huffman(<<2#101100:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 114>>);
  196. dec_huffman(<<2#101101:6, R/bits>>, L, A) -> dec_huffman(R, L - 6, <<A/binary, 117>>);
  197. dec_huffman(<<2#1011100:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 58>>);
  198. dec_huffman(<<2#1011101:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 66>>);
  199. dec_huffman(<<2#1011110:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 67>>);
  200. dec_huffman(<<2#1011111:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 68>>);
  201. dec_huffman(<<2#1100000:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 69>>);
  202. dec_huffman(<<2#1100001:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 70>>);
  203. dec_huffman(<<2#1100010:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 71>>);
  204. dec_huffman(<<2#1100011:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 72>>);
  205. dec_huffman(<<2#1100100:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 73>>);
  206. dec_huffman(<<2#1100101:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 74>>);
  207. dec_huffman(<<2#1100110:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 75>>);
  208. dec_huffman(<<2#1100111:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 76>>);
  209. dec_huffman(<<2#1101000:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 77>>);
  210. dec_huffman(<<2#1101001:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 78>>);
  211. dec_huffman(<<2#1101010:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 79>>);
  212. dec_huffman(<<2#1101011:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 80>>);
  213. dec_huffman(<<2#1101100:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 81>>);
  214. dec_huffman(<<2#1101101:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 82>>);
  215. dec_huffman(<<2#1101110:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 83>>);
  216. dec_huffman(<<2#1101111:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 84>>);
  217. dec_huffman(<<2#1110000:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 85>>);
  218. dec_huffman(<<2#1110001:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 86>>);
  219. dec_huffman(<<2#1110010:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 87>>);
  220. dec_huffman(<<2#1110011:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 89>>);
  221. dec_huffman(<<2#1110100:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 106>>);
  222. dec_huffman(<<2#1110101:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 107>>);
  223. dec_huffman(<<2#1110110:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 113>>);
  224. dec_huffman(<<2#1110111:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 118>>);
  225. dec_huffman(<<2#1111000:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 119>>);
  226. dec_huffman(<<2#1111001:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 120>>);
  227. dec_huffman(<<2#1111010:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 121>>);
  228. dec_huffman(<<2#1111011:7, R/bits>>, L, A) -> dec_huffman(R, L - 7, <<A/binary, 122>>);
  229. dec_huffman(<<2#11111000:8, R/bits>>, L, A) -> dec_huffman(R, L - 8, <<A/binary, 38>>);
  230. dec_huffman(<<2#11111001:8, R/bits>>, L, A) -> dec_huffman(R, L - 8, <<A/binary, 42>>);
  231. dec_huffman(<<2#11111010:8, R/bits>>, L, A) -> dec_huffman(R, L - 8, <<A/binary, 44>>);
  232. dec_huffman(<<2#11111011:8, R/bits>>, L, A) -> dec_huffman(R, L - 8, <<A/binary, 59>>);
  233. dec_huffman(<<2#11111100:8, R/bits>>, L, A) -> dec_huffman(R, L - 8, <<A/binary, 88>>);
  234. dec_huffman(<<2#11111101:8, R/bits>>, L, A) -> dec_huffman(R, L - 8, <<A/binary, 90>>);
  235. dec_huffman(<<2#1111111000:10, R/bits>>, L, A) -> dec_huffman(R, L - 10, <<A/binary, 33>>);
  236. dec_huffman(<<2#1111111001:10, R/bits>>, L, A) -> dec_huffman(R, L - 10, <<A/binary, 34>>);
  237. dec_huffman(<<2#1111111010:10, R/bits>>, L, A) -> dec_huffman(R, L - 10, <<A/binary, 40>>);
  238. dec_huffman(<<2#1111111011:10, R/bits>>, L, A) -> dec_huffman(R, L - 10, <<A/binary, 41>>);
  239. dec_huffman(<<2#1111111100:10, R/bits>>, L, A) -> dec_huffman(R, L - 10, <<A/binary, 63>>);
  240. dec_huffman(<<2#11111111010:11, R/bits>>, L, A) -> dec_huffman(R, L - 11, <<A/binary, 39>>);
  241. dec_huffman(<<2#11111111011:11, R/bits>>, L, A) -> dec_huffman(R, L - 11, <<A/binary, 43>>);
  242. dec_huffman(<<2#11111111100:11, R/bits>>, L, A) -> dec_huffman(R, L - 11, <<A/binary, 124>>);
  243. dec_huffman(<<2#111111111010:12, R/bits>>, L, A) -> dec_huffman(R, L - 12, <<A/binary, 35>>);
  244. dec_huffman(<<2#111111111011:12, R/bits>>, L, A) -> dec_huffman(R, L - 12, <<A/binary, 62>>);
  245. dec_huffman(<<2#1111111111000:13, R/bits>>, L, A) -> dec_huffman(R, L - 13, <<A/binary, 0>>);
  246. dec_huffman(<<2#1111111111001:13, R/bits>>, L, A) -> dec_huffman(R, L - 13, <<A/binary, 36>>);
  247. dec_huffman(<<2#1111111111010:13, R/bits>>, L, A) -> dec_huffman(R, L - 13, <<A/binary, 64>>);
  248. dec_huffman(<<2#1111111111011:13, R/bits>>, L, A) -> dec_huffman(R, L - 13, <<A/binary, 91>>);
  249. dec_huffman(<<2#1111111111100:13, R/bits>>, L, A) -> dec_huffman(R, L - 13, <<A/binary, 93>>);
  250. dec_huffman(<<2#1111111111101:13, R/bits>>, L, A) -> dec_huffman(R, L - 13, <<A/binary, 126>>);
  251. dec_huffman(<<2#11111111111100:14, R/bits>>, L, A) -> dec_huffman(R, L - 14, <<A/binary, 94>>);
  252. dec_huffman(<<2#11111111111101:14, R/bits>>, L, A) -> dec_huffman(R, L - 14, <<A/binary, 125>>);
  253. dec_huffman(<<2#111111111111100:15, R/bits>>, L, A) -> dec_huffman(R, L - 15, <<A/binary, 60>>);
  254. dec_huffman(<<2#111111111111101:15, R/bits>>, L, A) -> dec_huffman(R, L - 15, <<A/binary, 96>>);
  255. dec_huffman(<<2#111111111111110:15, R/bits>>, L, A) -> dec_huffman(R, L - 15, <<A/binary, 123>>);
  256. dec_huffman(<<2#1111111111111110000:19, R/bits>>, L, A) -> dec_huffman(R, L - 19, <<A/binary, 92>>);
  257. dec_huffman(<<2#1111111111111110001:19, R/bits>>, L, A) -> dec_huffman(R, L - 19, <<A/binary, 195>>);
  258. dec_huffman(<<2#1111111111111110010:19, R/bits>>, L, A) -> dec_huffman(R, L - 19, <<A/binary, 208>>);
  259. dec_huffman(<<2#11111111111111100110:20, R/bits>>, L, A) -> dec_huffman(R, L - 20, <<A/binary, 128>>);
  260. dec_huffman(<<2#11111111111111100111:20, R/bits>>, L, A) -> dec_huffman(R, L - 20, <<A/binary, 130>>);
  261. dec_huffman(<<2#11111111111111101000:20, R/bits>>, L, A) -> dec_huffman(R, L - 20, <<A/binary, 131>>);
  262. dec_huffman(<<2#11111111111111101001:20, R/bits>>, L, A) -> dec_huffman(R, L - 20, <<A/binary, 162>>);
  263. dec_huffman(<<2#11111111111111101010:20, R/bits>>, L, A) -> dec_huffman(R, L - 20, <<A/binary, 184>>);
  264. dec_huffman(<<2#11111111111111101011:20, R/bits>>, L, A) -> dec_huffman(R, L - 20, <<A/binary, 194>>);
  265. dec_huffman(<<2#11111111111111101100:20, R/bits>>, L, A) -> dec_huffman(R, L - 20, <<A/binary, 224>>);
  266. dec_huffman(<<2#11111111111111101101:20, R/bits>>, L, A) -> dec_huffman(R, L - 20, <<A/binary, 226>>);
  267. dec_huffman(<<2#111111111111111011100:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 153>>);
  268. dec_huffman(<<2#111111111111111011101:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 161>>);
  269. dec_huffman(<<2#111111111111111011110:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 167>>);
  270. dec_huffman(<<2#111111111111111011111:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 172>>);
  271. dec_huffman(<<2#111111111111111100000:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 176>>);
  272. dec_huffman(<<2#111111111111111100001:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 177>>);
  273. dec_huffman(<<2#111111111111111100010:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 179>>);
  274. dec_huffman(<<2#111111111111111100011:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 209>>);
  275. dec_huffman(<<2#111111111111111100100:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 216>>);
  276. dec_huffman(<<2#111111111111111100101:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 217>>);
  277. dec_huffman(<<2#111111111111111100110:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 227>>);
  278. dec_huffman(<<2#111111111111111100111:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 229>>);
  279. dec_huffman(<<2#111111111111111101000:21, R/bits>>, L, A) -> dec_huffman(R, L - 21, <<A/binary, 230>>);
  280. dec_huffman(<<2#1111111111111111010010:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 129>>);
  281. dec_huffman(<<2#1111111111111111010011:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 132>>);
  282. dec_huffman(<<2#1111111111111111010100:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 133>>);
  283. dec_huffman(<<2#1111111111111111010101:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 134>>);
  284. dec_huffman(<<2#1111111111111111010110:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 136>>);
  285. dec_huffman(<<2#1111111111111111010111:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 146>>);
  286. dec_huffman(<<2#1111111111111111011000:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 154>>);
  287. dec_huffman(<<2#1111111111111111011001:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 156>>);
  288. dec_huffman(<<2#1111111111111111011010:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 160>>);
  289. dec_huffman(<<2#1111111111111111011011:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 163>>);
  290. dec_huffman(<<2#1111111111111111011100:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 164>>);
  291. dec_huffman(<<2#1111111111111111011101:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 169>>);
  292. dec_huffman(<<2#1111111111111111011110:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 170>>);
  293. dec_huffman(<<2#1111111111111111011111:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 173>>);
  294. dec_huffman(<<2#1111111111111111100000:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 178>>);
  295. dec_huffman(<<2#1111111111111111100001:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 181>>);
  296. dec_huffman(<<2#1111111111111111100010:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 185>>);
  297. dec_huffman(<<2#1111111111111111100011:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 186>>);
  298. dec_huffman(<<2#1111111111111111100100:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 187>>);
  299. dec_huffman(<<2#1111111111111111100101:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 189>>);
  300. dec_huffman(<<2#1111111111111111100110:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 190>>);
  301. dec_huffman(<<2#1111111111111111100111:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 196>>);
  302. dec_huffman(<<2#1111111111111111101000:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 198>>);
  303. dec_huffman(<<2#1111111111111111101001:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 228>>);
  304. dec_huffman(<<2#1111111111111111101010:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 232>>);
  305. dec_huffman(<<2#1111111111111111101011:22, R/bits>>, L, A) -> dec_huffman(R, L - 22, <<A/binary, 233>>);
  306. dec_huffman(<<2#11111111111111111011000:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 1>>);
  307. dec_huffman(<<2#11111111111111111011001:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 135>>);
  308. dec_huffman(<<2#11111111111111111011010:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 137>>);
  309. dec_huffman(<<2#11111111111111111011011:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 138>>);
  310. dec_huffman(<<2#11111111111111111011100:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 139>>);
  311. dec_huffman(<<2#11111111111111111011101:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 140>>);
  312. dec_huffman(<<2#11111111111111111011110:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 141>>);
  313. dec_huffman(<<2#11111111111111111011111:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 143>>);
  314. dec_huffman(<<2#11111111111111111100000:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 147>>);
  315. dec_huffman(<<2#11111111111111111100001:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 149>>);
  316. dec_huffman(<<2#11111111111111111100010:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 150>>);
  317. dec_huffman(<<2#11111111111111111100011:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 151>>);
  318. dec_huffman(<<2#11111111111111111100100:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 152>>);
  319. dec_huffman(<<2#11111111111111111100101:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 155>>);
  320. dec_huffman(<<2#11111111111111111100110:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 157>>);
  321. dec_huffman(<<2#11111111111111111100111:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 158>>);
  322. dec_huffman(<<2#11111111111111111101000:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 165>>);
  323. dec_huffman(<<2#11111111111111111101001:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 166>>);
  324. dec_huffman(<<2#11111111111111111101010:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 168>>);
  325. dec_huffman(<<2#11111111111111111101011:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 174>>);
  326. dec_huffman(<<2#11111111111111111101100:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 175>>);
  327. dec_huffman(<<2#11111111111111111101101:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 180>>);
  328. dec_huffman(<<2#11111111111111111101110:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 182>>);
  329. dec_huffman(<<2#11111111111111111101111:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 183>>);
  330. dec_huffman(<<2#11111111111111111110000:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 188>>);
  331. dec_huffman(<<2#11111111111111111110001:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 191>>);
  332. dec_huffman(<<2#11111111111111111110010:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 197>>);
  333. dec_huffman(<<2#11111111111111111110011:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 231>>);
  334. dec_huffman(<<2#11111111111111111110100:23, R/bits>>, L, A) -> dec_huffman(R, L - 23, <<A/binary, 239>>);
  335. dec_huffman(<<2#111111111111111111101010:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 9>>);
  336. dec_huffman(<<2#111111111111111111101011:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 142>>);
  337. dec_huffman(<<2#111111111111111111101100:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 144>>);
  338. dec_huffman(<<2#111111111111111111101101:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 145>>);
  339. dec_huffman(<<2#111111111111111111101110:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 148>>);
  340. dec_huffman(<<2#111111111111111111101111:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 159>>);
  341. dec_huffman(<<2#111111111111111111110000:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 171>>);
  342. dec_huffman(<<2#111111111111111111110001:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 206>>);
  343. dec_huffman(<<2#111111111111111111110010:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 215>>);
  344. dec_huffman(<<2#111111111111111111110011:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 225>>);
  345. dec_huffman(<<2#111111111111111111110100:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 236>>);
  346. dec_huffman(<<2#111111111111111111110101:24, R/bits>>, L, A) -> dec_huffman(R, L - 24, <<A/binary, 237>>);
  347. dec_huffman(<<2#1111111111111111111101100:25, R/bits>>, L, A) -> dec_huffman(R, L - 25, <<A/binary, 199>>);
  348. dec_huffman(<<2#1111111111111111111101101:25, R/bits>>, L, A) -> dec_huffman(R, L - 25, <<A/binary, 207>>);
  349. dec_huffman(<<2#1111111111111111111101110:25, R/bits>>, L, A) -> dec_huffman(R, L - 25, <<A/binary, 234>>);
  350. dec_huffman(<<2#1111111111111111111101111:25, R/bits>>, L, A) -> dec_huffman(R, L - 25, <<A/binary, 235>>);
  351. dec_huffman(<<2#11111111111111111111100000:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 192>>);
  352. dec_huffman(<<2#11111111111111111111100001:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 193>>);
  353. dec_huffman(<<2#11111111111111111111100010:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 200>>);
  354. dec_huffman(<<2#11111111111111111111100011:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 201>>);
  355. dec_huffman(<<2#11111111111111111111100100:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 202>>);
  356. dec_huffman(<<2#11111111111111111111100101:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 205>>);
  357. dec_huffman(<<2#11111111111111111111100110:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 210>>);
  358. dec_huffman(<<2#11111111111111111111100111:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 213>>);
  359. dec_huffman(<<2#11111111111111111111101000:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 218>>);
  360. dec_huffman(<<2#11111111111111111111101001:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 219>>);
  361. dec_huffman(<<2#11111111111111111111101010:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 238>>);
  362. dec_huffman(<<2#11111111111111111111101011:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 240>>);
  363. dec_huffman(<<2#11111111111111111111101100:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 242>>);
  364. dec_huffman(<<2#11111111111111111111101101:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 243>>);
  365. dec_huffman(<<2#11111111111111111111101110:26, R/bits>>, L, A) -> dec_huffman(R, L - 26, <<A/binary, 255>>);
  366. dec_huffman(<<2#111111111111111111111011110:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 203>>);
  367. dec_huffman(<<2#111111111111111111111011111:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 204>>);
  368. dec_huffman(<<2#111111111111111111111100000:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 211>>);
  369. dec_huffman(<<2#111111111111111111111100001:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 212>>);
  370. dec_huffman(<<2#111111111111111111111100010:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 214>>);
  371. dec_huffman(<<2#111111111111111111111100011:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 221>>);
  372. dec_huffman(<<2#111111111111111111111100100:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 222>>);
  373. dec_huffman(<<2#111111111111111111111100101:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 223>>);
  374. dec_huffman(<<2#111111111111111111111100110:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 241>>);
  375. dec_huffman(<<2#111111111111111111111100111:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 244>>);
  376. dec_huffman(<<2#111111111111111111111101000:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 245>>);
  377. dec_huffman(<<2#111111111111111111111101001:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 246>>);
  378. dec_huffman(<<2#111111111111111111111101010:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 247>>);
  379. dec_huffman(<<2#111111111111111111111101011:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 248>>);
  380. dec_huffman(<<2#111111111111111111111101100:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 250>>);
  381. dec_huffman(<<2#111111111111111111111101101:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 251>>);
  382. dec_huffman(<<2#111111111111111111111101110:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 252>>);
  383. dec_huffman(<<2#111111111111111111111101111:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 253>>);
  384. dec_huffman(<<2#111111111111111111111110000:27, R/bits>>, L, A) -> dec_huffman(R, L - 27, <<A/binary, 254>>);
  385. dec_huffman(<<2#1111111111111111111111100010:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 2>>);
  386. dec_huffman(<<2#1111111111111111111111100011:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 3>>);
  387. dec_huffman(<<2#1111111111111111111111100100:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 4>>);
  388. dec_huffman(<<2#1111111111111111111111100101:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 5>>);
  389. dec_huffman(<<2#1111111111111111111111100110:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 6>>);
  390. dec_huffman(<<2#1111111111111111111111100111:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 7>>);
  391. dec_huffman(<<2#1111111111111111111111101000:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 8>>);
  392. dec_huffman(<<2#1111111111111111111111101001:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 11>>);
  393. dec_huffman(<<2#1111111111111111111111101010:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 12>>);
  394. dec_huffman(<<2#1111111111111111111111101011:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 14>>);
  395. dec_huffman(<<2#1111111111111111111111101100:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 15>>);
  396. dec_huffman(<<2#1111111111111111111111101101:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 16>>);
  397. dec_huffman(<<2#1111111111111111111111101110:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 17>>);
  398. dec_huffman(<<2#1111111111111111111111101111:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 18>>);
  399. dec_huffman(<<2#1111111111111111111111110000:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 19>>);
  400. dec_huffman(<<2#1111111111111111111111110001:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 20>>);
  401. dec_huffman(<<2#1111111111111111111111110010:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 21>>);
  402. dec_huffman(<<2#1111111111111111111111110011:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 23>>);
  403. dec_huffman(<<2#1111111111111111111111110100:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 24>>);
  404. dec_huffman(<<2#1111111111111111111111110101:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 25>>);
  405. dec_huffman(<<2#1111111111111111111111110110:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 26>>);
  406. dec_huffman(<<2#1111111111111111111111110111:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 27>>);
  407. dec_huffman(<<2#1111111111111111111111111000:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 28>>);
  408. dec_huffman(<<2#1111111111111111111111111001:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 29>>);
  409. dec_huffman(<<2#1111111111111111111111111010:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 30>>);
  410. dec_huffman(<<2#1111111111111111111111111011:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 31>>);
  411. dec_huffman(<<2#1111111111111111111111111100:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 127>>);
  412. dec_huffman(<<2#1111111111111111111111111101:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 220>>);
  413. dec_huffman(<<2#1111111111111111111111111110:28, R/bits>>, L, A) -> dec_huffman(R, L - 28, <<A/binary, 249>>);
  414. dec_huffman(<<2#111111111111111111111111111100:30, R/bits>>, L, A) -> dec_huffman(R, L - 30, <<A/binary, 10>>);
  415. dec_huffman(<<2#111111111111111111111111111101:30, R/bits>>, L, A) -> dec_huffman(R, L - 30, <<A/binary, 13>>);
  416. dec_huffman(<<2#111111111111111111111111111110:30, R/bits>>, L, A) -> dec_huffman(R, L - 30, <<A/binary, 22>>).
  417. -ifdef(TEST).
  418. req_decode_test() ->
  419. %% First request (raw then huffman).
  420. {Headers1, State1} = decode(<< 16#828684410f7777772e6578616d706c652e636f6d:160 >>),
  421. {Headers1, State1} = decode(<< 16#828684418cf1e3c2e5f23a6ba0ab90f4ff:136 >>),
  422. Headers1 = [
  423. {<<":method">>, <<"GET">>},
  424. {<<":scheme">>, <<"http">>},
  425. {<<":path">>, <<"/">>},
  426. {<<":authority">>, <<"www.example.com">>}
  427. ],
  428. #state{size=57, dyn_table=[{57,{<<":authority">>, <<"www.example.com">>}}]} = State1,
  429. %% Second request (raw then huffman).
  430. {Headers2, State2} = decode(<< 16#828684be58086e6f2d6361636865:112 >>, State1),
  431. {Headers2, State2} = decode(<< 16#828684be5886a8eb10649cbf:96 >>, State1),
  432. Headers2 = [
  433. {<<":method">>, <<"GET">>},
  434. {<<":scheme">>, <<"http">>},
  435. {<<":path">>, <<"/">>},
  436. {<<":authority">>, <<"www.example.com">>},
  437. {<<"cache-control">>, <<"no-cache">>}
  438. ],
  439. #state{size=110, dyn_table=[
  440. {53,{<<"cache-control">>, <<"no-cache">>}},
  441. {57,{<<":authority">>, <<"www.example.com">>}}]} = State2,
  442. %% Third request (raw then huffman).
  443. {Headers3, State3} = decode(<< 16#828785bf400a637573746f6d2d6b65790c637573746f6d2d76616c7565:232 >>, State2),
  444. {Headers3, State3} = decode(<< 16#828785bf408825a849e95ba97d7f8925a849e95bb8e8b4bf:192 >>, State2),
  445. Headers3 = [
  446. {<<":method">>, <<"GET">>},
  447. {<<":scheme">>, <<"https">>},
  448. {<<":path">>, <<"/index.html">>},
  449. {<<":authority">>, <<"www.example.com">>},
  450. {<<"custom-key">>, <<"custom-value">>}
  451. ],
  452. #state{size=164, dyn_table=[
  453. {54,{<<"custom-key">>, <<"custom-value">>}},
  454. {53,{<<"cache-control">>, <<"no-cache">>}},
  455. {57,{<<":authority">>, <<"www.example.com">>}}]} = State3,
  456. ok.
  457. resp_decode_test() ->
  458. %% Use a max_size of 256 to trigger header evictions.
  459. State0 = init(256),
  460. %% First response (raw then huffman).
  461. {Headers1, State1} = decode(<< 16#4803333032580770726976617465611d4d6f6e2c203231204f637420323031332032303a31333a323120474d546e1768747470733a2f2f7777772e6578616d706c652e636f6d:560 >>, State0),
  462. {Headers1, State1} = decode(<< 16#488264025885aec3771a4b6196d07abe941054d444a8200595040b8166e082a62d1bff6e919d29ad171863c78f0b97c8e9ae82ae43d3:432 >>, State0),
  463. Headers1 = [
  464. {<<":status">>, <<"302">>},
  465. {<<"cache-control">>, <<"private">>},
  466. {<<"date">>, <<"Mon, 21 Oct 2013 20:13:21 GMT">>},
  467. {<<"location">>, <<"https://www.example.com">>}
  468. ],
  469. #state{size=222, dyn_table=[
  470. {63,{<<"location">>, <<"https://www.example.com">>}},
  471. {65,{<<"date">>, <<"Mon, 21 Oct 2013 20:13:21 GMT">>}},
  472. {52,{<<"cache-control">>, <<"private">>}},
  473. {42,{<<":status">>, <<"302">>}}]} = State1,
  474. %% Second response (raw then huffman).
  475. {Headers2, State2} = decode(<< 16#4803333037c1c0bf:64 >>, State1),
  476. {Headers2, State2} = decode(<< 16#4883640effc1c0bf:64 >>, State1),
  477. Headers2 = [
  478. {<<":status">>, <<"307">>},
  479. {<<"cache-control">>, <<"private">>},
  480. {<<"date">>, <<"Mon, 21 Oct 2013 20:13:21 GMT">>},
  481. {<<"location">>, <<"https://www.example.com">>}
  482. ],
  483. #state{size=222, dyn_table=[
  484. {42,{<<":status">>, <<"307">>}},
  485. {63,{<<"location">>, <<"https://www.example.com">>}},
  486. {65,{<<"date">>, <<"Mon, 21 Oct 2013 20:13:21 GMT">>}},
  487. {52,{<<"cache-control">>, <<"private">>}}]} = State2,
  488. %% Third response (raw then huffman).
  489. {Headers3, State3} = decode(<< 16#88c1611d4d6f6e2c203231204f637420323031332032303a31333a323220474d54c05a04677a69707738666f6f3d4153444a4b48514b425a584f5157454f50495541585157454f49553b206d61782d6167653d333630303b2076657273696f6e3d31:784 >>, State2),
  490. {Headers3, State3} = decode(<< 16#88c16196d07abe941054d444a8200595040b8166e084a62d1bffc05a839bd9ab77ad94e7821dd7f2e6c7b335dfdfcd5b3960d5af27087f3672c1ab270fb5291f9587316065c003ed4ee5b1063d5007:632 >>, State2),
  491. Headers3 = [
  492. {<<":status">>, <<"200">>},
  493. {<<"cache-control">>, <<"private">>},
  494. {<<"date">>, <<"Mon, 21 Oct 2013 20:13:22 GMT">>},
  495. {<<"location">>, <<"https://www.example.com">>},
  496. {<<"content-encoding">>, <<"gzip">>},
  497. {<<"set-cookie">>, <<"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1">>}
  498. ],
  499. #state{size=215, dyn_table=[
  500. {98,{<<"set-cookie">>, <<"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1">>}},
  501. {52,{<<"content-encoding">>, <<"gzip">>}},
  502. {65,{<<"date">>, <<"Mon, 21 Oct 2013 20:13:22 GMT">>}}]} = State3,
  503. ok.
  504. -endif.
  505. %% Encoding.
  506. -spec encode(cow_http:headers()) -> {iodata(), state()}.
  507. encode(Headers) ->
  508. encode(Headers, init(), #{}, []).
  509. -spec encode(cow_http:headers(), State) -> {iodata(), State} when State::state().
  510. encode(Headers, State) ->
  511. encode(Headers, State, #{}, []).
  512. -spec encode(cow_http:headers(), State, opts()) -> {iodata(), State} when State::state().
  513. encode(Headers, State, Opts) ->
  514. encode(Headers, State, Opts, []).
  515. %% @todo Handle cases where no/never indexing is expected.
  516. encode([], State, _, Acc) ->
  517. {lists:reverse(Acc), State};
  518. encode([_Header0 = {Name, Value0}|Tail], State, Opts, Acc) ->
  519. Value = iolist_to_binary(Value0),
  520. Header = {Name, Value},
  521. case table_find(Header, State) of
  522. %% Indexed header field representation.
  523. {field, Index} ->
  524. encode(Tail, State, Opts, [enc_int7(Index, 2#1)|Acc]);
  525. %% Literal header field representation: indexed name.
  526. {name, Index} ->
  527. State2 = table_insert(Header, State),
  528. encode(Tail, State2, Opts, [[enc_int6(Index, 2#01), enc_str(Value, Opts)]|Acc]);
  529. %% Literal header field representation: new name.
  530. not_found ->
  531. State2 = table_insert(Header, State),
  532. encode(Tail, State2, Opts, [[<< 0:1, 1:1, 0:6 >>, enc_str(Name, Opts), enc_str(Value, Opts)]|Acc])
  533. end.
  534. %% Encode an integer.
  535. enc_int6(Int, Prefix) when Int < 63 ->
  536. << Prefix:2, Int:6 >>;
  537. enc_int6(Int, Prefix) ->
  538. [<< Prefix:2, 2#111111:6 >>|enc_big_int(Int - 63, [])].
  539. enc_int7(Int, Prefix) when Int < 127 ->
  540. << Prefix:1, Int:7 >>;
  541. enc_int7(Int, Prefix) ->
  542. [<< Prefix:1, 2#1111111:7 >>|enc_big_int(Int - 127, [])].
  543. enc_big_int(Int, Acc) when Int < 128 ->
  544. lists:reverse([<< Int:8 >>|Acc]);
  545. enc_big_int(Int, Acc) ->
  546. enc_big_int(Int bsr 7, [<< 1:1, Int:7 >>|Acc]).
  547. %% Encode a string.
  548. enc_str(Str, Opts) ->
  549. case maps:get(huffman, Opts, true) of
  550. true ->
  551. Str2 = enc_huffman(Str, <<>>),
  552. [enc_int7(byte_size(Str2), 2#1), Str2];
  553. false ->
  554. [enc_int7(iolist_size(Str), 2#0), Str]
  555. end.
  556. enc_huffman(<<>>, Acc) ->
  557. case bit_size(Acc) rem 8 of
  558. 1 -> << Acc/bits, 2#1111111:7 >>;
  559. 2 -> << Acc/bits, 2#111111:6 >>;
  560. 3 -> << Acc/bits, 2#11111:5 >>;
  561. 4 -> << Acc/bits, 2#1111:4 >>;
  562. 5 -> << Acc/bits, 2#111:3 >>;
  563. 6 -> << Acc/bits, 2#11:2 >>;
  564. 7 -> << Acc/bits, 2#1:1 >>;
  565. 0 -> Acc
  566. end;
  567. enc_huffman(<< 0, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111000:13 >>);
  568. enc_huffman(<< 1, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111011000:23 >>);
  569. enc_huffman(<< 2, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111100010:28 >>);
  570. enc_huffman(<< 3, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111100011:28 >>);
  571. enc_huffman(<< 4, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111100100:28 >>);
  572. enc_huffman(<< 5, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111100101:28 >>);
  573. enc_huffman(<< 6, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111100110:28 >>);
  574. enc_huffman(<< 7, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111100111:28 >>);
  575. enc_huffman(<< 8, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111101000:28 >>);
  576. enc_huffman(<< 9, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111101010:24 >>);
  577. enc_huffman(<< 10, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111111111100:30 >>);
  578. enc_huffman(<< 11, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111101001:28 >>);
  579. enc_huffman(<< 12, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111101010:28 >>);
  580. enc_huffman(<< 13, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111111111101:30 >>);
  581. enc_huffman(<< 14, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111101011:28 >>);
  582. enc_huffman(<< 15, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111101100:28 >>);
  583. enc_huffman(<< 16, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111101101:28 >>);
  584. enc_huffman(<< 17, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111101110:28 >>);
  585. enc_huffman(<< 18, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111101111:28 >>);
  586. enc_huffman(<< 19, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111110000:28 >>);
  587. enc_huffman(<< 20, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111110001:28 >>);
  588. enc_huffman(<< 21, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111110010:28 >>);
  589. enc_huffman(<< 22, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111111111110:30 >>);
  590. enc_huffman(<< 23, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111110011:28 >>);
  591. enc_huffman(<< 24, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111110100:28 >>);
  592. enc_huffman(<< 25, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111110101:28 >>);
  593. enc_huffman(<< 26, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111110110:28 >>);
  594. enc_huffman(<< 27, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111110111:28 >>);
  595. enc_huffman(<< 28, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111111000:28 >>);
  596. enc_huffman(<< 29, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111111001:28 >>);
  597. enc_huffman(<< 30, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111111010:28 >>);
  598. enc_huffman(<< 31, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111111011:28 >>);
  599. enc_huffman(<< 32, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#010100:6 >>);
  600. enc_huffman(<< 33, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111000:10 >>);
  601. enc_huffman(<< 34, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111001:10 >>);
  602. enc_huffman(<< 35, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111010:12 >>);
  603. enc_huffman(<< 36, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111001:13 >>);
  604. enc_huffman(<< 37, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#010101:6 >>);
  605. enc_huffman(<< 38, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111000:8 >>);
  606. enc_huffman(<< 39, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111010:11 >>);
  607. enc_huffman(<< 40, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111010:10 >>);
  608. enc_huffman(<< 41, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111011:10 >>);
  609. enc_huffman(<< 42, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111001:8 >>);
  610. enc_huffman(<< 43, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111011:11 >>);
  611. enc_huffman(<< 44, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111010:8 >>);
  612. enc_huffman(<< 45, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#010110:6 >>);
  613. enc_huffman(<< 46, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#010111:6 >>);
  614. enc_huffman(<< 47, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#011000:6 >>);
  615. enc_huffman(<< 48, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#00000:5 >>);
  616. enc_huffman(<< 49, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#00001:5 >>);
  617. enc_huffman(<< 50, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#00010:5 >>);
  618. enc_huffman(<< 51, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#011001:6 >>);
  619. enc_huffman(<< 52, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#011010:6 >>);
  620. enc_huffman(<< 53, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#011011:6 >>);
  621. enc_huffman(<< 54, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#011100:6 >>);
  622. enc_huffman(<< 55, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#011101:6 >>);
  623. enc_huffman(<< 56, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#011110:6 >>);
  624. enc_huffman(<< 57, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#011111:6 >>);
  625. enc_huffman(<< 58, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1011100:7 >>);
  626. enc_huffman(<< 59, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111011:8 >>);
  627. enc_huffman(<< 60, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111100:15 >>);
  628. enc_huffman(<< 61, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#100000:6 >>);
  629. enc_huffman(<< 62, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111011:12 >>);
  630. enc_huffman(<< 63, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111100:10 >>);
  631. enc_huffman(<< 64, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111010:13 >>);
  632. enc_huffman(<< 65, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#100001:6 >>);
  633. enc_huffman(<< 66, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1011101:7 >>);
  634. enc_huffman(<< 67, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1011110:7 >>);
  635. enc_huffman(<< 68, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1011111:7 >>);
  636. enc_huffman(<< 69, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1100000:7 >>);
  637. enc_huffman(<< 70, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1100001:7 >>);
  638. enc_huffman(<< 71, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1100010:7 >>);
  639. enc_huffman(<< 72, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1100011:7 >>);
  640. enc_huffman(<< 73, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1100100:7 >>);
  641. enc_huffman(<< 74, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1100101:7 >>);
  642. enc_huffman(<< 75, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1100110:7 >>);
  643. enc_huffman(<< 76, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1100111:7 >>);
  644. enc_huffman(<< 77, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1101000:7 >>);
  645. enc_huffman(<< 78, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1101001:7 >>);
  646. enc_huffman(<< 79, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1101010:7 >>);
  647. enc_huffman(<< 80, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1101011:7 >>);
  648. enc_huffman(<< 81, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1101100:7 >>);
  649. enc_huffman(<< 82, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1101101:7 >>);
  650. enc_huffman(<< 83, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1101110:7 >>);
  651. enc_huffman(<< 84, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1101111:7 >>);
  652. enc_huffman(<< 85, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1110000:7 >>);
  653. enc_huffman(<< 86, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1110001:7 >>);
  654. enc_huffman(<< 87, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1110010:7 >>);
  655. enc_huffman(<< 88, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111100:8 >>);
  656. enc_huffman(<< 89, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1110011:7 >>);
  657. enc_huffman(<< 90, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111101:8 >>);
  658. enc_huffman(<< 91, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111011:13 >>);
  659. enc_huffman(<< 92, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111110000:19 >>);
  660. enc_huffman(<< 93, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111100:13 >>);
  661. enc_huffman(<< 94, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111100:14 >>);
  662. enc_huffman(<< 95, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#100010:6 >>);
  663. enc_huffman(<< 96, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111101:15 >>);
  664. enc_huffman(<< 97, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#00011:5 >>);
  665. enc_huffman(<< 98, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#100011:6 >>);
  666. enc_huffman(<< 99, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#00100:5 >>);
  667. enc_huffman(<< 100, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#100100:6 >>);
  668. enc_huffman(<< 101, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#00101:5 >>);
  669. enc_huffman(<< 102, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#100101:6 >>);
  670. enc_huffman(<< 103, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#100110:6 >>);
  671. enc_huffman(<< 104, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#100111:6 >>);
  672. enc_huffman(<< 105, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#00110:5 >>);
  673. enc_huffman(<< 106, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1110100:7 >>);
  674. enc_huffman(<< 107, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1110101:7 >>);
  675. enc_huffman(<< 108, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#101000:6 >>);
  676. enc_huffman(<< 109, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#101001:6 >>);
  677. enc_huffman(<< 110, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#101010:6 >>);
  678. enc_huffman(<< 111, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#00111:5 >>);
  679. enc_huffman(<< 112, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#101011:6 >>);
  680. enc_huffman(<< 113, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1110110:7 >>);
  681. enc_huffman(<< 114, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#101100:6 >>);
  682. enc_huffman(<< 115, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#01000:5 >>);
  683. enc_huffman(<< 116, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#01001:5 >>);
  684. enc_huffman(<< 117, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#101101:6 >>);
  685. enc_huffman(<< 118, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1110111:7 >>);
  686. enc_huffman(<< 119, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111000:7 >>);
  687. enc_huffman(<< 120, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111001:7 >>);
  688. enc_huffman(<< 121, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111010:7 >>);
  689. enc_huffman(<< 122, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111011:7 >>);
  690. enc_huffman(<< 123, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111110:15 >>);
  691. enc_huffman(<< 124, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111100:11 >>);
  692. enc_huffman(<< 125, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111101:14 >>);
  693. enc_huffman(<< 126, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111101:13 >>);
  694. enc_huffman(<< 127, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111111100:28 >>);
  695. enc_huffman(<< 128, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111100110:20 >>);
  696. enc_huffman(<< 129, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111010010:22 >>);
  697. enc_huffman(<< 130, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111100111:20 >>);
  698. enc_huffman(<< 131, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111101000:20 >>);
  699. enc_huffman(<< 132, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111010011:22 >>);
  700. enc_huffman(<< 133, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111010100:22 >>);
  701. enc_huffman(<< 134, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111010101:22 >>);
  702. enc_huffman(<< 135, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111011001:23 >>);
  703. enc_huffman(<< 136, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111010110:22 >>);
  704. enc_huffman(<< 137, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111011010:23 >>);
  705. enc_huffman(<< 138, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111011011:23 >>);
  706. enc_huffman(<< 139, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111011100:23 >>);
  707. enc_huffman(<< 140, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111011101:23 >>);
  708. enc_huffman(<< 141, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111011110:23 >>);
  709. enc_huffman(<< 142, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111101011:24 >>);
  710. enc_huffman(<< 143, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111011111:23 >>);
  711. enc_huffman(<< 144, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111101100:24 >>);
  712. enc_huffman(<< 145, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111101101:24 >>);
  713. enc_huffman(<< 146, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111010111:22 >>);
  714. enc_huffman(<< 147, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111100000:23 >>);
  715. enc_huffman(<< 148, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111101110:24 >>);
  716. enc_huffman(<< 149, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111100001:23 >>);
  717. enc_huffman(<< 150, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111100010:23 >>);
  718. enc_huffman(<< 151, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111100011:23 >>);
  719. enc_huffman(<< 152, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111100100:23 >>);
  720. enc_huffman(<< 153, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111011100:21 >>);
  721. enc_huffman(<< 154, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111011000:22 >>);
  722. enc_huffman(<< 155, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111100101:23 >>);
  723. enc_huffman(<< 156, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111011001:22 >>);
  724. enc_huffman(<< 157, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111100110:23 >>);
  725. enc_huffman(<< 158, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111100111:23 >>);
  726. enc_huffman(<< 159, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111101111:24 >>);
  727. enc_huffman(<< 160, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111011010:22 >>);
  728. enc_huffman(<< 161, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111011101:21 >>);
  729. enc_huffman(<< 162, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111101001:20 >>);
  730. enc_huffman(<< 163, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111011011:22 >>);
  731. enc_huffman(<< 164, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111011100:22 >>);
  732. enc_huffman(<< 165, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111101000:23 >>);
  733. enc_huffman(<< 166, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111101001:23 >>);
  734. enc_huffman(<< 167, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111011110:21 >>);
  735. enc_huffman(<< 168, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111101010:23 >>);
  736. enc_huffman(<< 169, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111011101:22 >>);
  737. enc_huffman(<< 170, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111011110:22 >>);
  738. enc_huffman(<< 171, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111110000:24 >>);
  739. enc_huffman(<< 172, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111011111:21 >>);
  740. enc_huffman(<< 173, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111011111:22 >>);
  741. enc_huffman(<< 174, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111101011:23 >>);
  742. enc_huffman(<< 175, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111101100:23 >>);
  743. enc_huffman(<< 176, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111100000:21 >>);
  744. enc_huffman(<< 177, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111100001:21 >>);
  745. enc_huffman(<< 178, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111100000:22 >>);
  746. enc_huffman(<< 179, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111100010:21 >>);
  747. enc_huffman(<< 180, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111101101:23 >>);
  748. enc_huffman(<< 181, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111100001:22 >>);
  749. enc_huffman(<< 182, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111101110:23 >>);
  750. enc_huffman(<< 183, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111101111:23 >>);
  751. enc_huffman(<< 184, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111101010:20 >>);
  752. enc_huffman(<< 185, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111100010:22 >>);
  753. enc_huffman(<< 186, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111100011:22 >>);
  754. enc_huffman(<< 187, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111100100:22 >>);
  755. enc_huffman(<< 188, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111110000:23 >>);
  756. enc_huffman(<< 189, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111100101:22 >>);
  757. enc_huffman(<< 190, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111100110:22 >>);
  758. enc_huffman(<< 191, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111110001:23 >>);
  759. enc_huffman(<< 192, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111100000:26 >>);
  760. enc_huffman(<< 193, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111100001:26 >>);
  761. enc_huffman(<< 194, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111101011:20 >>);
  762. enc_huffman(<< 195, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111110001:19 >>);
  763. enc_huffman(<< 196, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111100111:22 >>);
  764. enc_huffman(<< 197, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111110010:23 >>);
  765. enc_huffman(<< 198, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111101000:22 >>);
  766. enc_huffman(<< 199, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111101100:25 >>);
  767. enc_huffman(<< 200, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111100010:26 >>);
  768. enc_huffman(<< 201, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111100011:26 >>);
  769. enc_huffman(<< 202, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111100100:26 >>);
  770. enc_huffman(<< 203, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111011110:27 >>);
  771. enc_huffman(<< 204, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111011111:27 >>);
  772. enc_huffman(<< 205, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111100101:26 >>);
  773. enc_huffman(<< 206, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111110001:24 >>);
  774. enc_huffman(<< 207, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111101101:25 >>);
  775. enc_huffman(<< 208, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111110010:19 >>);
  776. enc_huffman(<< 209, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111100011:21 >>);
  777. enc_huffman(<< 210, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111100110:26 >>);
  778. enc_huffman(<< 211, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111100000:27 >>);
  779. enc_huffman(<< 212, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111100001:27 >>);
  780. enc_huffman(<< 213, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111100111:26 >>);
  781. enc_huffman(<< 214, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111100010:27 >>);
  782. enc_huffman(<< 215, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111110010:24 >>);
  783. enc_huffman(<< 216, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111100100:21 >>);
  784. enc_huffman(<< 217, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111100101:21 >>);
  785. enc_huffman(<< 218, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111101000:26 >>);
  786. enc_huffman(<< 219, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111101001:26 >>);
  787. enc_huffman(<< 220, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111111101:28 >>);
  788. enc_huffman(<< 221, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111100011:27 >>);
  789. enc_huffman(<< 222, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111100100:27 >>);
  790. enc_huffman(<< 223, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111100101:27 >>);
  791. enc_huffman(<< 224, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111101100:20 >>);
  792. enc_huffman(<< 225, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111110011:24 >>);
  793. enc_huffman(<< 226, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111101101:20 >>);
  794. enc_huffman(<< 227, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111100110:21 >>);
  795. enc_huffman(<< 228, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111101001:22 >>);
  796. enc_huffman(<< 229, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111100111:21 >>);
  797. enc_huffman(<< 230, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111101000:21 >>);
  798. enc_huffman(<< 231, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111110011:23 >>);
  799. enc_huffman(<< 232, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111101010:22 >>);
  800. enc_huffman(<< 233, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111101011:22 >>);
  801. enc_huffman(<< 234, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111101110:25 >>);
  802. enc_huffman(<< 235, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111101111:25 >>);
  803. enc_huffman(<< 236, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111110100:24 >>);
  804. enc_huffman(<< 237, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111110101:24 >>);
  805. enc_huffman(<< 238, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111101010:26 >>);
  806. enc_huffman(<< 239, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111110100:23 >>);
  807. enc_huffman(<< 240, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111101011:26 >>);
  808. enc_huffman(<< 241, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111100110:27 >>);
  809. enc_huffman(<< 242, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111101100:26 >>);
  810. enc_huffman(<< 243, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111101101:26 >>);
  811. enc_huffman(<< 244, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111100111:27 >>);
  812. enc_huffman(<< 245, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111101000:27 >>);
  813. enc_huffman(<< 246, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111101001:27 >>);
  814. enc_huffman(<< 247, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111101010:27 >>);
  815. enc_huffman(<< 248, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111101011:27 >>);
  816. enc_huffman(<< 249, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#1111111111111111111111111110:28 >>);
  817. enc_huffman(<< 250, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111101100:27 >>);
  818. enc_huffman(<< 251, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111101101:27 >>);
  819. enc_huffman(<< 252, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111101110:27 >>);
  820. enc_huffman(<< 253, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111101111:27 >>);
  821. enc_huffman(<< 254, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#111111111111111111111110000:27 >>);
  822. enc_huffman(<< 255, R/bits >>, A) -> enc_huffman(R, << A/bits, 2#11111111111111111111101110:26 >>).
  823. -ifdef(TEST).
  824. req_encode_test() ->
  825. %% First request (raw then huffman).
  826. Headers1 = [
  827. {<<":method">>, <<"GET">>},
  828. {<<":scheme">>, <<"http">>},
  829. {<<":path">>, <<"/">>},
  830. {<<":authority">>, <<"www.example.com">>}
  831. ],
  832. {Raw1, State1} = encode(Headers1, init(), #{huffman => false}),
  833. << 16#828684410f7777772e6578616d706c652e636f6d:160 >> = iolist_to_binary(Raw1),
  834. {Huff1, State1} = encode(Headers1),
  835. << 16#828684418cf1e3c2e5f23a6ba0ab90f4ff:136 >> = iolist_to_binary(Huff1),
  836. #state{size=57, dyn_table=[{57,{<<":authority">>, <<"www.example.com">>}}]} = State1,
  837. %% Second request (raw then huffman).
  838. Headers2 = [
  839. {<<":method">>, <<"GET">>},
  840. {<<":scheme">>, <<"http">>},
  841. {<<":path">>, <<"/">>},
  842. {<<":authority">>, <<"www.example.com">>},
  843. {<<"cache-control">>, <<"no-cache">>}
  844. ],
  845. {Raw2, State2} = encode(Headers2, State1, #{huffman => false}),
  846. << 16#828684be58086e6f2d6361636865:112 >> = iolist_to_binary(Raw2),
  847. {Huff2, State2} = encode(Headers2, State1),
  848. << 16#828684be5886a8eb10649cbf:96 >> = iolist_to_binary(Huff2),
  849. #state{size=110, dyn_table=[
  850. {53,{<<"cache-control">>, <<"no-cache">>}},
  851. {57,{<<":authority">>, <<"www.example.com">>}}]} = State2,
  852. %% Third request (raw then huffman).
  853. Headers3 = [
  854. {<<":method">>, <<"GET">>},
  855. {<<":scheme">>, <<"https">>},
  856. {<<":path">>, <<"/index.html">>},
  857. {<<":authority">>, <<"www.example.com">>},
  858. {<<"custom-key">>, <<"custom-value">>}
  859. ],
  860. {Raw3, State3} = encode(Headers3, State2, #{huffman => false}),
  861. << 16#828785bf400a637573746f6d2d6b65790c637573746f6d2d76616c7565:232 >> = iolist_to_binary(Raw3),
  862. {Huff3, State3} = encode(Headers3, State2),
  863. << 16#828785bf408825a849e95ba97d7f8925a849e95bb8e8b4bf:192 >> = iolist_to_binary(Huff3),
  864. #state{size=164, dyn_table=[
  865. {54,{<<"custom-key">>, <<"custom-value">>}},
  866. {53,{<<"cache-control">>, <<"no-cache">>}},
  867. {57,{<<":authority">>, <<"www.example.com">>}}]} = State3,
  868. ok.
  869. resp_encode_test() ->
  870. %% Use a max_size of 256 to trigger header evictions.
  871. State0 = init(256),
  872. %% First response (raw then huffman).
  873. Headers1 = [
  874. {<<":status">>, <<"302">>},
  875. {<<"cache-control">>, <<"private">>},
  876. {<<"date">>, <<"Mon, 21 Oct 2013 20:13:21 GMT">>},
  877. {<<"location">>, <<"https://www.example.com">>}
  878. ],
  879. {Raw1, State1} = encode(Headers1, State0, #{huffman => false}),
  880. << 16#4803333032580770726976617465611d4d6f6e2c203231204f637420323031332032303a31333a323120474d546e1768747470733a2f2f7777772e6578616d706c652e636f6d:560 >> = iolist_to_binary(Raw1),
  881. {Huff1, State1} = encode(Headers1, State0),
  882. << 16#488264025885aec3771a4b6196d07abe941054d444a8200595040b8166e082a62d1bff6e919d29ad171863c78f0b97c8e9ae82ae43d3:432 >> = iolist_to_binary(Huff1),
  883. #state{size=222, dyn_table=[
  884. {63,{<<"location">>, <<"https://www.example.com">>}},
  885. {65,{<<"date">>, <<"Mon, 21 Oct 2013 20:13:21 GMT">>}},
  886. {52,{<<"cache-control">>, <<"private">>}},
  887. {42,{<<":status">>, <<"302">>}}]} = State1,
  888. %% Second response (raw then huffman).
  889. Headers2 = [
  890. {<<":status">>, <<"307">>},
  891. {<<"cache-control">>, <<"private">>},
  892. {<<"date">>, <<"Mon, 21 Oct 2013 20:13:21 GMT">>},
  893. {<<"location">>, <<"https://www.example.com">>}
  894. ],
  895. {Raw2, State2} = encode(Headers2, State1, #{huffman => false}),
  896. << 16#4803333037c1c0bf:64 >> = iolist_to_binary(Raw2),
  897. {Huff2, State2} = encode(Headers2, State1),
  898. << 16#4883640effc1c0bf:64 >> = iolist_to_binary(Huff2),
  899. #state{size=222, dyn_table=[
  900. {42,{<<":status">>, <<"307">>}},
  901. {63,{<<"location">>, <<"https://www.example.com">>}},
  902. {65,{<<"date">>, <<"Mon, 21 Oct 2013 20:13:21 GMT">>}},
  903. {52,{<<"cache-control">>, <<"private">>}}]} = State2,
  904. %% Third response (raw then huffman).
  905. Headers3 = [
  906. {<<":status">>, <<"200">>},
  907. {<<"cache-control">>, <<"private">>},
  908. {<<"date">>, <<"Mon, 21 Oct 2013 20:13:22 GMT">>},
  909. {<<"location">>, <<"https://www.example.com">>},
  910. {<<"content-encoding">>, <<"gzip">>},
  911. {<<"set-cookie">>, <<"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1">>}
  912. ],
  913. {Raw3, State3} = encode(Headers3, State2, #{huffman => false}),
  914. << 16#88c1611d4d6f6e2c203231204f637420323031332032303a31333a323220474d54c05a04677a69707738666f6f3d4153444a4b48514b425a584f5157454f50495541585157454f49553b206d61782d6167653d333630303b2076657273696f6e3d31:784 >> = iolist_to_binary(Raw3),
  915. {Huff3, State3} = encode(Headers3, State2),
  916. << 16#88c16196d07abe941054d444a8200595040b8166e084a62d1bffc05a839bd9ab77ad94e7821dd7f2e6c7b335dfdfcd5b3960d5af27087f3672c1ab270fb5291f9587316065c003ed4ee5b1063d5007:632 >> = iolist_to_binary(Huff3),
  917. #state{size=215, dyn_table=[
  918. {98,{<<"set-cookie">>, <<"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1">>}},
  919. {52,{<<"content-encoding">>, <<"gzip">>}},
  920. {65,{<<"date">>, <<"Mon, 21 Oct 2013 20:13:22 GMT">>}}]} = State3,
  921. ok.
  922. encode_iolist_test() ->
  923. Headers = [
  924. {<<":method">>, <<"GET">>},
  925. {<<":scheme">>, <<"http">>},
  926. {<<":path">>, <<"/">>},
  927. {<<":authority">>, <<"www.example.com">>},
  928. {<<"content-type">>, [<<"image">>,<<"/">>,<<"png">>,<<>>]}
  929. ],
  930. {_, _} = encode(Headers),
  931. ok.
  932. -endif.
  933. %% Static and dynamic tables.
  934. %% @todo There must be a more efficient way.
  935. table_find(Header = {Name, _}, State) ->
  936. case table_find_field(Header, State) of
  937. not_found ->
  938. case table_find_name(Name, State) of
  939. NotFound = not_found ->
  940. NotFound;
  941. Found ->
  942. {name, Found}
  943. end;
  944. Found ->
  945. {field, Found}
  946. end.
  947. table_find_field({<<":authority">>, <<>>}, _) -> 1;
  948. table_find_field({<<":method">>, <<"GET">>}, _) -> 2;
  949. table_find_field({<<":method">>, <<"POST">>}, _) -> 3;
  950. table_find_field({<<":path">>, <<"/">>}, _) -> 4;
  951. table_find_field({<<":path">>, <<"/index.html">>}, _) -> 5;
  952. table_find_field({<<":scheme">>, <<"http">>}, _) -> 6;
  953. table_find_field({<<":scheme">>, <<"https">>}, _) -> 7;
  954. table_find_field({<<":status">>, <<"200">>}, _) -> 8;
  955. table_find_field({<<":status">>, <<"204">>}, _) -> 9;
  956. table_find_field({<<":status">>, <<"206">>}, _) -> 10;
  957. table_find_field({<<":status">>, <<"304">>}, _) -> 11;
  958. table_find_field({<<":status">>, <<"400">>}, _) -> 12;
  959. table_find_field({<<":status">>, <<"404">>}, _) -> 13;
  960. table_find_field({<<":status">>, <<"500">>}, _) -> 14;
  961. table_find_field({<<"accept-charset">>, <<>>}, _) -> 15;
  962. table_find_field({<<"accept-encoding">>, <<"gzip, deflate">>}, _) -> 16;
  963. table_find_field({<<"accept-language">>, <<>>}, _) -> 17;
  964. table_find_field({<<"accept-ranges">>, <<>>}, _) -> 18;
  965. table_find_field({<<"accept">>, <<>>}, _) -> 19;
  966. table_find_field({<<"access-control-allow-origin">>, <<>>}, _) -> 20;
  967. table_find_field({<<"age">>, <<>>}, _) -> 21;
  968. table_find_field({<<"allow">>, <<>>}, _) -> 22;
  969. table_find_field({<<"authorization">>, <<>>}, _) -> 23;
  970. table_find_field({<<"cache-control">>, <<>>}, _) -> 24;
  971. table_find_field({<<"content-disposition">>, <<>>}, _) -> 25;
  972. table_find_field({<<"content-encoding">>, <<>>}, _) -> 26;
  973. table_find_field({<<"content-language">>, <<>>}, _) -> 27;
  974. table_find_field({<<"content-length">>, <<>>}, _) -> 28;
  975. table_find_field({<<"content-location">>, <<>>}, _) -> 29;
  976. table_find_field({<<"content-range">>, <<>>}, _) -> 30;
  977. table_find_field({<<"content-type">>, <<>>}, _) -> 31;
  978. table_find_field({<<"cookie">>, <<>>}, _) -> 32;
  979. table_find_field({<<"date">>, <<>>}, _) -> 33;
  980. table_find_field({<<"etag">>, <<>>}, _) -> 34;
  981. table_find_field({<<"expect">>, <<>>}, _) -> 35;
  982. table_find_field({<<"expires">>, <<>>}, _) -> 36;
  983. table_find_field({<<"from">>, <<>>}, _) -> 37;
  984. table_find_field({<<"host">>, <<>>}, _) -> 38;
  985. table_find_field({<<"if-match">>, <<>>}, _) -> 39;
  986. table_find_field({<<"if-modified-since">>, <<>>}, _) -> 40;
  987. table_find_field({<<"if-none-match">>, <<>>}, _) -> 41;
  988. table_find_field({<<"if-range">>, <<>>}, _) -> 42;
  989. table_find_field({<<"if-unmodified-since">>, <<>>}, _) -> 43;
  990. table_find_field({<<"last-modified">>, <<>>}, _) -> 44;
  991. table_find_field({<<"link">>, <<>>}, _) -> 45;
  992. table_find_field({<<"location">>, <<>>}, _) -> 46;
  993. table_find_field({<<"max-forwards">>, <<>>}, _) -> 47;
  994. table_find_field({<<"proxy-authenticate">>, <<>>}, _) -> 48;
  995. table_find_field({<<"proxy-authorization">>, <<>>}, _) -> 49;
  996. table_find_field({<<"range">>, <<>>}, _) -> 50;
  997. table_find_field({<<"referer">>, <<>>}, _) -> 51;
  998. table_find_field({<<"refresh">>, <<>>}, _) -> 52;
  999. table_find_field({<<"retry-after">>, <<>>}, _) -> 53;
  1000. table_find_field({<<"server">>, <<>>}, _) -> 54;
  1001. table_find_field({<<"set-cookie">>, <<>>}, _) -> 55;
  1002. table_find_field({<<"strict-transport-security">>, <<>>}, _) -> 56;
  1003. table_find_field({<<"transfer-encoding">>, <<>>}, _) -> 57;
  1004. table_find_field({<<"user-agent">>, <<>>}, _) -> 58;
  1005. table_find_field({<<"vary">>, <<>>}, _) -> 59;
  1006. table_find_field({<<"via">>, <<>>}, _) -> 60;
  1007. table_find_field({<<"www-authenticate">>, <<>>}, _) -> 61;
  1008. table_find_field(Header, #state{dyn_table=DynamicTable}) ->
  1009. table_find_field_dyn(Header, DynamicTable, 62).
  1010. table_find_field_dyn(_, [], _) -> not_found;
  1011. table_find_field_dyn(Header, [{_, Header}|_], Index) -> Index;
  1012. table_find_field_dyn(Header, [_|Tail], Index) -> table_find_field_dyn(Header, Tail, Index + 1).
  1013. table_find_name(<<":authority">>, _) -> 1;
  1014. table_find_name(<<":method">>, _) -> 2;
  1015. table_find_name(<<":path">>, _) -> 4;
  1016. table_find_name(<<":scheme">>, _) -> 6;
  1017. table_find_name(<<":status">>, _) -> 8;
  1018. table_find_name(<<"accept-charset">>, _) -> 15;
  1019. table_find_name(<<"accept-encoding">>, _) -> 16;
  1020. table_find_name(<<"accept-language">>, _) -> 17;
  1021. table_find_name(<<"accept-ranges">>, _) -> 18;
  1022. table_find_name(<<"accept">>, _) -> 19;
  1023. table_find_name(<<"access-control-allow-origin">>, _) -> 20;
  1024. table_find_name(<<"age">>, _) -> 21;
  1025. table_find_name(<<"allow">>, _) -> 22;
  1026. table_find_name(<<"authorization">>, _) -> 23;
  1027. table_find_name(<<"cache-control">>, _) -> 24;
  1028. table_find_name(<<"content-disposition">>, _) -> 25;
  1029. table_find_name(<<"content-encoding">>, _) -> 26;
  1030. table_find_name(<<"content-language">>, _) -> 27;
  1031. table_find_name(<<"content-length">>, _) -> 28;
  1032. table_find_name(<<"content-location">>, _) -> 29;
  1033. table_find_name(<<"content-range">>, _) -> 30;
  1034. table_find_name(<<"content-type">>, _) -> 31;
  1035. table_find_name(<<"cookie">>, _) -> 32;
  1036. table_find_name(<<"date">>, _) -> 33;
  1037. table_find_name(<<"etag">>, _) -> 34;
  1038. table_find_name(<<"expect">>, _) -> 35;
  1039. table_find_name(<<"expires">>, _) -> 36;
  1040. table_find_name(<<"from">>, _) -> 37;
  1041. table_find_name(<<"host">>, _) -> 38;
  1042. table_find_name(<<"if-match">>, _) -> 39;
  1043. table_find_name(<<"if-modified-since">>, _) -> 40;
  1044. table_find_name(<<"if-none-match">>, _) -> 41;
  1045. table_find_name(<<"if-range">>, _) -> 42;
  1046. table_find_name(<<"if-unmodified-since">>, _) -> 43;
  1047. table_find_name(<<"last-modified">>, _) -> 44;
  1048. table_find_name(<<"link">>, _) -> 45;
  1049. table_find_name(<<"location">>, _) -> 46;
  1050. table_find_name(<<"max-forwards">>, _) -> 47;
  1051. table_find_name(<<"proxy-authenticate">>, _) -> 48;
  1052. table_find_name(<<"proxy-authorization">>, _) -> 49;
  1053. table_find_name(<<"range">>, _) -> 50;
  1054. table_find_name(<<"referer">>, _) -> 51;
  1055. table_find_name(<<"refresh">>, _) -> 52;
  1056. table_find_name(<<"retry-after">>, _) -> 53;
  1057. table_find_name(<<"server">>, _) -> 54;
  1058. table_find_name(<<"set-cookie">>, _) -> 55;
  1059. table_find_name(<<"strict-transport-security">>, _) -> 56;
  1060. table_find_name(<<"transfer-encoding">>, _) -> 57;
  1061. table_find_name(<<"user-agent">>, _) -> 58;
  1062. table_find_name(<<"vary">>, _) -> 59;
  1063. table_find_name(<<"via">>, _) -> 60;
  1064. table_find_name(<<"www-authenticate">>, _) -> 61;
  1065. table_find_name(Name, #state{dyn_table=DynamicTable}) ->
  1066. table_find_name_dyn(Name, DynamicTable, 62).
  1067. table_find_name_dyn(_, [], _) -> not_found;
  1068. table_find_name_dyn(Name, [{Name, _}|_], Index) -> Index;
  1069. table_find_name_dyn(Name, [_|Tail], Index) -> table_find_name_dyn(Name, Tail, Index + 1).
  1070. table_get(1, _) -> {<<":authority">>, <<>>};
  1071. table_get(2, _) -> {<<":method">>, <<"GET">>};
  1072. table_get(3, _) -> {<<":method">>, <<"POST">>};
  1073. table_get(4, _) -> {<<":path">>, <<"/">>};
  1074. table_get(5, _) -> {<<":path">>, <<"/index.html">>};
  1075. table_get(6, _) -> {<<":scheme">>, <<"http">>};
  1076. table_get(7, _) -> {<<":scheme">>, <<"https">>};
  1077. table_get(8, _) -> {<<":status">>, <<"200">>};
  1078. table_get(9, _) -> {<<":status">>, <<"204">>};
  1079. table_get(10, _) -> {<<":status">>, <<"206">>};
  1080. table_get(11, _) -> {<<":status">>, <<"304">>};
  1081. table_get(12, _) -> {<<":status">>, <<"400">>};
  1082. table_get(13, _) -> {<<":status">>, <<"404">>};
  1083. table_get(14, _) -> {<<":status">>, <<"500">>};
  1084. table_get(15, _) -> {<<"accept-charset">>, <<>>};
  1085. table_get(16, _) -> {<<"accept-encoding">>, <<"gzip, deflate">>};
  1086. table_get(17, _) -> {<<"accept-language">>, <<>>};
  1087. table_get(18, _) -> {<<"accept-ranges">>, <<>>};
  1088. table_get(19, _) -> {<<"accept">>, <<>>};
  1089. table_get(20, _) -> {<<"access-control-allow-origin">>, <<>>};
  1090. table_get(21, _) -> {<<"age">>, <<>>};
  1091. table_get(22, _) -> {<<"allow">>, <<>>};
  1092. table_get(23, _) -> {<<"authorization">>, <<>>};
  1093. table_get(24, _) -> {<<"cache-control">>, <<>>};
  1094. table_get(25, _) -> {<<"content-disposition">>, <<>>};
  1095. table_get(26, _) -> {<<"content-encoding">>, <<>>};
  1096. table_get(27, _) -> {<<"content-language">>, <<>>};
  1097. table_get(28, _) -> {<<"content-length">>, <<>>};
  1098. table_get(29, _) -> {<<"content-location">>, <<>>};
  1099. table_get(30, _) -> {<<"content-range">>, <<>>};
  1100. table_get(31, _) -> {<<"content-type">>, <<>>};
  1101. table_get(32, _) -> {<<"cookie">>, <<>>};
  1102. table_get(33, _) -> {<<"date">>, <<>>};
  1103. table_get(34, _) -> {<<"etag">>, <<>>};
  1104. table_get(35, _) -> {<<"expect">>, <<>>};
  1105. table_get(36, _) -> {<<"expires">>, <<>>};
  1106. table_get(37, _) -> {<<"from">>, <<>>};
  1107. table_get(38, _) -> {<<"host">>, <<>>};
  1108. table_get(39, _) -> {<<"if-match">>, <<>>};
  1109. table_get(40, _) -> {<<"if-modified-since">>, <<>>};
  1110. table_get(41, _) -> {<<"if-none-match">>, <<>>};
  1111. table_get(42, _) -> {<<"if-range">>, <<>>};
  1112. table_get(43, _) -> {<<"if-unmodified-since">>, <<>>};
  1113. table_get(44, _) -> {<<"last-modified">>, <<>>};
  1114. table_get(45, _) -> {<<"link">>, <<>>};
  1115. table_get(46, _) -> {<<"location">>, <<>>};
  1116. table_get(47, _) -> {<<"max-forwards">>, <<>>};
  1117. table_get(48, _) -> {<<"proxy-authenticate">>, <<>>};
  1118. table_get(49, _) -> {<<"proxy-authorization">>, <<>>};
  1119. table_get(50, _) -> {<<"range">>, <<>>};
  1120. table_get(51, _) -> {<<"referer">>, <<>>};
  1121. table_get(52, _) -> {<<"refresh">>, <<>>};
  1122. table_get(53, _) -> {<<"retry-after">>, <<>>};
  1123. table_get(54, _) -> {<<"server">>, <<>>};
  1124. table_get(55, _) -> {<<"set-cookie">>, <<>>};
  1125. table_get(56, _) -> {<<"strict-transport-security">>, <<>>};
  1126. table_get(57, _) -> {<<"transfer-encoding">>, <<>>};
  1127. table_get(58, _) -> {<<"user-agent">>, <<>>};
  1128. table_get(59, _) -> {<<"vary">>, <<>>};
  1129. table_get(60, _) -> {<<"via">>, <<>>};
  1130. table_get(61, _) -> {<<"www-authenticate">>, <<>>};
  1131. table_get(Index, #state{dyn_table=DynamicTable}) ->
  1132. {_, Header} = lists:nth(Index - 61, DynamicTable),
  1133. Header.
  1134. table_get_name(1, _) -> <<":authority">>;
  1135. table_get_name(2, _) -> <<":method">>;
  1136. table_get_name(3, _) -> <<":method">>;
  1137. table_get_name(4, _) -> <<":path">>;
  1138. table_get_name(5, _) -> <<":path">>;
  1139. table_get_name(6, _) -> <<":scheme">>;
  1140. table_get_name(7, _) -> <<":scheme">>;
  1141. table_get_name(8, _) -> <<":status">>;
  1142. table_get_name(9, _) -> <<":status">>;
  1143. table_get_name(10, _) -> <<":status">>;
  1144. table_get_name(11, _) -> <<":status">>;
  1145. table_get_name(12, _) -> <<":status">>;
  1146. table_get_name(13, _) -> <<":status">>;
  1147. table_get_name(14, _) -> <<":status">>;
  1148. table_get_name(15, _) -> <<"accept-charset">>;
  1149. table_get_name(16, _) -> <<"accept-encoding">>;
  1150. table_get_name(17, _) -> <<"accept-language">>;
  1151. table_get_name(18, _) -> <<"accept-ranges">>;
  1152. table_get_name(19, _) -> <<"accept">>;
  1153. table_get_name(20, _) -> <<"access-control-allow-origin">>;
  1154. table_get_name(21, _) -> <<"age">>;
  1155. table_get_name(22, _) -> <<"allow">>;
  1156. table_get_name(23, _) -> <<"authorization">>;
  1157. table_get_name(24, _) -> <<"cache-control">>;
  1158. table_get_name(25, _) -> <<"content-disposition">>;
  1159. table_get_name(26, _) -> <<"content-encoding">>;
  1160. table_get_name(27, _) -> <<"content-language">>;
  1161. table_get_name(28, _) -> <<"content-length">>;
  1162. table_get_name(29, _) -> <<"content-location">>;
  1163. table_get_name(30, _) -> <<"content-range">>;
  1164. table_get_name(31, _) -> <<"content-type">>;
  1165. table_get_name(32, _) -> <<"cookie">>;
  1166. table_get_name(33, _) -> <<"date">>;
  1167. table_get_name(34, _) -> <<"etag">>;
  1168. table_get_name(35, _) -> <<"expect">>;
  1169. table_get_name(36, _) -> <<"expires">>;
  1170. table_get_name(37, _) -> <<"from">>;
  1171. table_get_name(38, _) -> <<"host">>;
  1172. table_get_name(39, _) -> <<"if-match">>;
  1173. table_get_name(40, _) -> <<"if-modified-since">>;
  1174. table_get_name(41, _) -> <<"if-none-match">>;
  1175. table_get_name(42, _) -> <<"if-range">>;
  1176. table_get_name(43, _) -> <<"if-unmodified-since">>;
  1177. table_get_name(44, _) -> <<"last-modified">>;
  1178. table_get_name(45, _) -> <<"link">>;
  1179. table_get_name(46, _) -> <<"location">>;
  1180. table_get_name(47, _) -> <<"max-forwards">>;
  1181. table_get_name(48, _) -> <<"proxy-authenticate">>;
  1182. table_get_name(49, _) -> <<"proxy-authorization">>;
  1183. table_get_name(50, _) -> <<"range">>;
  1184. table_get_name(51, _) -> <<"referer">>;
  1185. table_get_name(52, _) -> <<"refresh">>;
  1186. table_get_name(53, _) -> <<"retry-after">>;
  1187. table_get_name(54, _) -> <<"server">>;
  1188. table_get_name(55, _) -> <<"set-cookie">>;
  1189. table_get_name(56, _) -> <<"strict-transport-security">>;
  1190. table_get_name(57, _) -> <<"transfer-encoding">>;
  1191. table_get_name(58, _) -> <<"user-agent">>;
  1192. table_get_name(59, _) -> <<"vary">>;
  1193. table_get_name(60, _) -> <<"via">>;
  1194. table_get_name(61, _) -> <<"www-authenticate">>;
  1195. table_get_name(Index, #state{dyn_table=DynamicTable}) ->
  1196. {_, {Name, _}} = lists:nth(Index - 61, DynamicTable),
  1197. Name.
  1198. table_insert(Entry = {Name, Value}, State=#state{size=Size, max_size=MaxSize, dyn_table=DynamicTable}) ->
  1199. EntrySize = byte_size(Name) + byte_size(Value) + 32,
  1200. {DynamicTable2, Size2} = if
  1201. Size + EntrySize > MaxSize ->
  1202. table_resize(DynamicTable, MaxSize - EntrySize, 0, []);
  1203. true ->
  1204. {DynamicTable, Size}
  1205. end,
  1206. State#state{size=Size2 + EntrySize, dyn_table=[{EntrySize, Entry}|DynamicTable2]}.
  1207. table_resize([], _, Size, Acc) ->
  1208. {lists:reverse(Acc), Size};
  1209. table_resize([{EntrySize, _}|_], MaxSize, Size, Acc) when Size + EntrySize > MaxSize ->
  1210. {lists:reverse(Acc), Size};
  1211. table_resize([Entry = {EntrySize, _}|Tail], MaxSize, Size, Acc) ->
  1212. table_resize(Tail, MaxSize, Size + EntrySize, [Entry|Acc]).
  1213. table_update_size(0, State) ->
  1214. State#state{size=0, max_size=0, dyn_table=[]};
  1215. table_update_size(MaxSize, State=#state{max_size=MaxSize}) ->
  1216. State;
  1217. table_update_size(MaxSize, #state{dyn_table=DynTable}) ->
  1218. {DynTable2, Size} = table_resize(DynTable, MaxSize, 0, []),
  1219. #state{size=Size, max_size=MaxSize, dyn_table=DynTable2}.
  1220. -ifdef(TEST).
  1221. prop_str_raw() ->
  1222. ?FORALL(Str, binary(), begin
  1223. {Str, <<>>} =:= dec_str(iolist_to_binary(enc_str(Str, #{huffman => false})))
  1224. end).
  1225. prop_str_huffman() ->
  1226. ?FORALL(Str, binary(), begin
  1227. {Str, <<>>} =:= dec_str(iolist_to_binary(enc_str(Str, #{huffman => true})))
  1228. end).
  1229. -endif.