93.98% Lines (78/83)
90.91% Functions (10/11)
| TLA | Baseline | Branch | ||||||
|---|---|---|---|---|---|---|---|---|
| Line | Hits | Code | Line | Hits | Code | |||
| 1 | // | 1 | // | |||||
| 2 | // Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.com) | 2 | // Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.com) | |||||
| 3 | // Copyright (c) 2025 Mohammad Nejati | 3 | // Copyright (c) 2025 Mohammad Nejati | |||||
| 4 | // | 4 | // | |||||
| 5 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | 5 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | |||||
| 6 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | 6 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |||||
| 7 | // | 7 | // | |||||
| 8 | // Official repository: https://github.com/cppalliance/http | 8 | // Official repository: https://github.com/cppalliance/http | |||||
| 9 | // | 9 | // | |||||
| 10 | 10 | |||||||
| 11 | #include <boost/http/field.hpp> | 11 | #include <boost/http/field.hpp> | |||||
| 12 | #include <boost/assert.hpp> | 12 | #include <boost/assert.hpp> | |||||
| 13 | #include <boost/core/detail/string_view.hpp> | 13 | #include <boost/core/detail/string_view.hpp> | |||||
| 14 | #include <array> | 14 | #include <array> | |||||
| 15 | #include <cstdint> | 15 | #include <cstdint> | |||||
| 16 | #include <cstring> | 16 | #include <cstring> | |||||
| 17 | #include <ostream> | 17 | #include <ostream> | |||||
| 18 | 18 | |||||||
| 19 | namespace boost { | 19 | namespace boost { | |||||
| 20 | namespace http { | 20 | namespace http { | |||||
| 21 | 21 | |||||||
| 22 | namespace detail { | 22 | namespace detail { | |||||
| 23 | 23 | |||||||
| 24 | struct field_table | 24 | struct field_table | |||||
| 25 | { | 25 | { | |||||
| 26 | static | 26 | static | |||||
| 27 | std::uint32_t | 27 | std::uint32_t | |||||
| HITCBC | 28 | 117527 | get_chars( | 28 | 117605 | get_chars( | ||
| 29 | unsigned char const* p) noexcept | 29 | unsigned char const* p) noexcept | |||||
| 30 | { | 30 | { | |||||
| 31 | // VFALCO memcpy is endian-dependent | 31 | // VFALCO memcpy is endian-dependent | |||||
| 32 | //std::memcpy(&v, p, 4); | 32 | //std::memcpy(&v, p, 4); | |||||
| 33 | // Compiler should be smart enough to | 33 | // Compiler should be smart enough to | |||||
| 34 | // optimize this down to one instruction. | 34 | // optimize this down to one instruction. | |||||
| 35 | return | 35 | return | |||||
| HITCBC | 36 | 117527 | p[0] | | 36 | 117605 | p[0] | | ||
| HITCBC | 37 | 117527 | (p[1] << 8) | | 37 | 117605 | (p[1] << 8) | | ||
| HITCBC | 38 | 117527 | (p[2] << 16) | | 38 | 117605 | (p[2] << 16) | | ||
| HITCBC | 39 | 117527 | (p[3] << 24); | 39 | 117605 | (p[3] << 24); | ||
| 40 | } | 40 | } | |||||
| 41 | 41 | |||||||
| 42 | using array_type = std::array< | 42 | using array_type = std::array< | |||||
| 43 | core::string_view, 357>; | 43 | core::string_view, 357>; | |||||
| 44 | 44 | |||||||
| 45 | // Strings are converted to lowercase | 45 | // Strings are converted to lowercase | |||||
| 46 | static | 46 | static | |||||
| 47 | std::uint32_t | 47 | std::uint32_t | |||||
| HITCBC | 48 | 16832 | digest(core::string_view s) | 48 | 16840 | digest(core::string_view s) | ||
| 49 | { | 49 | { | |||||
| HITCBC | 50 | 16832 | std::uint32_t r = 0; | 50 | 16840 | std::uint32_t r = 0; | ||
| HITCBC | 51 | 16832 | std::size_t n = s.size(); | 51 | 16840 | std::size_t n = s.size(); | ||
| 52 | auto p = reinterpret_cast< | 52 | auto p = reinterpret_cast< | |||||
| HITCBC | 53 | 16832 | unsigned char const*>(s.data()); | 53 | 16840 | unsigned char const*>(s.data()); | ||
| 54 | // consume N characters at a time | 54 | // consume N characters at a time | |||||
| 55 | // VFALCO Can we do 8 on 64-bit systems? | 55 | // VFALCO Can we do 8 on 64-bit systems? | |||||
| HITCBC | 56 | 67629 | while(n >= 4) | 56 | 67663 | while(n >= 4) | ||
| 57 | { | 57 | { | |||||
| HITCBC | 58 | 50797 | auto const v = get_chars(p); | 58 | 50823 | auto const v = get_chars(p); | ||
| HITCBC | 59 | 50797 | r = (r * 5 + ( | 59 | 50823 | r = (r * 5 + ( | ||
| HITCBC | 60 | 50797 | v | 0x20202020 )); // convert to lower | 60 | 50823 | v | 0x20202020 )); // convert to lower | ||
| HITCBC | 61 | 50797 | p += 4; | 61 | 50823 | p += 4; | ||
| HITCBC | 62 | 50797 | n -= 4; | 62 | 50823 | n -= 4; | ||
| 63 | } | 63 | } | |||||
| 64 | // handle remaining characters | 64 | // handle remaining characters | |||||
| HITCBC | 65 | 41912 | while( n > 0 ) | 65 | 41934 | while( n > 0 ) | ||
| 66 | { | 66 | { | |||||
| HITCBC | 67 | 25080 | r = r * 5 + ( *p | 0x20 ); | 67 | 25094 | r = r * 5 + ( *p | 0x20 ); | ||
| HITCBC | 68 | 25080 | ++p; | 68 | 25094 | ++p; | ||
| HITCBC | 69 | 25080 | --n; | 69 | 25094 | --n; | ||
| 70 | } | 70 | } | |||||
| HITCBC | 71 | 16832 | return r; | 71 | 16840 | return r; | ||
| 72 | } | 72 | } | |||||
| 73 | 73 | |||||||
| 74 | // This comparison is case-insensitive, and the | 74 | // This comparison is case-insensitive, and the | |||||
| 75 | // strings must contain only valid http field characters. | 75 | // strings must contain only valid http field characters. | |||||
| 76 | static | 76 | static | |||||
| 77 | bool | 77 | bool | |||||
| HITCBC | 78 | 10162 | equals( | 78 | 10170 | equals( | ||
| 79 | core::string_view lhs, | 79 | core::string_view lhs, | |||||
| 80 | core::string_view rhs) | 80 | core::string_view rhs) | |||||
| 81 | { | 81 | { | |||||
| 82 | using Int = std::uint32_t; // VFALCO std::size_t? | 82 | using Int = std::uint32_t; // VFALCO std::size_t? | |||||
| HITCBC | 83 | 10162 | auto n = lhs.size(); | 83 | 10170 | auto n = lhs.size(); | ||
| HITCBC | 84 | 10162 | if(n != rhs.size()) | 84 | 10170 | if(n != rhs.size()) | ||
| HITCBC | 85 | 5 | return false; | 85 | 5 | return false; | ||
| 86 | auto p1 = reinterpret_cast< | 86 | auto p1 = reinterpret_cast< | |||||
| HITCBC | 87 | 10157 | unsigned char const*>(lhs.data()); | 87 | 10165 | unsigned char const*>(lhs.data()); | ||
| 88 | auto p2 = reinterpret_cast< | 88 | auto p2 = reinterpret_cast< | |||||
| HITCBC | 89 | 10157 | unsigned char const*>(rhs.data()); | 89 | 10165 | unsigned char const*>(rhs.data()); | ||
| HITCBC | 90 | 10157 | auto constexpr S = sizeof(Int); | 90 | 10165 | auto constexpr S = sizeof(Int); | ||
| HITCBC | 91 | 10157 | auto constexpr Mask = static_cast<Int>( | 91 | 10165 | auto constexpr Mask = static_cast<Int>( | ||
| 92 | 0xDFDFDFDFDFDFDFDF & ~Int{0}); | 92 | 0xDFDFDFDFDFDFDFDF & ~Int{0}); | |||||
| HITCBC | 93 | 43522 | for(; n >= S; p1 += S, p2 += S, n -= S) | 93 | 43556 | for(; n >= S; p1 += S, p2 += S, n -= S) | ||
| 94 | { | 94 | { | |||||
| HITCBC | 95 | 33365 | Int const v1 = get_chars(p1); | 95 | 33391 | Int const v1 = get_chars(p1); | ||
| HITCBC | 96 | 33365 | Int const v2 = get_chars(p2); | 96 | 33391 | Int const v2 = get_chars(p2); | ||
| HITCBC | 97 | 33365 | if((v1 ^ v2) & Mask) | 97 | 33391 | if((v1 ^ v2) & Mask) | ||
| MISUBC | 98 | ✗ | return false; | 98 | ✗ | return false; | ||
| 99 | } | 99 | } | |||||
| HITCBC | 100 | 25808 | for(; n; ++p1, ++p2, --n) | 100 | 25830 | for(; n; ++p1, ++p2, --n) | ||
| HITCBC | 101 | 15651 | if(( *p1 ^ *p2) & 0xDF) | 101 | 15665 | if(( *p1 ^ *p2) & 0xDF) | ||
| MISUBC | 102 | ✗ | return false; | 102 | ✗ | return false; | ||
| HITCBC | 103 | 10157 | return true; | 103 | 10165 | return true; | ||
| 104 | } | 104 | } | |||||
| 105 | 105 | |||||||
| 106 | array_type by_name_; | 106 | array_type by_name_; | |||||
| 107 | 107 | |||||||
| 108 | enum { N = 5155 }; | 108 | enum { N = 5155 }; | |||||
| 109 | unsigned char map_[ N ][ 2 ] = {}; | 109 | unsigned char map_[ N ][ 2 ] = {}; | |||||
| 110 | 110 | |||||||
| 111 | /* | 111 | /* | |||||
| 112 | From: | 112 | From: | |||||
| 113 | 113 | |||||||
| 114 | https://www.iana.org/assignments/message-headers/message-headers.xhtml | 114 | https://www.iana.org/assignments/message-headers/message-headers.xhtml | |||||
| 115 | */ | 115 | */ | |||||
| HITCBC | 116 | 16 | field_table() | 116 | 16 | field_table() | ||
| HITCBC | 117 | 16 | : by_name_({{ | 117 | 16 | : by_name_({{ | ||
| 118 | // string constants | 118 | // string constants | |||||
| 119 | "<unknown-field>", | 119 | "<unknown-field>", | |||||
| 120 | "A-IM", | 120 | "A-IM", | |||||
| 121 | "Accept", | 121 | "Accept", | |||||
| 122 | "Accept-Additions", | 122 | "Accept-Additions", | |||||
| 123 | "Accept-Charset", | 123 | "Accept-Charset", | |||||
| 124 | "Accept-Datetime", | 124 | "Accept-Datetime", | |||||
| 125 | "Accept-Encoding", | 125 | "Accept-Encoding", | |||||
| 126 | "Accept-Features", | 126 | "Accept-Features", | |||||
| 127 | "Accept-Language", | 127 | "Accept-Language", | |||||
| 128 | "Accept-Patch", | 128 | "Accept-Patch", | |||||
| 129 | "Accept-Post", | 129 | "Accept-Post", | |||||
| 130 | "Accept-Ranges", | 130 | "Accept-Ranges", | |||||
| 131 | "Access-Control", | 131 | "Access-Control", | |||||
| 132 | "Access-Control-Allow-Credentials", | 132 | "Access-Control-Allow-Credentials", | |||||
| 133 | "Access-Control-Allow-Headers", | 133 | "Access-Control-Allow-Headers", | |||||
| 134 | "Access-Control-Allow-Methods", | 134 | "Access-Control-Allow-Methods", | |||||
| 135 | "Access-Control-Allow-Origin", | 135 | "Access-Control-Allow-Origin", | |||||
| 136 | "Access-Control-Expose-Headers", | 136 | "Access-Control-Expose-Headers", | |||||
| 137 | "Access-Control-Max-Age", | 137 | "Access-Control-Max-Age", | |||||
| 138 | "Access-Control-Request-Headers", | 138 | "Access-Control-Request-Headers", | |||||
| 139 | "Access-Control-Request-Method", | 139 | "Access-Control-Request-Method", | |||||
| 140 | "Age", | 140 | "Age", | |||||
| 141 | "Allow", | 141 | "Allow", | |||||
| 142 | "ALPN", | 142 | "ALPN", | |||||
| 143 | "Also-Control", | 143 | "Also-Control", | |||||
| 144 | "Alt-Svc", | 144 | "Alt-Svc", | |||||
| 145 | "Alt-Used", | 145 | "Alt-Used", | |||||
| 146 | "Alternate-Recipient", | 146 | "Alternate-Recipient", | |||||
| 147 | "Alternates", | 147 | "Alternates", | |||||
| 148 | "Apparently-To", | 148 | "Apparently-To", | |||||
| 149 | "Apply-To-Redirect-Ref", | 149 | "Apply-To-Redirect-Ref", | |||||
| 150 | "Approved", | 150 | "Approved", | |||||
| 151 | "Archive", | 151 | "Archive", | |||||
| 152 | "Archived-At", | 152 | "Archived-At", | |||||
| 153 | "Article-Names", | 153 | "Article-Names", | |||||
| 154 | "Article-Updates", | 154 | "Article-Updates", | |||||
| 155 | "Authentication-Control", | 155 | "Authentication-Control", | |||||
| 156 | "Authentication-Info", | 156 | "Authentication-Info", | |||||
| 157 | "Authentication-Results", | 157 | "Authentication-Results", | |||||
| 158 | "Authorization", | 158 | "Authorization", | |||||
| 159 | "Auto-Submitted", | 159 | "Auto-Submitted", | |||||
| 160 | "Autoforwarded", | 160 | "Autoforwarded", | |||||
| 161 | "Autosubmitted", | 161 | "Autosubmitted", | |||||
| 162 | "Base", | 162 | "Base", | |||||
| 163 | "Bcc", | 163 | "Bcc", | |||||
| 164 | "Body", | 164 | "Body", | |||||
| 165 | "C-Ext", | 165 | "C-Ext", | |||||
| 166 | "C-Man", | 166 | "C-Man", | |||||
| 167 | "C-Opt", | 167 | "C-Opt", | |||||
| 168 | "C-PEP", | 168 | "C-PEP", | |||||
| 169 | "C-PEP-Info", | 169 | "C-PEP-Info", | |||||
| 170 | "Cache-Control", | 170 | "Cache-Control", | |||||
| 171 | "CalDAV-Timezones", | 171 | "CalDAV-Timezones", | |||||
| 172 | "Cancel-Key", | 172 | "Cancel-Key", | |||||
| 173 | "Cancel-Lock", | 173 | "Cancel-Lock", | |||||
| 174 | "Cc", | 174 | "Cc", | |||||
| 175 | "Close", | 175 | "Close", | |||||
| 176 | "Comments", | 176 | "Comments", | |||||
| 177 | "Compliance", | 177 | "Compliance", | |||||
| 178 | "Connection", | 178 | "Connection", | |||||
| 179 | "Content-Alternative", | 179 | "Content-Alternative", | |||||
| 180 | "Content-Base", | 180 | "Content-Base", | |||||
| 181 | "Content-Description", | 181 | "Content-Description", | |||||
| 182 | "Content-Disposition", | 182 | "Content-Disposition", | |||||
| 183 | "Content-Duration", | 183 | "Content-Duration", | |||||
| 184 | "Content-Encoding", | 184 | "Content-Encoding", | |||||
| 185 | "Content-features", | 185 | "Content-features", | |||||
| 186 | "Content-ID", | 186 | "Content-ID", | |||||
| 187 | "Content-Identifier", | 187 | "Content-Identifier", | |||||
| 188 | "Content-Language", | 188 | "Content-Language", | |||||
| 189 | "Content-Length", | 189 | "Content-Length", | |||||
| 190 | "Content-Location", | 190 | "Content-Location", | |||||
| 191 | "Content-MD5", | 191 | "Content-MD5", | |||||
| 192 | "Content-Range", | 192 | "Content-Range", | |||||
| 193 | "Content-Return", | 193 | "Content-Return", | |||||
| 194 | "Content-Script-Type", | 194 | "Content-Script-Type", | |||||
| 195 | "Content-Style-Type", | 195 | "Content-Style-Type", | |||||
| 196 | "Content-Transfer-Encoding", | 196 | "Content-Transfer-Encoding", | |||||
| 197 | "Content-Type", | 197 | "Content-Type", | |||||
| 198 | "Content-Version", | 198 | "Content-Version", | |||||
| 199 | "Control", | 199 | "Control", | |||||
| 200 | "Conversion", | 200 | "Conversion", | |||||
| 201 | "Conversion-With-Loss", | 201 | "Conversion-With-Loss", | |||||
| 202 | "Cookie", | 202 | "Cookie", | |||||
| 203 | "Cookie2", | 203 | "Cookie2", | |||||
| 204 | "Cost", | 204 | "Cost", | |||||
| 205 | "DASL", | 205 | "DASL", | |||||
| 206 | "Date", | 206 | "Date", | |||||
| 207 | "Date-Received", | 207 | "Date-Received", | |||||
| 208 | "DAV", | 208 | "DAV", | |||||
| 209 | "Default-Style", | 209 | "Default-Style", | |||||
| 210 | "Deferred-Delivery", | 210 | "Deferred-Delivery", | |||||
| 211 | "Delivery-Date", | 211 | "Delivery-Date", | |||||
| 212 | "Delta-Base", | 212 | "Delta-Base", | |||||
| 213 | "Depth", | 213 | "Depth", | |||||
| 214 | "Derived-From", | 214 | "Derived-From", | |||||
| 215 | "Destination", | 215 | "Destination", | |||||
| 216 | "Differential-ID", | 216 | "Differential-ID", | |||||
| 217 | "Digest", | 217 | "Digest", | |||||
| 218 | "Discarded-X400-IPMS-Extensions", | 218 | "Discarded-X400-IPMS-Extensions", | |||||
| 219 | "Discarded-X400-MTS-Extensions", | 219 | "Discarded-X400-MTS-Extensions", | |||||
| 220 | "Disclose-Recipients", | 220 | "Disclose-Recipients", | |||||
| 221 | "Disposition-Notification-Options", | 221 | "Disposition-Notification-Options", | |||||
| 222 | "Disposition-Notification-To", | 222 | "Disposition-Notification-To", | |||||
| 223 | "Distribution", | 223 | "Distribution", | |||||
| 224 | "DKIM-Signature", | 224 | "DKIM-Signature", | |||||
| 225 | "DL-Expansion-History", | 225 | "DL-Expansion-History", | |||||
| 226 | "Downgraded-Bcc", | 226 | "Downgraded-Bcc", | |||||
| 227 | "Downgraded-Cc", | 227 | "Downgraded-Cc", | |||||
| 228 | "Downgraded-Disposition-Notification-To", | 228 | "Downgraded-Disposition-Notification-To", | |||||
| 229 | "Downgraded-Final-Recipient", | 229 | "Downgraded-Final-Recipient", | |||||
| 230 | "Downgraded-From", | 230 | "Downgraded-From", | |||||
| 231 | "Downgraded-In-Reply-To", | 231 | "Downgraded-In-Reply-To", | |||||
| 232 | "Downgraded-Mail-From", | 232 | "Downgraded-Mail-From", | |||||
| 233 | "Downgraded-Message-Id", | 233 | "Downgraded-Message-Id", | |||||
| 234 | "Downgraded-Original-Recipient", | 234 | "Downgraded-Original-Recipient", | |||||
| 235 | "Downgraded-Rcpt-To", | 235 | "Downgraded-Rcpt-To", | |||||
| 236 | "Downgraded-References", | 236 | "Downgraded-References", | |||||
| 237 | "Downgraded-Reply-To", | 237 | "Downgraded-Reply-To", | |||||
| 238 | "Downgraded-Resent-Bcc", | 238 | "Downgraded-Resent-Bcc", | |||||
| 239 | "Downgraded-Resent-Cc", | 239 | "Downgraded-Resent-Cc", | |||||
| 240 | "Downgraded-Resent-From", | 240 | "Downgraded-Resent-From", | |||||
| 241 | "Downgraded-Resent-Reply-To", | 241 | "Downgraded-Resent-Reply-To", | |||||
| 242 | "Downgraded-Resent-Sender", | 242 | "Downgraded-Resent-Sender", | |||||
| 243 | "Downgraded-Resent-To", | 243 | "Downgraded-Resent-To", | |||||
| 244 | "Downgraded-Return-Path", | 244 | "Downgraded-Return-Path", | |||||
| 245 | "Downgraded-Sender", | 245 | "Downgraded-Sender", | |||||
| 246 | "Downgraded-To", | 246 | "Downgraded-To", | |||||
| 247 | "EDIINT-Features", | 247 | "EDIINT-Features", | |||||
| 248 | "Eesst-Version", | 248 | "Eesst-Version", | |||||
| 249 | "Encoding", | 249 | "Encoding", | |||||
| 250 | "Encrypted", | 250 | "Encrypted", | |||||
| 251 | "Errors-To", | 251 | "Errors-To", | |||||
| 252 | "ETag", | 252 | "ETag", | |||||
| 253 | "Expect", | 253 | "Expect", | |||||
| 254 | "Expires", | 254 | "Expires", | |||||
| 255 | "Expiry-Date", | 255 | "Expiry-Date", | |||||
| 256 | "Ext", | 256 | "Ext", | |||||
| 257 | "Followup-To", | 257 | "Followup-To", | |||||
| 258 | "Forwarded", | 258 | "Forwarded", | |||||
| 259 | "From", | 259 | "From", | |||||
| 260 | "Generate-Delivery-Report", | 260 | "Generate-Delivery-Report", | |||||
| 261 | "GetProfile", | 261 | "GetProfile", | |||||
| 262 | "Hobareg", | 262 | "Hobareg", | |||||
| 263 | "Host", | 263 | "Host", | |||||
| 264 | "HTTP2-Settings", | 264 | "HTTP2-Settings", | |||||
| 265 | "If", | 265 | "If", | |||||
| 266 | "If-Match", | 266 | "If-Match", | |||||
| 267 | "If-Modified-Since", | 267 | "If-Modified-Since", | |||||
| 268 | "If-None-Match", | 268 | "If-None-Match", | |||||
| 269 | "If-Range", | 269 | "If-Range", | |||||
| 270 | "If-Schedule-Tag-Match", | 270 | "If-Schedule-Tag-Match", | |||||
| 271 | "If-Unmodified-Since", | 271 | "If-Unmodified-Since", | |||||
| 272 | "IM", | 272 | "IM", | |||||
| 273 | "Importance", | 273 | "Importance", | |||||
| 274 | "In-Reply-To", | 274 | "In-Reply-To", | |||||
| 275 | "Incomplete-Copy", | 275 | "Incomplete-Copy", | |||||
| 276 | "Injection-Date", | 276 | "Injection-Date", | |||||
| 277 | "Injection-Info", | 277 | "Injection-Info", | |||||
| 278 | "Jabber-ID", | 278 | "Jabber-ID", | |||||
| 279 | "Keep-Alive", | 279 | "Keep-Alive", | |||||
| 280 | "Keywords", | 280 | "Keywords", | |||||
| 281 | "Label", | 281 | "Label", | |||||
| 282 | "Language", | 282 | "Language", | |||||
| 283 | "Last-Modified", | 283 | "Last-Modified", | |||||
| 284 | "Latest-Delivery-Time", | 284 | "Latest-Delivery-Time", | |||||
| 285 | "Lines", | 285 | "Lines", | |||||
| 286 | "Link", | 286 | "Link", | |||||
| 287 | "List-Archive", | 287 | "List-Archive", | |||||
| 288 | "List-Help", | 288 | "List-Help", | |||||
| 289 | "List-ID", | 289 | "List-ID", | |||||
| 290 | "List-Owner", | 290 | "List-Owner", | |||||
| 291 | "List-Post", | 291 | "List-Post", | |||||
| 292 | "List-Subscribe", | 292 | "List-Subscribe", | |||||
| 293 | "List-Unsubscribe", | 293 | "List-Unsubscribe", | |||||
| 294 | "List-Unsubscribe-Post", | 294 | "List-Unsubscribe-Post", | |||||
| 295 | "Location", | 295 | "Location", | |||||
| 296 | "Lock-Token", | 296 | "Lock-Token", | |||||
| 297 | "Man", | 297 | "Man", | |||||
| 298 | "Max-Forwards", | 298 | "Max-Forwards", | |||||
| 299 | "Memento-Datetime", | 299 | "Memento-Datetime", | |||||
| 300 | "Message-Context", | 300 | "Message-Context", | |||||
| 301 | "Message-ID", | 301 | "Message-ID", | |||||
| 302 | "Message-Type", | 302 | "Message-Type", | |||||
| 303 | "Meter", | 303 | "Meter", | |||||
| 304 | "Method-Check", | 304 | "Method-Check", | |||||
| 305 | "Method-Check-Expires", | 305 | "Method-Check-Expires", | |||||
| 306 | "MIME-Version", | 306 | "MIME-Version", | |||||
| 307 | "MMHS-Acp127-Message-Identifier", | 307 | "MMHS-Acp127-Message-Identifier", | |||||
| 308 | "MMHS-Authorizing-Users", | 308 | "MMHS-Authorizing-Users", | |||||
| 309 | "MMHS-Codress-Message-Indicator", | 309 | "MMHS-Codress-Message-Indicator", | |||||
| 310 | "MMHS-Copy-Precedence", | 310 | "MMHS-Copy-Precedence", | |||||
| 311 | "MMHS-Exempted-Address", | 311 | "MMHS-Exempted-Address", | |||||
| 312 | "MMHS-Extended-Authorisation-Info", | 312 | "MMHS-Extended-Authorisation-Info", | |||||
| 313 | "MMHS-Handling-Instructions", | 313 | "MMHS-Handling-Instructions", | |||||
| 314 | "MMHS-Message-Instructions", | 314 | "MMHS-Message-Instructions", | |||||
| 315 | "MMHS-Message-Type", | 315 | "MMHS-Message-Type", | |||||
| 316 | "MMHS-Originator-PLAD", | 316 | "MMHS-Originator-PLAD", | |||||
| 317 | "MMHS-Originator-Reference", | 317 | "MMHS-Originator-Reference", | |||||
| 318 | "MMHS-Other-Recipients-Indicator-CC", | 318 | "MMHS-Other-Recipients-Indicator-CC", | |||||
| 319 | "MMHS-Other-Recipients-Indicator-To", | 319 | "MMHS-Other-Recipients-Indicator-To", | |||||
| 320 | "MMHS-Primary-Precedence", | 320 | "MMHS-Primary-Precedence", | |||||
| 321 | "MMHS-Subject-Indicator-Codes", | 321 | "MMHS-Subject-Indicator-Codes", | |||||
| 322 | "MT-Priority", | 322 | "MT-Priority", | |||||
| 323 | "Negotiate", | 323 | "Negotiate", | |||||
| 324 | "Newsgroups", | 324 | "Newsgroups", | |||||
| 325 | "NNTP-Posting-Date", | 325 | "NNTP-Posting-Date", | |||||
| 326 | "NNTP-Posting-Host", | 326 | "NNTP-Posting-Host", | |||||
| 327 | "Non-Compliance", | 327 | "Non-Compliance", | |||||
| 328 | "Obsoletes", | 328 | "Obsoletes", | |||||
| 329 | "Opt", | 329 | "Opt", | |||||
| 330 | "Optional", | 330 | "Optional", | |||||
| 331 | "Optional-WWW-Authenticate", | 331 | "Optional-WWW-Authenticate", | |||||
| 332 | "Ordering-Type", | 332 | "Ordering-Type", | |||||
| 333 | "Organization", | 333 | "Organization", | |||||
| 334 | "Origin", | 334 | "Origin", | |||||
| 335 | "Original-Encoded-Information-Types", | 335 | "Original-Encoded-Information-Types", | |||||
| 336 | "Original-From", | 336 | "Original-From", | |||||
| 337 | "Original-Message-ID", | 337 | "Original-Message-ID", | |||||
| 338 | "Original-Recipient", | 338 | "Original-Recipient", | |||||
| 339 | "Original-Sender", | 339 | "Original-Sender", | |||||
| 340 | "Original-Subject", | 340 | "Original-Subject", | |||||
| 341 | "Originator-Return-Address", | 341 | "Originator-Return-Address", | |||||
| 342 | "Overwrite", | 342 | "Overwrite", | |||||
| 343 | "P3P", | 343 | "P3P", | |||||
| 344 | "Path", | 344 | "Path", | |||||
| 345 | "PEP", | 345 | "PEP", | |||||
| 346 | "Pep-Info", | 346 | "Pep-Info", | |||||
| 347 | "PICS-Label", | 347 | "PICS-Label", | |||||
| 348 | "Position", | 348 | "Position", | |||||
| 349 | "Posting-Version", | 349 | "Posting-Version", | |||||
| 350 | "Pragma", | 350 | "Pragma", | |||||
| 351 | "Prefer", | 351 | "Prefer", | |||||
| 352 | "Preference-Applied", | 352 | "Preference-Applied", | |||||
| 353 | "Prevent-NonDelivery-Report", | 353 | "Prevent-NonDelivery-Report", | |||||
| 354 | "Priority", | 354 | "Priority", | |||||
| 355 | "Privicon", | 355 | "Privicon", | |||||
| 356 | "ProfileObject", | 356 | "ProfileObject", | |||||
| 357 | "Protocol", | 357 | "Protocol", | |||||
| 358 | "Protocol-Info", | 358 | "Protocol-Info", | |||||
| 359 | "Protocol-Query", | 359 | "Protocol-Query", | |||||
| 360 | "Protocol-Request", | 360 | "Protocol-Request", | |||||
| 361 | "Proxy-Authenticate", | 361 | "Proxy-Authenticate", | |||||
| 362 | "Proxy-Authentication-Info", | 362 | "Proxy-Authentication-Info", | |||||
| 363 | "Proxy-Authorization", | 363 | "Proxy-Authorization", | |||||
| 364 | "Proxy-Connection", | 364 | "Proxy-Connection", | |||||
| 365 | "Proxy-Features", | 365 | "Proxy-Features", | |||||
| 366 | "Proxy-Instruction", | 366 | "Proxy-Instruction", | |||||
| 367 | "Public", | 367 | "Public", | |||||
| 368 | "Public-Key-Pins", | 368 | "Public-Key-Pins", | |||||
| 369 | "Public-Key-Pins-Report-Only", | 369 | "Public-Key-Pins-Report-Only", | |||||
| 370 | "Range", | 370 | "Range", | |||||
| 371 | "Received", | 371 | "Received", | |||||
| 372 | "Received-SPF", | 372 | "Received-SPF", | |||||
| 373 | "Redirect-Ref", | 373 | "Redirect-Ref", | |||||
| 374 | "References", | 374 | "References", | |||||
| 375 | "Referer", | 375 | "Referer", | |||||
| 376 | "Referer-Root", | 376 | "Referer-Root", | |||||
| 377 | "Relay-Version", | 377 | "Relay-Version", | |||||
| 378 | "Reply-By", | 378 | "Reply-By", | |||||
| 379 | "Reply-To", | 379 | "Reply-To", | |||||
| 380 | "Require-Recipient-Valid-Since", | 380 | "Require-Recipient-Valid-Since", | |||||
| 381 | "Resent-Bcc", | 381 | "Resent-Bcc", | |||||
| 382 | "Resent-Cc", | 382 | "Resent-Cc", | |||||
| 383 | "Resent-Date", | 383 | "Resent-Date", | |||||
| 384 | "Resent-From", | 384 | "Resent-From", | |||||
| 385 | "Resent-Message-ID", | 385 | "Resent-Message-ID", | |||||
| 386 | "Resent-Reply-To", | 386 | "Resent-Reply-To", | |||||
| 387 | "Resent-Sender", | 387 | "Resent-Sender", | |||||
| 388 | "Resent-To", | 388 | "Resent-To", | |||||
| 389 | "Resolution-Hint", | 389 | "Resolution-Hint", | |||||
| 390 | "Resolver-Location", | 390 | "Resolver-Location", | |||||
| 391 | "Retry-After", | 391 | "Retry-After", | |||||
| 392 | "Return-Path", | 392 | "Return-Path", | |||||
| 393 | "Safe", | 393 | "Safe", | |||||
| 394 | "Schedule-Reply", | 394 | "Schedule-Reply", | |||||
| 395 | "Schedule-Tag", | 395 | "Schedule-Tag", | |||||
| 396 | "Sec-Fetch-Dest", | 396 | "Sec-Fetch-Dest", | |||||
| 397 | "Sec-Fetch-Mode", | 397 | "Sec-Fetch-Mode", | |||||
| 398 | "Sec-Fetch-Site", | 398 | "Sec-Fetch-Site", | |||||
| 399 | "Sec-Fetch-User", | 399 | "Sec-Fetch-User", | |||||
| 400 | "Sec-WebSocket-Accept", | 400 | "Sec-WebSocket-Accept", | |||||
| 401 | "Sec-WebSocket-Extensions", | 401 | "Sec-WebSocket-Extensions", | |||||
| 402 | "Sec-WebSocket-Key", | 402 | "Sec-WebSocket-Key", | |||||
| 403 | "Sec-WebSocket-Protocol", | 403 | "Sec-WebSocket-Protocol", | |||||
| 404 | "Sec-WebSocket-Version", | 404 | "Sec-WebSocket-Version", | |||||
| 405 | "Security-Scheme", | 405 | "Security-Scheme", | |||||
| 406 | "See-Also", | 406 | "See-Also", | |||||
| 407 | "Sender", | 407 | "Sender", | |||||
| 408 | "Sensitivity", | 408 | "Sensitivity", | |||||
| 409 | "Server", | 409 | "Server", | |||||
| 410 | "Set-Cookie", | 410 | "Set-Cookie", | |||||
| 411 | "Set-Cookie2", | 411 | "Set-Cookie2", | |||||
| 412 | "SetProfile", | 412 | "SetProfile", | |||||
| 413 | "SIO-Label", | 413 | "SIO-Label", | |||||
| 414 | "SIO-Label-History", | 414 | "SIO-Label-History", | |||||
| 415 | "SLUG", | 415 | "SLUG", | |||||
| 416 | "SoapAction", | 416 | "SoapAction", | |||||
| 417 | "Solicitation", | 417 | "Solicitation", | |||||
| 418 | "Status-URI", | 418 | "Status-URI", | |||||
| 419 | "Strict-Transport-Security", | 419 | "Strict-Transport-Security", | |||||
| 420 | "Subject", | 420 | "Subject", | |||||
| 421 | "SubOK", | 421 | "SubOK", | |||||
| 422 | "Subst", | 422 | "Subst", | |||||
| 423 | "Summary", | 423 | "Summary", | |||||
| 424 | "Supersedes", | 424 | "Supersedes", | |||||
| 425 | "Surrogate-Capability", | 425 | "Surrogate-Capability", | |||||
| 426 | "Surrogate-Control", | 426 | "Surrogate-Control", | |||||
| 427 | "TCN", | 427 | "TCN", | |||||
| 428 | "TE", | 428 | "TE", | |||||
| 429 | "Timeout", | 429 | "Timeout", | |||||
| 430 | "Title", | 430 | "Title", | |||||
| 431 | "To", | 431 | "To", | |||||
| 432 | "Topic", | 432 | "Topic", | |||||
| 433 | "Trailer", | 433 | "Trailer", | |||||
| 434 | "Transfer-Encoding", | 434 | "Transfer-Encoding", | |||||
| 435 | "TTL", | 435 | "TTL", | |||||
| 436 | "UA-Color", | 436 | "UA-Color", | |||||
| 437 | "UA-Media", | 437 | "UA-Media", | |||||
| 438 | "UA-Pixels", | 438 | "UA-Pixels", | |||||
| 439 | "UA-Resolution", | 439 | "UA-Resolution", | |||||
| 440 | "UA-Windowpixels", | 440 | "UA-Windowpixels", | |||||
| 441 | "Upgrade", | 441 | "Upgrade", | |||||
| 442 | "Urgency", | 442 | "Urgency", | |||||
| 443 | "URI", | 443 | "URI", | |||||
| 444 | "User-Agent", | 444 | "User-Agent", | |||||
| 445 | "Variant-Vary", | 445 | "Variant-Vary", | |||||
| 446 | "Vary", | 446 | "Vary", | |||||
| 447 | "VBR-Info", | 447 | "VBR-Info", | |||||
| 448 | "Version", | 448 | "Version", | |||||
| 449 | "Via", | 449 | "Via", | |||||
| 450 | "Want-Digest", | 450 | "Want-Digest", | |||||
| 451 | "Warning", | 451 | "Warning", | |||||
| 452 | "WWW-Authenticate", | 452 | "WWW-Authenticate", | |||||
| 453 | "X-Archived-At", | 453 | "X-Archived-At", | |||||
| 454 | "X-Device-Accept", | 454 | "X-Device-Accept", | |||||
| 455 | "X-Device-Accept-Charset", | 455 | "X-Device-Accept-Charset", | |||||
| 456 | "X-Device-Accept-Encoding", | 456 | "X-Device-Accept-Encoding", | |||||
| 457 | "X-Device-Accept-Language", | 457 | "X-Device-Accept-Language", | |||||
| 458 | "X-Device-User-Agent", | 458 | "X-Device-User-Agent", | |||||
| 459 | "X-Frame-Options", | 459 | "X-Frame-Options", | |||||
| 460 | "X-Mittente", | 460 | "X-Mittente", | |||||
| 461 | "X-PGP-Sig", | 461 | "X-PGP-Sig", | |||||
| 462 | "X-Ricevuta", | 462 | "X-Ricevuta", | |||||
| 463 | "X-Riferimento-Message-ID", | 463 | "X-Riferimento-Message-ID", | |||||
| 464 | "X-TipoRicevuta", | 464 | "X-TipoRicevuta", | |||||
| 465 | "X-Trasporto", | 465 | "X-Trasporto", | |||||
| 466 | "X-VerificaSicurezza", | 466 | "X-VerificaSicurezza", | |||||
| 467 | "X400-Content-Identifier", | 467 | "X400-Content-Identifier", | |||||
| 468 | "X400-Content-Return", | 468 | "X400-Content-Return", | |||||
| 469 | "X400-Content-Type", | 469 | "X400-Content-Type", | |||||
| 470 | "X400-MTS-Identifier", | 470 | "X400-MTS-Identifier", | |||||
| 471 | "X400-Originator", | 471 | "X400-Originator", | |||||
| 472 | "X400-Received", | 472 | "X400-Received", | |||||
| 473 | "X400-Recipients", | 473 | "X400-Recipients", | |||||
| 474 | "X400-Trace", | 474 | "X400-Trace", | |||||
| 475 | "Xref" | 475 | "Xref" | |||||
| HITCBC | 476 | 16 | }}) | 476 | 16 | }}) | ||
| 477 | { | 477 | { | |||||
| HITCBC | 478 | 4096 | for(std::size_t i = 1, n = 256; i < n; ++i) | 478 | 4096 | for(std::size_t i = 1, n = 256; i < n; ++i) | ||
| 479 | { | 479 | { | |||||
| HITCBC | 480 | 4080 | auto sv = by_name_[ i ]; | 480 | 4080 | auto sv = by_name_[ i ]; | ||
| HITCBC | 481 | 4080 | auto h = digest(sv); | 481 | 4080 | auto h = digest(sv); | ||
| HITCBC | 482 | 4080 | auto j = h % N; | 482 | 4080 | auto j = h % N; | ||
| HITCBC | 483 | 4080 | BOOST_ASSERT(map_[j][0] == 0); | 483 | 4080 | BOOST_ASSERT(map_[j][0] == 0); | ||
| HITCBC | 484 | 4080 | map_[j][0] = static_cast<unsigned char>(i); | 484 | 4080 | map_[j][0] = static_cast<unsigned char>(i); | ||
| 485 | } | 485 | } | |||||
| 486 | 486 | |||||||
| HITCBC | 487 | 1648 | for(std::size_t i = 256, n = by_name_.size(); i < n; ++i) | 487 | 1648 | for(std::size_t i = 256, n = by_name_.size(); i < n; ++i) | ||
| 488 | { | 488 | { | |||||
| HITCBC | 489 | 1616 | auto sv = by_name_[i]; | 489 | 1616 | auto sv = by_name_[i]; | ||
| HITCBC | 490 | 1616 | auto h = digest(sv); | 490 | 1616 | auto h = digest(sv); | ||
| HITCBC | 491 | 1616 | auto j = h % N; | 491 | 1616 | auto j = h % N; | ||
| HITCBC | 492 | 1616 | BOOST_ASSERT(map_[j][1] == 0); | 492 | 1616 | BOOST_ASSERT(map_[j][1] == 0); | ||
| HITCBC | 493 | 1616 | map_[j][1] = static_cast<unsigned char>(i - 255); | 493 | 1616 | map_[j][1] = static_cast<unsigned char>(i - 255); | ||
| 494 | } | 494 | } | |||||
| HITCBC | 495 | 16 | } | 495 | 16 | } | ||
| 496 | 496 | |||||||
| 497 | optional<field> | 497 | optional<field> | |||||
| HITCBC | 498 | 11136 | string_to_field( | 498 | 11144 | string_to_field( | ||
| 499 | core::string_view s) const noexcept | 499 | core::string_view s) const noexcept | |||||
| 500 | { | 500 | { | |||||
| HITCBC | 501 | 11136 | auto h = digest(s); | 501 | 11144 | auto h = digest(s); | ||
| HITCBC | 502 | 11136 | auto j = h % N; | 502 | 11144 | auto j = h % N; | ||
| HITCBC | 503 | 11136 | int i = map_[j][0]; | 503 | 11144 | int i = map_[j][0]; | ||
| HITCBC | 504 | 11136 | core::string_view s2 = by_name_[i]; | 504 | 11144 | core::string_view s2 = by_name_[i]; | ||
| HITCBC | 505 | 11136 | if(i != 0 && equals(s, s2)) | 505 | 11144 | if(i != 0 && equals(s, s2)) | ||
| HITCBC | 506 | 5021 | return static_cast<field>(i); | 506 | 5027 | return static_cast<field>(i); | ||
| HITCBC | 507 | 6115 | i = map_[j][1]; | 507 | 6117 | i = map_[j][1]; | ||
| HITCBC | 508 | 6115 | if(i == 0) | 508 | 6117 | if(i == 0) | ||
| HITCBC | 509 | 979 | return boost::none; | 509 | 979 | return boost::none; | ||
| HITCBC | 510 | 5136 | i += 255; | 510 | 5138 | i += 255; | ||
| HITCBC | 511 | 5136 | s2 = by_name_[i]; | 511 | 5138 | s2 = by_name_[i]; | ||
| 512 | 512 | |||||||
| HITCBC | 513 | 5136 | if(equals(s, s2)) | 513 | 5138 | if(equals(s, s2)) | ||
| HITCBC | 514 | 5136 | return static_cast<field>(i); | 514 | 5138 | return static_cast<field>(i); | ||
| MISUBC | 515 | ✗ | return boost::none; | 515 | ✗ | return boost::none; | ||
| 516 | } | 516 | } | |||||
| 517 | 517 | |||||||
| 518 | // | 518 | // | |||||
| 519 | // Deprecated | 519 | // Deprecated | |||||
| 520 | // | 520 | // | |||||
| 521 | 521 | |||||||
| 522 | using const_iterator = | 522 | using const_iterator = | |||||
| 523 | array_type::const_iterator; | 523 | array_type::const_iterator; | |||||
| 524 | 524 | |||||||
| 525 | std::size_t | 525 | std::size_t | |||||
| HITCBC | 526 | 596 | size() const | 526 | 596 | size() const | ||
| 527 | { | 527 | { | |||||
| HITCBC | 528 | 1192 | return by_name_.size(); | 528 | 1192 | return by_name_.size(); | ||
| 529 | } | 529 | } | |||||
| 530 | 530 | |||||||
| 531 | const_iterator | 531 | const_iterator | |||||
| HITCBC | 532 | 596 | begin() const | 532 | 596 | begin() const | ||
| 533 | { | 533 | { | |||||
| HITCBC | 534 | 596 | return by_name_.begin(); | 534 | 596 | return by_name_.begin(); | ||
| 535 | } | 535 | } | |||||
| 536 | 536 | |||||||
| 537 | const_iterator | 537 | const_iterator | |||||
| 538 | end() const | 538 | end() const | |||||
| 539 | { | 539 | { | |||||
| 540 | return by_name_.end(); | 540 | return by_name_.end(); | |||||
| 541 | } | 541 | } | |||||
| 542 | }; | 542 | }; | |||||
| 543 | 543 | |||||||
| 544 | static | 544 | static | |||||
| 545 | field_table const& | 545 | field_table const& | |||||
| HITCBC | 546 | 11732 | get_field_table() noexcept | 546 | 11740 | get_field_table() noexcept | ||
| 547 | { | 547 | { | |||||
| HITCBC | 548 | 11732 | static field_table const tab; | 548 | 11740 | static field_table const tab; | ||
| HITCBC | 549 | 11732 | return tab; | 549 | 11740 | return tab; | ||
| 550 | } | 550 | } | |||||
| 551 | 551 | |||||||
| 552 | } // detail | 552 | } // detail | |||||
| 553 | 553 | |||||||
| 554 | core::string_view | 554 | core::string_view | |||||
| HITCBC | 555 | 596 | to_string(field f) | 555 | 596 | to_string(field f) | ||
| 556 | { | 556 | { | |||||
| HITCBC | 557 | 596 | auto const& v = detail::get_field_table(); | 557 | 596 | auto const& v = detail::get_field_table(); | ||
| HITCBC | 558 | 596 | BOOST_ASSERT(static_cast<unsigned>(f) < v.size()); | 558 | 596 | BOOST_ASSERT(static_cast<unsigned>(f) < v.size()); | ||
| HITCBC | 559 | 596 | return v.begin()[static_cast<unsigned>(f)]; | 559 | 596 | return v.begin()[static_cast<unsigned>(f)]; | ||
| 560 | } | 560 | } | |||||
| 561 | 561 | |||||||
| 562 | boost::optional<field> | 562 | boost::optional<field> | |||||
| HITCBC | 563 | 11136 | string_to_field( | 563 | 11144 | string_to_field( | ||
| 564 | core::string_view s) noexcept | 564 | core::string_view s) noexcept | |||||
| 565 | { | 565 | { | |||||
| HITCBC | 566 | 11136 | return detail::get_field_table().string_to_field(s); | 566 | 11144 | return detail::get_field_table().string_to_field(s); | ||
| 567 | } | 567 | } | |||||
| 568 | 568 | |||||||
| 569 | std::ostream& | 569 | std::ostream& | |||||
| MISUBC | 570 | ✗ | operator<<(std::ostream& os, field f) | 570 | ✗ | operator<<(std::ostream& os, field f) | ||
| 571 | { | 571 | { | |||||
| MISUBC | 572 | ✗ | return os << to_string(f); | 572 | ✗ | return os << to_string(f); | ||
| 573 | } | 573 | } | |||||
| 574 | 574 | |||||||
| 575 | } // http | 575 | } // http | |||||
| 576 | } // boost | 576 | } // boost | |||||