1#![doc(test(attr(deny(warnings))))]
3#![doc(test(attr(allow(dead_code))))]
4#![doc(test(attr(allow(unused_variables))))]
5#![deny(rustdoc::broken_intra_doc_links)]
6#![deny(rustdoc::invalid_codeblock_attributes)]
7
8use std::fmt;
9
10use http::HeaderValue;
11
12pub const MAX_PENDING_REQS: u32 = 16 * 1024;
16
17pub const INVALID_ACL_HANDLE: u32 = std::u32::MAX - 1;
20pub const INVALID_BODY_HANDLE: u32 = std::u32::MAX - 1;
21pub const INVALID_CACHE_BUSY_HANDLE: u32 = std::u32::MAX - 1;
22pub const INVALID_CACHE_HANDLE: u32 = std::u32::MAX - 1;
23pub const INVALID_CACHE_REPLACE_HANDLE: u32 = std::u32::MAX - 1;
24pub const INVALID_CONFIG_STORE_HANDLE: u32 = std::u32::MAX - 1;
25pub const INVALID_DICTIONARY_HANDLE: u32 = std::u32::MAX - 1;
26pub const INVALID_KV_PENDING_DELETE_HANDLE: u32 = std::u32::MAX - 1;
27pub const INVALID_KV_PENDING_INSERT_HANDLE: u32 = std::u32::MAX - 1;
28pub const INVALID_KV_PENDING_LIST_HANDLE: u32 = std::u32::MAX - 1;
29pub const INVALID_KV_PENDING_LOOKUP_HANDLE: u32 = std::u32::MAX - 1;
30pub const INVALID_KV_STORE_HANDLE: u32 = std::u32::MAX - 1;
31pub const INVALID_PENDING_REQUEST_HANDLE: u32 = std::u32::MAX - 1;
32pub const INVALID_REQUEST_HANDLE: u32 = std::u32::MAX - 1;
33pub const INVALID_REQUEST_PROMISE_HANDLE: u32 = std::u32::MAX - 1;
34pub const INVALID_RESPONSE_HANDLE: u32 = std::u32::MAX - 1;
35pub const INVALID_SECRET_HANDLE: u32 = std::u32::MAX - 1;
36pub const INVALID_SECRET_STORE_HANDLE: u32 = std::u32::MAX - 1;
37
38#[allow(non_snake_case)]
40#[derive(Clone, Copy, Debug, PartialEq, Eq)]
41#[repr(u32)]
42pub enum SslVersion {
43 TLS1 = 0,
44 TLS1_1 = 1,
45 TLS1_2 = 2,
46 TLS1_3 = 3,
47}
48
49impl SslVersion {
50 pub fn as_u32(&self) -> u32 {
51 *self as u32
52 }
53}
54
55impl TryFrom<u32> for SslVersion {
58 type Error = String;
59 fn try_from(x: u32) -> Result<Self, Self::Error> {
60 if x == Self::TLS1 as u32 {
61 Ok(Self::TLS1)
62 } else if x == Self::TLS1_1 as u32 {
63 Ok(Self::TLS1_1)
64 } else if x == Self::TLS1_2 as u32 {
65 Ok(Self::TLS1_2)
66 } else if x == Self::TLS1_3 as u32 {
67 Ok(Self::TLS1_3)
68 } else {
69 Err(format!("unknown ssl version enum value: {}", x))
70 }
71 }
72}
73
74#[derive(Clone, Copy, Eq, PartialEq)]
75#[repr(transparent)]
76pub struct FastlyStatus {
77 pub code: i32,
78}
79
80impl FastlyStatus {
81 pub const OK: Self = Self { code: 0 };
85 pub const ERROR: Self = Self { code: 1 };
89 pub const INVAL: Self = Self { code: 2 };
91 pub const BADF: Self = Self { code: 3 };
95 pub const BUFLEN: Self = Self { code: 4 };
99 pub const UNSUPPORTED: Self = Self { code: 5 };
103 pub const BADALIGN: Self = Self { code: 6 };
107 pub const HTTPINVALID: Self = Self { code: 7 };
111 pub const HTTPUSER: Self = Self { code: 8 };
117 pub const HTTPINCOMPLETE: Self = Self { code: 9 };
121 pub const NONE: Self = Self { code: 10 };
126 pub const HTTPHEADTOOLARGE: Self = Self { code: 11 };
130 pub const HTTPINVALIDSTATUS: Self = Self { code: 12 };
134 pub const LIMITEXCEEDED: Self = Self { code: 13 };
139 pub const AGAIN: Self = Self { code: 14 };
144
145 pub fn is_ok(&self) -> bool {
146 self == &Self::OK
147 }
148
149 pub fn is_err(&self) -> bool {
150 !self.is_ok()
151 }
152
153 pub fn result(self) -> Result<(), Self> {
159 if let Self::OK = self {
160 Ok(())
161 } else {
162 Err(self)
163 }
164 }
165}
166
167impl fmt::Debug for FastlyStatus {
168 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
169 write!(f, "FastlyStatus::")?;
170 match *self {
171 Self::OK => write!(f, "OK"),
172 Self::ERROR => write!(f, "ERROR"),
173 Self::INVAL => write!(f, "INVAL"),
174 Self::BADF => write!(f, "BADF"),
175 Self::BUFLEN => write!(f, "BUFLEN"),
176 Self::UNSUPPORTED => write!(f, "UNSUPPORTED"),
177 Self::BADALIGN => write!(f, "BADALIGN"),
178 Self::HTTPINVALID => write!(f, "HTTP_INVALID_ERROR"),
179 Self::HTTPUSER => write!(f, "HTTP_USER_ERROR"),
180 Self::HTTPINCOMPLETE => write!(f, "HTTP_INCOMPLETE_MESSAGE"),
181 Self::NONE => write!(f, "NONE"),
182 Self::HTTPHEADTOOLARGE => write!(f, "HTTP_HEAD_TOO_LARGE"),
183 Self::HTTPINVALIDSTATUS => write!(f, "HTTP_INVALID_STATUS"),
184 Self::LIMITEXCEEDED => write!(f, "LIMIT_EXCEEDED"),
185 Self::AGAIN => write!(f, "AGAIN"),
186 _ => write!(f, "UNKNOWN ({})", self.code),
187 }
188 }
189}
190
191pub const FASTLY_ABI_VERSION: u64 = 1;
192
193#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd)]
195#[repr(u32)]
196pub enum HttpVersion {
197 Http09 = 0,
198 Http10 = 1,
199 Http11 = 2,
200 H2 = 3,
201 H3 = 4,
202}
203
204impl HttpVersion {
205 pub fn as_u32(&self) -> u32 {
206 *self as u32
207 }
208}
209
210impl TryFrom<u32> for HttpVersion {
213 type Error = String;
214
215 fn try_from(x: u32) -> Result<Self, Self::Error> {
216 if x == Self::Http09 as u32 {
217 Ok(Self::Http09)
218 } else if x == Self::Http10 as u32 {
219 Ok(Self::Http10)
220 } else if x == Self::Http11 as u32 {
221 Ok(Self::Http11)
222 } else if x == Self::H2 as u32 {
223 Ok(Self::H2)
224 } else if x == Self::H3 as u32 {
225 Ok(Self::H3)
226 } else {
227 Err(format!("unknown http version enum value: {}", x))
228 }
229 }
230}
231
232impl From<http::Version> for HttpVersion {
233 fn from(v: http::Version) -> Self {
234 match v {
235 http::Version::HTTP_09 => Self::Http09,
236 http::Version::HTTP_10 => Self::Http10,
237 http::Version::HTTP_11 => Self::Http11,
238 http::Version::HTTP_2 => Self::H2,
239 http::Version::HTTP_3 => Self::H3,
240 _ => unreachable!(),
241 }
242 }
243}
244
245impl From<HttpVersion> for http::Version {
246 fn from(v: HttpVersion) -> Self {
247 match v {
248 HttpVersion::Http09 => Self::HTTP_09,
249 HttpVersion::Http10 => Self::HTTP_10,
250 HttpVersion::Http11 => Self::HTTP_11,
251 HttpVersion::H2 => Self::HTTP_2,
252 HttpVersion::H3 => Self::HTTP_3,
253 }
254 }
255}
256
257#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
258#[repr(u32)]
259pub enum BodyWriteEnd {
260 Back = 0,
261 Front = 1,
262}
263
264#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
267#[repr(u32)]
268pub enum FramingHeadersMode {
269 Automatic = 0,
277
278 ManuallyFromHeaders = 1,
291}
292
293impl Default for FramingHeadersMode {
294 fn default() -> Self {
295 Self::Automatic
296 }
297}
298
299#[doc(hidden)]
304#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
305#[repr(u32)]
306pub enum HttpKeepaliveMode {
307 Automatic = 0,
309
310 NoKeepalive = 1,
313}
314
315impl Default for HttpKeepaliveMode {
316 fn default() -> Self {
317 Self::Automatic
318 }
319}
320
321#[derive(Clone, Debug)]
323pub enum CacheOverride {
324 None,
326 Pass,
328 Override {
332 ttl: Option<u32>,
333 stale_while_revalidate: Option<u32>,
334 pci: bool,
335 surrogate_key: Option<HeaderValue>,
336 },
337}
338
339impl Default for CacheOverride {
340 fn default() -> Self {
341 Self::default()
342 }
343}
344
345impl CacheOverride {
346 pub const fn none() -> Self {
347 Self::None
348 }
349
350 pub const fn pass() -> Self {
351 Self::Pass
352 }
353
354 pub fn is_pass(&self) -> bool {
355 if let Self::Pass = self {
356 true
357 } else {
358 false
359 }
360 }
361
362 pub const fn ttl(ttl: u32) -> Self {
363 Self::Override {
364 ttl: Some(ttl),
365 stale_while_revalidate: None,
366 pci: false,
367 surrogate_key: None,
368 }
369 }
370
371 pub const fn stale_while_revalidate(swr: u32) -> Self {
372 Self::Override {
373 ttl: None,
374 stale_while_revalidate: Some(swr),
375 pci: false,
376 surrogate_key: None,
377 }
378 }
379
380 pub const fn pci(pci: bool) -> Self {
381 Self::Override {
382 ttl: None,
383 stale_while_revalidate: None,
384 pci,
385 surrogate_key: None,
386 }
387 }
388
389 pub const fn surrogate_key(sk: HeaderValue) -> Self {
390 Self::Override {
391 ttl: None,
392 stale_while_revalidate: None,
393 pci: false,
394 surrogate_key: Some(sk),
395 }
396 }
397
398 pub fn set_none(&mut self) {
399 *self = Self::None;
400 }
401
402 pub fn set_pass(&mut self, pass: bool) {
403 if pass {
404 *self = Self::Pass;
405 } else if let Self::Pass = self {
406 *self = Self::None;
407 }
408 }
409
410 pub fn get_ttl(&self) -> Option<u32> {
411 if let Self::Override { ttl, .. } = self {
412 *ttl
413 } else {
414 None
415 }
416 }
417
418 pub fn set_ttl(&mut self, new_ttl: u32) {
419 match self {
420 Self::Override { ttl, .. } => *ttl = Some(new_ttl),
421 _ => *self = Self::ttl(new_ttl),
422 }
423 }
424
425 pub fn get_stale_while_revalidate(&self) -> Option<u32> {
426 if let Self::Override {
427 stale_while_revalidate,
428 ..
429 } = self
430 {
431 *stale_while_revalidate
432 } else {
433 None
434 }
435 }
436
437 pub fn set_stale_while_revalidate(&mut self, new_swr: u32) {
438 match self {
439 Self::Override {
440 stale_while_revalidate,
441 ..
442 } => *stale_while_revalidate = Some(new_swr),
443 _ => *self = Self::stale_while_revalidate(new_swr),
444 }
445 }
446
447 pub fn get_pci(&self) -> Option<bool> {
448 if let Self::Override { pci, .. } = self {
449 Some(*pci)
450 } else {
451 None
452 }
453 }
454
455 pub fn set_pci(&mut self, new_pci: bool) {
456 match self {
457 Self::Override { pci, .. } => *pci = new_pci,
458 _ => *self = Self::pci(new_pci),
459 }
460 }
461
462 pub fn get_surrogate_key(&self) -> Option<&HeaderValue> {
463 if let Self::Override { surrogate_key, .. } = self {
464 surrogate_key.as_ref()
465 } else {
466 None
467 }
468 }
469
470 pub fn set_surrogate_key(&mut self, new_surrogate_key: HeaderValue) {
471 match self {
472 Self::Override { surrogate_key, .. } => *surrogate_key = Some(new_surrogate_key),
473 _ => *self = Self::surrogate_key(new_surrogate_key),
474 }
475 }
476
477 pub const fn default() -> Self {
478 Self::None
479 }
480
481 #[doc(hidden)]
486 pub fn to_abi(&self) -> (u32, u32, u32, Option<&[u8]>) {
487 match *self {
488 Self::None => (CacheOverrideTag::empty().bits(), 0, 0, None),
489 Self::Pass => (CacheOverrideTag::PASS.bits(), 0, 0, None),
490 Self::Override {
491 ttl,
492 stale_while_revalidate,
493 pci,
494 ref surrogate_key,
495 } => {
496 let mut tag = CacheOverrideTag::empty();
497 let ttl = if let Some(ttl) = ttl {
498 tag |= CacheOverrideTag::TTL;
499 ttl
500 } else {
501 0
502 };
503 let swr = if let Some(swr) = stale_while_revalidate {
504 tag |= CacheOverrideTag::STALE_WHILE_REVALIDATE;
505 swr
506 } else {
507 0
508 };
509 if pci {
510 tag |= CacheOverrideTag::PCI;
511 }
512 let sk = surrogate_key.as_ref().map(HeaderValue::as_bytes);
513 (tag.bits(), ttl, swr, sk)
514 }
515 }
516 }
517}
518
519bitflags::bitflags! {
520 struct CacheOverrideTag: u32 {
524 const PASS = 1 << 0;
525 const TTL = 1 << 1;
526 const STALE_WHILE_REVALIDATE = 1 << 2;
527 const PCI = 1 << 3;
528 }
529}
530
531#[derive(Debug, Clone, Copy, Eq, PartialEq)]
532pub enum ClientCertVerifyResult {
533 Ok,
537 BadCertificate,
542 CertificateRevoked,
546 CertificateExpired,
550 UnknownCa,
556 CertificateMissing,
560 CertificateUnknown,
565}
566
567impl ClientCertVerifyResult {
568 pub fn from_u32(value: u32) -> ClientCertVerifyResult {
569 match value {
570 0 => ClientCertVerifyResult::Ok,
571 1 => ClientCertVerifyResult::BadCertificate,
572 2 => ClientCertVerifyResult::CertificateRevoked,
573 3 => ClientCertVerifyResult::CertificateExpired,
574 4 => ClientCertVerifyResult::UnknownCa,
575 5 => ClientCertVerifyResult::CertificateMissing,
576 _ => ClientCertVerifyResult::CertificateUnknown,
577 }
578 }
579}