lsqpack 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +19 -0
  3. data/Gemfile.lock +82 -0
  4. data/LICENSE +21 -0
  5. data/README.md +36 -0
  6. data/Rakefile +19 -0
  7. data/Steepfile +6 -0
  8. data/ext/lsqpack/extconf.rb +18 -0
  9. data/ext/lsqpack/lsqpack.c +426 -0
  10. data/ext/lsqpack/lsqpack.h +6 -0
  11. data/lib/lsqpack/version.rb +5 -0
  12. data/lib/lsqpack.rb +30 -0
  13. data/ls-qpack/.appveyor.yml +14 -0
  14. data/ls-qpack/.cirrus.yml +6 -0
  15. data/ls-qpack/.travis.yml +32 -0
  16. data/ls-qpack/CMakeLists.txt +66 -0
  17. data/ls-qpack/LICENSE +21 -0
  18. data/ls-qpack/README.md +65 -0
  19. data/ls-qpack/bin/CMakeLists.txt +21 -0
  20. data/ls-qpack/bin/encode-int.c +87 -0
  21. data/ls-qpack/bin/fuzz-decode.c +247 -0
  22. data/ls-qpack/bin/interop-decode.c +433 -0
  23. data/ls-qpack/bin/interop-encode.c +554 -0
  24. data/ls-qpack/deps/xxhash/xxhash.c +941 -0
  25. data/ls-qpack/deps/xxhash/xxhash.h +160 -0
  26. data/ls-qpack/fuzz/decode/a/README +3 -0
  27. data/ls-qpack/fuzz/decode/a/preamble +0 -0
  28. data/ls-qpack/fuzz/decode/a/test-cases/id_000000,sig_06,src_000390,op_havoc,rep_4 +0 -0
  29. data/ls-qpack/fuzz/decode/a/test-cases/id_000000,sig_06,src_000579,op_flip1,pos_14 +0 -0
  30. data/ls-qpack/fuzz/decode/a/test-cases/id_000000,src_000000,op_flip2,pos_12 +0 -0
  31. data/ls-qpack/fuzz/decode/a/test-cases/id_000001,sig_11,src_000579,op_havoc,rep_4 +0 -0
  32. data/ls-qpack/fuzz/decode/a/test-cases/id_000002,sig_11,src_000481,op_int16,pos_15,val_-1 +0 -0
  33. data/ls-qpack/fuzz/decode/a/test-cases/id_000002,src_000000,op_havoc,rep_8 +0 -0
  34. data/ls-qpack/fuzz/decode/a/test-cases/id_000006,src_000285,op_flip2,pos_14 +0 -0
  35. data/ls-qpack/fuzz/decode/a/test-cases/id_000008,src_000285,op_flip2,pos_20 +0 -0
  36. data/ls-qpack/fuzz/decode/a/test-cases/id_000010,src_000306,op_flip2,pos_75 +0 -0
  37. data/ls-qpack/fuzz/decode/a/test-cases/id_000011,src_000344,op_havoc,rep_2 +0 -0
  38. data/ls-qpack/fuzz/decode/a/test-cases/id_000014,src_000366,op_flip2,pos_28 +0 -0
  39. data/ls-qpack/fuzz/decode/b/README +1 -0
  40. data/ls-qpack/fuzz/decode/b/preamble +0 -0
  41. data/ls-qpack/fuzz/decode/b/test-cases/seed +0 -0
  42. data/ls-qpack/fuzz/decode/c/setup.sh +3 -0
  43. data/ls-qpack/fuzz/decode/c/test-cases/fb-req.qif.proxygen.out.256.100.0-chopped +0 -0
  44. data/ls-qpack/fuzz/decode/d/preamble +0 -0
  45. data/ls-qpack/fuzz/decode/d/setup.sh +3 -0
  46. data/ls-qpack/fuzz/decode/d/test-cases/fb-resp.minhq.256.128.0.ack +0 -0
  47. data/ls-qpack/fuzz/input/256.100.1/fb-req.out.256.100.1 +0 -0
  48. data/ls-qpack/fuzz/input/256.100.1/fb-resp.out.256.100.1 +0 -0
  49. data/ls-qpack/fuzz/input/256.100.1/netbsd.out.256.100.1 +0 -0
  50. data/ls-qpack/huff-tables.h +136247 -0
  51. data/ls-qpack/lsqpack.c +5547 -0
  52. data/ls-qpack/lsqpack.h +768 -0
  53. data/ls-qpack/test/CMakeLists.txt +76 -0
  54. data/ls-qpack/test/lsqpack-test.h +43 -0
  55. data/ls-qpack/test/qifs/fb-req.qif +4917 -0
  56. data/ls-qpack/test/qifs/fb-resp.qif +5982 -0
  57. data/ls-qpack/test/qifs/long-codes.qif +5984 -0
  58. data/ls-qpack/test/qifs/netbsd.qif +235 -0
  59. data/ls-qpack/test/run-qif.pl +97 -0
  60. data/ls-qpack/test/run-scenario.sh +68 -0
  61. data/ls-qpack/test/scenarios/0.95-reset.sce +10 -0
  62. data/ls-qpack/test/scenarios/cancel-stream.sce +22 -0
  63. data/ls-qpack/test/scenarios/drain-2.sce +37 -0
  64. data/ls-qpack/test/scenarios/drain.sce +37 -0
  65. data/ls-qpack/test/scenarios/end-dst-2.sce +14 -0
  66. data/ls-qpack/test/scenarios/end-dst.sce +14 -0
  67. data/ls-qpack/test/scenarios/incl-name.sce +13 -0
  68. data/ls-qpack/test/scenarios/multi-byte-int-dyn-ref-1.sce +110 -0
  69. data/ls-qpack/test/scenarios/multi-byte-int-dyn-ref-2.sce +161 -0
  70. data/ls-qpack/test/scenarios/post-base-1.sce +10 -0
  71. data/ls-qpack/test/scenarios/post-base-2.sce +13 -0
  72. data/ls-qpack/test/scenarios/post-base-nr.sce +10 -0
  73. data/ls-qpack/test/scenarios/set-max-cap.sce +15 -0
  74. data/ls-qpack/test/test_enc_str.c +139 -0
  75. data/ls-qpack/test/test_get_stx_id.c +144 -0
  76. data/ls-qpack/test/test_huff_dec.c +399 -0
  77. data/ls-qpack/test/test_int.c +220 -0
  78. data/ls-qpack/test/test_qpack.c +856 -0
  79. data/ls-qpack/test/test_read_enc_stream.c +256 -0
  80. data/ls-qpack/tools/har2qif.pl +139 -0
  81. data/ls-qpack/tools/randomize-cookies.pl +41 -0
  82. data/ls-qpack/tools/sort-qif.pl +31 -0
  83. data/ls-qpack/wincompat/getopt.c +758 -0
  84. data/ls-qpack/wincompat/getopt.h +131 -0
  85. data/ls-qpack/wincompat/getopt1.c +188 -0
  86. data/ls-qpack/wincompat/sys/queue.h +859 -0
  87. data/lsqpack.gemspec +39 -0
  88. data/sig/lsqpack.rbs +29 -0
  89. metadata +135 -0
