@@ -43,9 +43,10 @@ defmodule HPAX do
43
43
encoding_context = HPAX.new(4096)
44
44
45
45
"""
46
- @ spec new ( non_neg_integer ( ) ) :: Table . t ( )
47
- def new ( max_table_size ) when is_integer ( max_table_size ) and max_table_size >= 0 do
48
- Table . new ( max_table_size )
46
+ @ spec new ( non_neg_integer ( ) , [ Table . option ( ) ] ) :: Table . t ( )
47
+ def new ( max_table_size , options \\ [ ] )
48
+ when is_integer ( max_table_size ) and max_table_size >= 0 do
49
+ Table . new ( max_table_size , options )
49
50
end
50
51
51
52
@ doc """
@@ -255,28 +256,32 @@ defmodule HPAX do
255
256
256
257
defp encode_headers ( [ { action , name , value } | rest ] , table , acc )
257
258
when action in @ valid_header_actions and is_binary ( name ) and is_binary ( value ) do
259
+ huffman? = table . huffman == :always
260
+
258
261
{ encoded , table } =
259
262
case Table . lookup_by_header ( table , name , value ) do
260
263
{ :full , index } ->
261
264
{ encode_indexed_header ( index ) , table }
262
265
263
266
{ :name , index } when action == :store ->
264
- { encode_literal_header_with_indexing ( index , value ) , Table . add ( table , name , value ) }
267
+ { encode_literal_header_with_indexing ( index , value , huffman? ) ,
268
+ Table . add ( table , name , value ) }
265
269
266
270
{ :name , index } when action in [ :store_name , :no_store ] ->
267
- { encode_literal_header_without_indexing ( index , value ) , table }
271
+ { encode_literal_header_without_indexing ( index , value , huffman? ) , table }
268
272
269
273
{ :name , index } when action == :never_store ->
270
- { encode_literal_header_never_indexed ( index , value ) , table }
274
+ { encode_literal_header_never_indexed ( index , value , huffman? ) , table }
271
275
272
276
:not_found when action in [ :store , :store_name ] ->
273
- { encode_literal_header_with_indexing ( name , value ) , Table . add ( table , name , value ) }
277
+ { encode_literal_header_with_indexing ( name , value , huffman? ) ,
278
+ Table . add ( table , name , value ) }
274
279
275
280
:not_found when action == :no_store ->
276
- { encode_literal_header_without_indexing ( name , value ) , table }
281
+ { encode_literal_header_without_indexing ( name , value , huffman? ) , table }
277
282
278
283
:not_found when action == :never_store ->
279
- { encode_literal_header_never_indexed ( name , value ) , table }
284
+ { encode_literal_header_never_indexed ( name , value , huffman? ) , table }
280
285
end
281
286
282
287
encode_headers ( rest , table , [ acc , encoded ] )
@@ -286,27 +291,27 @@ defmodule HPAX do
286
291
<< 1 :: 1 , Types . encode_integer ( index , 7 ) :: bitstring >>
287
292
end
288
293
289
- defp encode_literal_header_with_indexing ( index , value ) when is_integer ( index ) do
290
- [ << 1 :: 2 , Types . encode_integer ( index , 6 ) :: bitstring >> , Types . encode_binary ( value , false ) ]
294
+ defp encode_literal_header_with_indexing ( index , value , huffman ) when is_integer ( index ) do
295
+ [ << 1 :: 2 , Types . encode_integer ( index , 6 ) :: bitstring >> , Types . encode_binary ( value , huffman ) ]
291
296
end
292
297
293
- defp encode_literal_header_with_indexing ( name , value ) when is_binary ( name ) do
294
- [ << 1 :: 2 , 0 :: 6 >> , Types . encode_binary ( name , false ) , Types . encode_binary ( value , false ) ]
298
+ defp encode_literal_header_with_indexing ( name , value , huffman ) when is_binary ( name ) do
299
+ [ << 1 :: 2 , 0 :: 6 >> , Types . encode_binary ( name , huffman ) , Types . encode_binary ( value , huffman ) ]
295
300
end
296
301
297
- defp encode_literal_header_without_indexing ( index , value ) when is_integer ( index ) do
298
- [ << 0 :: 4 , Types . encode_integer ( index , 4 ) :: bitstring >> , Types . encode_binary ( value , false ) ]
302
+ defp encode_literal_header_without_indexing ( index , value , huffman ) when is_integer ( index ) do
303
+ [ << 0 :: 4 , Types . encode_integer ( index , 4 ) :: bitstring >> , Types . encode_binary ( value , huffman ) ]
299
304
end
300
305
301
- defp encode_literal_header_without_indexing ( name , value ) when is_binary ( name ) do
302
- [ << 0 :: 4 , 0 :: 4 >> , Types . encode_binary ( name , false ) , Types . encode_binary ( value , false ) ]
306
+ defp encode_literal_header_without_indexing ( name , value , huffman ) when is_binary ( name ) do
307
+ [ << 0 :: 4 , 0 :: 4 >> , Types . encode_binary ( name , huffman ) , Types . encode_binary ( value , huffman ) ]
303
308
end
304
309
305
- defp encode_literal_header_never_indexed ( index , value ) when is_integer ( index ) do
306
- [ << 1 :: 4 , Types . encode_integer ( index , 4 ) :: bitstring >> , Types . encode_binary ( value , false ) ]
310
+ defp encode_literal_header_never_indexed ( index , value , huffman ) when is_integer ( index ) do
311
+ [ << 1 :: 4 , Types . encode_integer ( index , 4 ) :: bitstring >> , Types . encode_binary ( value , huffman ) ]
307
312
end
308
313
309
- defp encode_literal_header_never_indexed ( name , value ) when is_binary ( name ) do
310
- [ << 1 :: 4 , 0 :: 4 >> , Types . encode_binary ( name , false ) , Types . encode_binary ( value , false ) ]
314
+ defp encode_literal_header_never_indexed ( name , value , huffman ) when is_binary ( name ) do
315
+ [ << 1 :: 4 , 0 :: 4 >> , Types . encode_binary ( name , huffman ) , Types . encode_binary ( value , huffman ) ]
311
316
end
312
317
end
0 commit comments