http_box/
byte.rs

1// +-----------------------------------------------------------------------------------------------+
2// | Copyright 2016 Sean Kerr                                                                      |
3// |                                                                                               |
4// | Licensed under the Apache License, Version 2.0 (the "License");                               |
5// | you may not use this file except in compliance with the License.                              |
6// | You may obtain a copy of the License at                                                       |
7// |                                                                                               |
8// |  http://www.apache.org/licenses/LICENSE-2.0                                                   |
9// |                                                                                               |
10// | Unless required by applicable law or agreed to in writing, software                           |
11// | distributed under the License is distributed on an "AS IS" BASIS,                             |
12// | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.                      |
13// | See the License for the specific language governing permissions and                           |
14// | limitations under the License.                                                                |
15// +-----------------------------------------------------------------------------------------------+
16
17//! Byte verification functions.
18
19/// Bytes allowed in non-quoted header fields.
20static HEADER_FIELDS: [bool; 255] = [
21
22// NUL SOH    STX    ETX    EOT    ENQ    ACK    BEL    BS     TAB
23false, false, false, false, false, false, false, false, false, true,
24
25// LF  VT     FF     CR     SO     SI     DLE    DC1    DC2    DC3
26false, false, false, false, false, false, false, false, false, false,
27
28// DC4 NAK    SYN    ETB    CAN    EM     SUB    ESC    FS     GS
29false, false, false, false, false, false, false, false, false, false,
30
31// RS  US
32false, false,
33
34// space
35true,
36
37// !   "      #      $      %      &      '     (      )      *
38true,  false, true,  true,  true,  true,  true, true,  true,  true,
39
40// +   ,      -      .      /
41true,  true,  true,  true,  true,
42
43// 0   1      2      3      4      5      6      7      8      9
44true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
45
46// :   ;      <      =      >      ?      @
47true,  true,  true,  true,  true,  true,  true,
48
49// A   B      C      D      E      F      G      H      I      J
50true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
51
52// K   L      M      N      O      P      Q      R      S      T
53true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
54
55// U   V      W      X      Y      Z
56true,  true,  true,  true,  true,  true,
57
58// [   \      ]      ^      _      `
59true,  true,  true,  true,  true,  true,
60
61// a   b      c      d      e      f      g      h      i      j
62true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
63
64// k   l      m      n      o      p      q      r      s      t
65true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
66
67// u   v      w      x      y      z
68true,  true,  true,  true,  true,  true,
69
70// {   |      }      ~
71true,  true,  true,  true,
72
73// DEL
74false,
75
76// 128 - 255
77true,  true, true,  true,  true,  true,  true,  true,  true,  true,
78true,  true, true,  true,  true,  true,  true,  true,  true,  true,
79true,  true, true,  true,  true,  true,  true,  true,  true,  true,
80true,  true, true,  true,  true,  true,  true,  true,  true,  true,
81true,  true, true,  true,  true,  true,  true,  true,  true,  true,
82true,  true, true,  true,  true,  true,  true,  true,  true,  true,
83true,  true, true,  true,  true,  true,  true,  true,  true,  true,
84true,  true, true,  true,  true,  true,  true,  true,  true,  true,
85true,  true, true,  true,  true,  true,  true,  true,  true,  true,
86true,  true, true,  true,  true,  true,  true,  true,  true,  true,
87true,  true, true,  true,  true,  true,  true,  true,  true,  true,
88true,  true, true,  true,  true,  true,  true,  true,  true,  true,
89true,  true, true,  true,  true,  true,  true
90
91];
92
93/// Bytes allowed in quoted header fields.
94static QUOTED_HEADER_FIELDS: [bool; 255] = [
95
96// NUL SOH    STX    ETX    EOT    ENQ    ACK    BEL    BS     TAB
97false, false, false, false, false, false, false, false, false, true,
98
99// LF  VT     FF     CR     SO     SI     DLE    DC1    DC2    DC3
100false, false, false, false, false, false, false, false, false, false,
101
102// DC4 NAK    SYN    ETB    CAN    EM     SUB    ESC    FS     GS
103false, false, false, false, false, false, false, false, false, false,
104
105// RS  US
106false, false,
107
108// space
109true,
110
111// !   "      #      $      %      &      '     (      )      *
112true,  false, true,  true,  true,  true,  true,  true,  true,  true,
113
114// +   ,      -      .      /
115true,  true, true,  true,  true,
116
117// 0   1      2      3      4      5      6      7      8      9
118true,  true, true,  true,  true,  true,  true,  true,  true,  true,
119
120// :   ;      <      =      >      ?      @
121true,  true, true,  true,  true,  true,  true,
122
123// A   B      C      D      E      F      G      H      I      J
124true,  true, true,  true,  true,  true,  true,  true,  true,  true,
125
126// K   L      M      N      O      P      Q      R      S      T
127true,  true, true,  true,  true,  true,  true,  true,  true,  true,
128
129// U   V      W      X      Y      Z
130true,  true,  true,  true,  true,  true,
131
132// [   \      ]      ^      _      `
133true,  false, true,  true,  true,  true,
134
135// a   b      c      d      e      f      g      h      i      j
136true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
137
138// k   l      m      n      o      p      q      r      s      t
139true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
140
141// u   v      w      x      y      z
142true,  true,  true,  true,  true,  true,
143
144// {   |      }      ~
145true,  true, true,  true,
146
147// DEL
148false,
149
150// 128 - 255
151true,  true, true,  true,  true,  true,  true,  true,  true,  true,
152true,  true, true,  true,  true,  true,  true,  true,  true,  true,
153true,  true, true,  true,  true,  true,  true,  true,  true,  true,
154true,  true, true,  true,  true,  true,  true,  true,  true,  true,
155true,  true, true,  true,  true,  true,  true,  true,  true,  true,
156true,  true, true,  true,  true,  true,  true,  true,  true,  true,
157true,  true, true,  true,  true,  true,  true,  true,  true,  true,
158true,  true, true,  true,  true,  true,  true,  true,  true,  true,
159true,  true, true,  true,  true,  true,  true,  true,  true,  true,
160true,  true, true,  true,  true,  true,  true,  true,  true,  true,
161true,  true, true,  true,  true,  true,  true,  true,  true,  true,
162true,  true, true,  true,  true,  true,  true,  true,  true,  true,
163true,  true, true,  true,  true,  true,  true
164
165];
166
167/// Bytes that are considered tokens.
168static TOKENS: [bool; 255] = [
169
170// NUL SOH    STX    ETX    EOT    ENQ    ACK    BEL    BS     TAB
171false, false, false, false, false, false, false, false, false, false,
172
173// LF  VT     FF     CR     SO     SI     DLE    DC1    DC2    DC3
174false, false, false, false, false, false, false, false, false, false,
175
176// DC4 NAK    SYN    ETB    CAN    EM     SUB    ESC    FS     GS
177false, false, false, false, false, false, false, false, false, false,
178
179// RS  US
180false, false,
181
182// space
183false,
184
185// !   "      #      $      %      &      '      (      )      *
186true,  false, true,  true,  true,  true,  true,  false, false, true,
187
188// +   ,      -      .      /
189true,  false, true,  true,  false,
190
191// 0   1      2      3      4      5      6      7      8      9
192true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
193
194// :   ;      <      =      >      ?      @
195false, false, false, false, false, false, false,
196
197// A   B      C      D      E      F      G      H      I      J
198true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
199
200// K   L      M      N      O      P      Q      R      S      T
201true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
202
203// U   V      W      X      Y      Z
204true,  true,  true,  true,  true,  true,
205
206// [   \      ]      ^      _      `
207false, false, false, true,  true,  true,
208
209// a   b      c      d      e      f      g      h      i      j
210true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
211
212// k   l      m      n      o      p      q      r      s      t
213true,  true,  true,  true,  true,  true,  true,  true,  true,  true,
214
215// u   v      w      x      y      z
216true,  true,  true,  true,  true,  true,
217
218// {   |      }      ~
219false, true,  false, true,
220
221// DEL
222false,
223
224// 128 - 255
225false, false, false, false, false, false, false, false, false, false,
226false, false, false, false, false, false, false, false, false, false,
227false, false, false, false, false, false, false, false, false, false,
228false, false, false, false, false, false, false, false, false, false,
229false, false, false, false, false, false, false, false, false, false,
230false, false, false, false, false, false, false, false, false, false,
231false, false, false, false, false, false, false, false, false, false,
232false, false, false, false, false, false, false, false, false, false,
233false, false, false, false, false, false, false, false, false, false,
234false, false, false, false, false, false, false, false, false, false,
235false, false, false, false, false, false, false, false, false, false,
236false, false, false, false, false, false, false, false, false, false,
237false, false, false, false, false, false, false
238
239];
240
241/// Indicates that a byte is allowed in non-quoted header field.
242#[inline]
243pub fn is_header_field(byte: u8) -> bool {
244    HEADER_FIELDS[byte as usize]
245}
246
247/// Indicates that a byte is allowed in a quoted header field.
248///
249/// This excludes `"` and `\`, so that a collection loop will break.
250#[inline]
251pub fn is_quoted_header_field(byte: u8) -> bool {
252    QUOTED_HEADER_FIELDS[byte as usize]
253}
254
255/// Indicates that a byte is a HTTP token.
256#[inline]
257pub fn is_token(byte: u8) -> bool {
258    TOKENS[byte as usize]
259}