@@ -0,0 +1,161 @@
1
+ # This scenario is designed to reach the `case EHA_INDEXED_DYN`
2
+ # in the `lsqpack_enc_encode` function. It is intended to fail the integer
3
+ # encoding due to buffer length. To trigger this case, many names and values
4
+ # must be inserted into the dynamic table so that the integer encoding requires
5
+ # more than one byte.
6
+ TABLE_SIZE=16384
7
+ AGGRESSIVE=1
8
+ IMMEDIATE_ACK=0
9
+ RISKED_STREAMS=1000
10
+ QIF=$(cat<<'EOQ'
11
+ aaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa
12
+ bbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbb
13
+ ccccccccccccc cccccccccccccccccccccccccc
14
+ ddddddddddddd dddddddddddddddddddddddddd
15
+ eeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeee
16
+ fffffffffffff ffffffffffffffffffffffffff
17
+ ggggggggggggg gggggggggggggggggggggggggg
18
+ aaaa oneeeeeeeee
19
+ bbbb oneeeeeeeee
20
+ cccc oneeeeeeeee
21
+ dddd oneeeeeeeee
22
+ eeee oneeeeeeeee
23
+ ffff oneeeeeeeee
24
+ gggg oneeeeeeeee
25
+ hhhh oneeeeeeeee
26
+ iiii oneeeeeeeee
27
+ jjjj oneeeeeeeee
28
+ kkkk oneeeeeeeee
29
+ llll oneeeeeeeee
30
+ mmmm oneeeeeeeee
31
+ nnnn oneeeeeeeee
32
+ oooo oneeeeeeeee
33
+ pppp oneeeeeeeee
34
+ qqqq oneeeeeeeee
35
+ rrrr oneeeeeeeee
36
+ ssss oneeeeeeeee
37
+ tttt oneeeeeeeee
38
+ uuuu oneeeeeeeee
39
+ vvvv oneeeeeeeee
40
+ wwww oneeeeeeeee
41
+ xxxx oneeeeeeeee
42
+ yyyy oneeeeeeeee
43
+ zzzz oneeeeeeeee
44
+ aabb oneeeeeeeee
45
+ bbcc oneeeeeeeee
46
+ ccdd oneeeeeeeee
47
+ ddee oneeeeeeeee
48
+ eeff oneeeeeeeee
49
+ ffgg oneeeeeeeee
50
+ gghh oneeeeeeeee
51
+ hhii oneeeeeeeee
52
+ iijj oneeeeeeeee
53
+ jjkk oneeeeeeeee
54
+ kkll oneeeeeeeee
55
+ llmm oneeeeeeeee
56
+ mmnn oneeeeeeeee
57
+ nnoo oneeeeeeeee
58
+ oopp oneeeeeeeee
59
+ ppqq oneeeeeeeee
60
+ qqrr oneeeeeeeee
61
+ rrss oneeeeeeeee
62
+ sstt oneeeeeeeee
63
+ ttuu oneeeeeeeee
64
+ uuvv oneeeeeeeee
65
+ vvww oneeeeeeeee
66
+ wwxx oneeeeeeeee
67
+ xxyy oneeeeeeeee
68
+ yyzz oneeeeeeeee
69
+ abcd oneeeeeeeee
70
+ bcde oneeeeeeeee
71
+ cdef oneeeeeeeee
72
+ defg oneeeeeeeee
73
+ efgh oneeeeeeeee
74
+ fghi oneeeeeeeee
75
+ ghij oneeeeeeeee
76
+ hijk oneeeeeeeee
77
+ ijkl oneeeeeeeee
78
+ jklm oneeeeeeeee
79
+ klmn oneeeeeeeee
80
+ lmno oneeeeeeeee
81
+ mnop oneeeeeeeee
82
+ nopq oneeeeeeeee
83
+ opqr oneeeeeeeee
84
+ pqrs oneeeeeeeee
85
+ qrst oneeeeeeeee
86
+ rstu oneeeeeeeee
87
+
88
+ aaaa oneeeeeeeee
89
+ bbbb oneeeeeeeee
90
+ cccc oneeeeeeeee
91
+ dddd oneeeeeeeee
92
+ eeee oneeeeeeeee
93
+ ffff oneeeeeeeee
94
+ gggg oneeeeeeeee
95
+ hhhh oneeeeeeeee
96
+ iiii oneeeeeeeee
97
+ jjjj oneeeeeeeee
98
+ kkkk oneeeeeeeee
99
+ llll oneeeeeeeee
100
+ mmmm oneeeeeeeee
101
+ nnnn oneeeeeeeee
102
+ oooo oneeeeeeeee
103
+ pppp oneeeeeeeee
104
+ qqqq oneeeeeeeee
105
+ rrrr oneeeeeeeee
106
+ ssss oneeeeeeeee
107
+ tttt oneeeeeeeee
108
+ uuuu oneeeeeeeee
109
+ vvvv oneeeeeeeee
110
+ wwww oneeeeeeeee
111
+ xxxx oneeeeeeeee
112
+ yyyy oneeeeeeeee
113
+ zzzz oneeeeeeeee
114
+ aabb oneeeeeeeee
115
+ bbcc oneeeeeeeee
116
+ ccdd oneeeeeeeee
117
+ ddee oneeeeeeeee
118
+ eeff oneeeeeeeee
119
+ ffgg oneeeeeeeee
120
+ gghh oneeeeeeeee
121
+ hhii oneeeeeeeee
122
+ iijj oneeeeeeeee
123
+ jjkk oneeeeeeeee
124
+ kkll oneeeeeeeee
125
+ llmm oneeeeeeeee
126
+ mmnn oneeeeeeeee
127
+ nnoo oneeeeeeeee
128
+ oopp oneeeeeeeee
129
+ ppqq oneeeeeeeee
130
+ qqrr oneeeeeeeee
131
+ rrss oneeeeeeeee
132
+ sstt oneeeeeeeee
133
+ ttuu oneeeeeeeee
134
+ uuvv oneeeeeeeee
135
+ vvww oneeeeeeeee
136
+ wwxx oneeeeeeeee
137
+ xxyy oneeeeeeeee
138
+ yyzz oneeeeeeeee
139
+ aaaa oneeeeeeeee
140
+ abcd oneeeeeeeee
141
+ bcde oneeeeeeeee
142
+ cdef oneeeeeeeee
143
+ defg oneeeeeeeee
144
+ efgh oneeeeeeeee
145
+ fghi oneeeeeeeee
146
+ ghij oneeeeeeeee
147
+ hijk oneeeeeeeee
148
+ ijkl oneeeeeeeee
149
+ jklm oneeeeeeeee
150
+ klmn oneeeeeeeee
151
+ lmno oneeeeeeeee
152
+ mnop oneeeeeeeee
153
+ nopq oneeeeeeeee
154
+ opqr oneeeeeeeee
155
+ pqrs oneeeeeeeee
156
+ qrst oneeeeeeeee
157
+ rstu oneeeeeeeee
158
+ aaaa oneeeeeeeee
159
+
160
+ EOQ
161
+ )
@@ -0,0 +1,10 @@
1
+ TABLE_SIZE=256
2
+ AGGRESSIVE=1
3
+ RISKED_STREAMS=1
4
+ QIF=$(cat<<'EOQ'
5
+ dude nude
6
+ dude nude
7
+ dude where is my car?
8
+
9
+ EOQ
10
+ )
@@ -0,0 +1,13 @@
1
+ # This scenario is designed to reach 'case DATA_STATE_LFPBNR_READ_VAL_PLAIN'
2
+ # in parse_header_data(). It has a number of repeated names with values that
3
+ # would be too small for Huffman coding.
4
+ TABLE_SIZE=256
5
+ AGGRESSIVE=1
6
+ RISKED_STREAMS=1
7
+ QIF=$(cat<<'EOQ'
8
+ dude n
9
+ dude nu
10
+ dude where is my car?
11
+
12
+ EOQ
13
+ )
@@ -0,0 +1,10 @@
1
+ TABLE_SIZE=256
2
+ AGGRESSIVE=0
3
+ RISKED_STREAMS=1
4
+ QIF=$(cat<<'EOQ'
5
+ dude nude
6
+ dude nude
7
+ dude where is my car?
8
+
9
+ EOQ
10
+ )
@@ -0,0 +1,15 @@
1
+ TABLE_SIZE=256
2
+ ANNOTATIONS=1
3
+ QIF=$(cat<<'EOQ'
4
+ dude nude
5
+ dude nude
6
+ dude where is my car?
7
+
8
+ ## t 0
9
+ one fish
10
+ two fish
11
+ red fish
12
+ blue fish
13
+
14
+ EOQ
15
+ )
@@ -0,0 +1,139 @@
1
+ #include <assert.h>
2
+ #include <stdlib.h>
3
+ #include <string.h>
4
+ #include <sys/queue.h>
5
+
6
+ #include "lsqpack.h"
7
+ #include "lsqpack-test.h"
8
+
9
+
10
+ struct str_test
11
+ {
12
+ int strt_lineno;
13
+ unsigned strt_prefix_bits;
14
+ const unsigned char *strt_in_str;
15
+ unsigned strt_in_len;
16
+ const unsigned char *strt_out_buf;
17
+ int strt_retval;
18
+ };
19
+
20
+
21
+ static const struct str_test tests[] =
22
+ {
23
+
24
+ {
25
+ __LINE__,
26
+ 3,
27
+ (unsigned char *) "",
28
+ 0,
29
+ (unsigned char *) "\x00",
30
+ 1,
31
+ },
32
+
33
+ {
34
+ __LINE__,
35
+ 3,
36
+ (unsigned char *) "a",
37
+ 1,
38
+ (unsigned char *) "\x01" "a",
39
+ 2,
40
+ },
41
+
42
+ {
43
+ __LINE__,
44
+ 3,
45
+ (unsigned char *) "aa",
46
+ 2,
47
+ (unsigned char *) "\x02" "aa",
48
+ 3,
49
+ },
50
+
51
+ {
52
+ __LINE__,
53
+ 3,
54
+ (unsigned char *) "aaa",
55
+ 3,
56
+ (unsigned char *) "\x0A\x18\xc7",
57
+ 3,
58
+ },
59
+
60
+ {
61
+ __LINE__,
62
+ 3,
63
+ (unsigned char *) "aaaaaaaaa",
64
+ 9,
65
+ (unsigned char *) "\x0E\x18\xc6\x31\x8c\x63\x1f",
66
+ 7,
67
+ },
68
+
69
+ {
70
+ __LINE__,
71
+ 3,
72
+ (unsigned char *) "aaaaaaaaaa",
73
+ 10,
74
+ (unsigned char *) "\x0F\x00\x18\xc6\x31\x8c\x63\x18\xff",
75
+ 9,
76
+ },
77
+
78
+ {
79
+ __LINE__,
80
+ 3,
81
+ (unsigned char *) "aaaaaaaaaabbb",
82
+ 13,
83
+ (unsigned char *) "\x0F\x02\x18\xc6\x31\x8c\x63\x18\xe3\x8e\x3f",
84
+ 11,
85
+ },
86
+
87
+ {
88
+ __LINE__,
89
+ 3,
90
+ (unsigned char *) "\x80\x90\xA0\xBA",
91
+ 4,
92
+ (unsigned char *) "\x04\x80\x90\xA0\xBA",
93
+ 5,
94
+ },
95
+
96
+ {
97
+ __LINE__,
98
+ 3,
99
+ (unsigned char *) "\x80\x90\xA0\xBA\x80\x90\xA0",
100
+ 7,
101
+ (unsigned char *) "\x07\x00\x80\x90\xA0\xBA\x80\x90\xA0",
102
+ 9,
103
+ },
104
+
105
+ {
106
+ __LINE__,
107
+ 3,
108
+ (unsigned char *) "\x80\x90\xA0\xBA\x80\x90\xA0" "foo",
109
+ 10,
110
+ (unsigned char *) "\x07\x03\x80\x90\xA0\xBA\x80\x90\xA0" "foo",
111
+ 12,
112
+ },
113
+
114
+ };
115
+
116
+
117
+ int
118
+ main (void)
119
+ {
120
+ const struct str_test *test;
121
+ int r;
122
+ unsigned char *out= malloc(0x1000);
123
+
124
+ if (!out)
125
+ return 1;
126
+
127
+ for (test = tests; test < tests + sizeof(tests) / sizeof(tests[0]); ++test)
128
+ {
129
+ out[0] = 0;
130
+ r = lsqpack_enc_enc_str(test->strt_prefix_bits, out, 0x1000,
131
+ test->strt_in_str, test->strt_in_len);
132
+ assert(r == test->strt_retval);
133
+ if (r > 0)
134
+ assert(0 == memcmp(test->strt_out_buf, out, r));
135
+ }
136
+
137
+ free(out);
138
+ return 0;
139
+ }
@@ -0,0 +1,144 @@
1
+ /* Test that lsqpack_get_stx_tab_id() works */
2
+
3
+ #include <assert.h>
4
+ #include <stdlib.h>
5
+ #include <string.h>
6
+
7
+ #include "lsqpack.h"
8
+
9
+ static const struct pair { const char *name, *value; } list[] =
10
+ {
11
+ {":authority", "",},
12
+ {":path", "/",},
13
+ {"age", "0",},
14
+ {"content-disposition", "",},
15
+ {"content-length", "0",},
16
+ {"cookie", "",},
17
+ {"date", "",},
18
+ {"etag", "",},
19
+ {"if-modified-since", "",},
20
+ {"if-none-match", "",},
21
+ {"last-modified", "",},
22
+ {"link", "",},
23
+ {"location", "",},
24
+ {"referer", "",},
25
+ {"set-cookie", "",},
26
+ {":method", "CONNECT",},
27
+ {":method", "DELETE",},
28
+ {":method", "GET",},
29
+ {":method", "HEAD",},
30
+ {":method", "OPTIONS",},
31
+ {":method", "POST",},
32
+ {":method", "PUT",},
33
+ {":scheme", "http",},
34
+ {":scheme", "https",},
35
+ {":status", "103",},
36
+ {":status", "200",},
37
+ {":status", "304",},
38
+ {":status", "404",},
39
+ {":status", "503",},
40
+ {"accept", "*/*",},
41
+ {"accept", "application/dns-message",},
42
+ {"accept-encoding", "gzip, deflate, br",},
43
+ {"accept-ranges", "bytes",},
44
+ {"access-control-allow-headers", "cache-control",},
45
+ {"access-control-allow-headers", "content-type",},
46
+ {"access-control-allow-origin", "*",},
47
+ {"cache-control", "max-age=0",},
48
+ {"cache-control", "max-age=2592000",},
49
+ {"cache-control", "max-age=604800",},
50
+ {"cache-control", "no-cache",},
51
+ {"cache-control", "no-store",},
52
+ {"cache-control", "public, max-age=31536000",},
53
+ {"content-encoding", "br",},
54
+ {"content-encoding", "gzip",},
55
+ {"content-type", "application/dns-message",},
56
+ {"content-type", "application/javascript",},
57
+ {"content-type", "application/json",},
58
+ {"content-type", "application/x-www-form-urlencoded",},
59
+ {"content-type", "image/gif",},
60
+ {"content-type", "image/jpeg",},
61
+ {"content-type", "image/png",},
62
+ {"content-type", "text/css",},
63
+ {"content-type", "text/html; charset=utf-8",},
64
+ {"content-type", "text/plain",},
65
+ {"content-type", "text/plain;charset=utf-8",},
66
+ {"range", "bytes=0-",},
67
+ {"strict-transport-security", "max-age=31536000",},
68
+ {"strict-transport-security", "max-age=31536000; includesubdomains",
69
+ },
70
+ {"strict-transport-security",
71
+ "max-age=31536000; includesubdomains; preload",},
72
+ {"vary", "accept-encoding",},
73
+ {"vary", "origin",},
74
+ {"x-content-type-options", "nosniff",},
75
+ {"x-xss-protection", "1; mode=block",},
76
+ {":status", "100",},
77
+ {":status", "204",},
78
+ {":status", "206",},
79
+ {":status", "302",},
80
+ {":status", "400",},
81
+ {":status", "403",},
82
+ {":status", "421",},
83
+ {":status", "425",},
84
+ {":status", "500",},
85
+ {"accept-language", "",},
86
+ {"access-control-allow-credentials", "FALSE",},
87
+ {"access-control-allow-credentials", "TRUE",},
88
+ {"access-control-allow-headers", "*",},
89
+ {"access-control-allow-methods", "get",},
90
+ {"access-control-allow-methods", "get, post, options",},
91
+ {"access-control-allow-methods", "options",},
92
+ {"access-control-expose-headers", "content-length",},
93
+ {"access-control-request-headers", "content-type",},
94
+ {"access-control-request-method", "get",},
95
+ {"access-control-request-method", "post",},
96
+ {"alt-svc", "clear",},
97
+ {"authorization", "",},
98
+ {"content-security-policy",
99
+ "script-src 'none'; object-src 'none'; base-uri 'none'",},
100
+ {"early-data", "1",},
101
+ {"expect-ct", "",},
102
+ {"forwarded", "",},
103
+ {"if-range", "",},
104
+ {"origin", "",},
105
+ {"purpose", "prefetch",},
106
+ {"server", "",},
107
+ {"timing-allow-origin", "*",},
108
+ {"upgrade-insecure-requests", "1",},
109
+ {"user-agent", "",},
110
+ {"x-forwarded-for", "",},
111
+ {"x-frame-options", "deny",},
112
+ {"x-frame-options", "sameorigin",},
113
+ };
114
+
115
+
116
+ int
117
+ main (void)
118
+ {
119
+ const struct pair *cur;
120
+ size_t name_len, val_len;
121
+ int id;
122
+ char name_copy[100];
123
+
124
+ for (cur = list; cur < list + sizeof(list) / sizeof(list[0]); ++cur)
125
+ {
126
+ name_len = strlen(cur->name);
127
+ val_len = strlen(cur->value);
128
+ /* Test that we find exact match: */
129
+ id = lsqpack_get_stx_tab_id(cur->name, name_len, cur->value, val_len);
130
+ assert(id == cur - list);
131
+ /* Test that we find just the header: */
132
+ id = lsqpack_get_stx_tab_id(cur->name, name_len, "WHATEVER!", 9);
133
+ assert(id >= 0);
134
+ if (id != cur - list)
135
+ assert(0 == strcmp(cur->name, list[id].name));
136
+ /* Test that we don't find wrong entry: */
137
+ strcpy(name_copy, cur->name);
138
+ name_copy[0] = 'z'; /* No header in the table starts with 'z' */
139
+ id = lsqpack_get_stx_tab_id(name_copy, name_len, cur->value, val_len);
140
+ assert(id < 0);
141
+ }
142
+
143
+ return 0;
144
+ }