1mod message;
117pub use message::*;
118mod message_ref;
120pub(crate) use message_ref::*;
121mod nom_extensions;
122mod parser;
123mod serializer;
124
125pub mod headers;
126pub use headers::{HeaderName, HeaderValue, Headers};
127
128pub use url::{Host, Url};
129
130use std::{fmt, num::NonZeroUsize};
131use tinyvec::TinyVec;
132
133#[derive(Copy, Clone, PartialEq, Eq, Debug)]
139#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
140pub enum Version {
141 V1_0,
143 V2_0,
145}
146
147#[derive(Clone, Copy, Debug, PartialEq, Eq)]
152#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
153pub enum StatusCode {
154 Continue,
156 Ok,
158 MovedPermanently,
160 Found,
162 SeeOther,
164 NotModified,
166 UseProxy,
168 BadRequest,
170 Unauthorized,
172 PaymentRequired,
174 Forbidden,
176 NotFound,
178 MethodNotAllowed,
180 NotAcceptable,
182 ProxyAuthenticationRequired,
184 RequestTimeout,
186 Gone,
188 PreconditionFailed,
190 RequestMessageBodyTooLarge,
192 RequestURITooLong,
194 UnsupportedMediaType,
196 ParameterNotUnderstood,
198 Reserved,
200 NotEnoughBandwidth,
202 SessionNotFound,
204 MethodNotValidInThisState,
206 HeaderFieldNotValidForResource,
208 InvalidRange,
210 ParameterIsReadOnly,
212 AggregateOperationNotAllowed,
214 OnlyAggregateOperationAllowed,
216 UnsupportedTransport,
218 DestinationUnreachable,
220 DestinationProhibited,
222 DataTransportNotReadyYet,
224 NotificationReasonUnknown,
226 KeyManagementError,
228 ConnectionAuthorizationRequired,
230 ConnectionCredentialsNotAccepted,
232 FailureToEstablishSecureConnection,
234 InternalServerError,
236 NotImplemented,
238 BadGateway,
240 ServiceUnavailable,
242 GatewayTimeout,
244 RTSPVersionNotSupported,
246 OptionNotSupported,
248 ProxyUnavailable,
250 Extension(u16),
252}
253
254impl StatusCode {
255 pub fn is_informational(self) -> bool {
257 let val = u16::from(self);
258
259 (100..200).contains(&val)
260 }
261
262 pub fn is_success(self) -> bool {
264 let val = u16::from(self);
265
266 (200..300).contains(&val)
267 }
268
269 pub fn is_redirection(self) -> bool {
271 let val = u16::from(self);
272
273 (300..400).contains(&val)
274 }
275
276 pub fn is_client_error(self) -> bool {
278 let val = u16::from(self);
279
280 (400..500).contains(&val)
281 }
282
283 pub fn is_server_error(self) -> bool {
285 let val = u16::from(self);
286
287 (500..600).contains(&val)
288 }
289}
290
291impl From<u16> for StatusCode {
293 fn from(v: u16) -> Self {
294 match v {
295 100 => StatusCode::Continue,
296 200 => StatusCode::Ok,
297 301 => StatusCode::MovedPermanently,
298 302 => StatusCode::Found,
299 303 => StatusCode::SeeOther,
300 304 => StatusCode::NotModified,
301 305 => StatusCode::UseProxy,
302 400 => StatusCode::BadRequest,
303 401 => StatusCode::Unauthorized,
304 402 => StatusCode::PaymentRequired,
305 403 => StatusCode::Forbidden,
306 404 => StatusCode::NotFound,
307 405 => StatusCode::MethodNotAllowed,
308 406 => StatusCode::NotAcceptable,
309 407 => StatusCode::ProxyAuthenticationRequired,
310 408 => StatusCode::RequestTimeout,
311 410 => StatusCode::Gone,
312 412 => StatusCode::PreconditionFailed,
313 413 => StatusCode::RequestMessageBodyTooLarge,
314 414 => StatusCode::RequestURITooLong,
315 415 => StatusCode::UnsupportedMediaType,
316 451 => StatusCode::ParameterNotUnderstood,
317 452 => StatusCode::Reserved,
318 453 => StatusCode::NotEnoughBandwidth,
319 454 => StatusCode::SessionNotFound,
320 455 => StatusCode::MethodNotValidInThisState,
321 456 => StatusCode::HeaderFieldNotValidForResource,
322 457 => StatusCode::InvalidRange,
323 458 => StatusCode::ParameterIsReadOnly,
324 459 => StatusCode::AggregateOperationNotAllowed,
325 460 => StatusCode::OnlyAggregateOperationAllowed,
326 461 => StatusCode::UnsupportedTransport,
327 462 => StatusCode::DestinationUnreachable,
328 463 => StatusCode::DestinationProhibited,
329 464 => StatusCode::DataTransportNotReadyYet,
330 465 => StatusCode::NotificationReasonUnknown,
331 466 => StatusCode::KeyManagementError,
332 470 => StatusCode::ConnectionAuthorizationRequired,
333 471 => StatusCode::ConnectionCredentialsNotAccepted,
334 472 => StatusCode::FailureToEstablishSecureConnection,
335 500 => StatusCode::InternalServerError,
336 501 => StatusCode::NotImplemented,
337 502 => StatusCode::BadGateway,
338 503 => StatusCode::ServiceUnavailable,
339 504 => StatusCode::GatewayTimeout,
340 505 => StatusCode::RTSPVersionNotSupported,
341 551 => StatusCode::OptionNotSupported,
342 553 => StatusCode::ProxyUnavailable,
343 v => StatusCode::Extension(v),
344 }
345 }
346}
347
348impl From<StatusCode> for u16 {
350 fn from(v: StatusCode) -> Self {
351 match v {
352 StatusCode::Continue => 100,
353 StatusCode::Ok => 200,
354 StatusCode::MovedPermanently => 301,
355 StatusCode::Found => 302,
356 StatusCode::SeeOther => 303,
357 StatusCode::NotModified => 304,
358 StatusCode::UseProxy => 305,
359 StatusCode::BadRequest => 400,
360 StatusCode::Unauthorized => 401,
361 StatusCode::PaymentRequired => 402,
362 StatusCode::Forbidden => 403,
363 StatusCode::NotFound => 404,
364 StatusCode::MethodNotAllowed => 405,
365 StatusCode::NotAcceptable => 406,
366 StatusCode::ProxyAuthenticationRequired => 407,
367 StatusCode::RequestTimeout => 408,
368 StatusCode::Gone => 410,
369 StatusCode::PreconditionFailed => 412,
370 StatusCode::RequestMessageBodyTooLarge => 413,
371 StatusCode::RequestURITooLong => 414,
372 StatusCode::UnsupportedMediaType => 415,
373 StatusCode::ParameterNotUnderstood => 451,
374 StatusCode::Reserved => 452,
375 StatusCode::NotEnoughBandwidth => 453,
376 StatusCode::SessionNotFound => 454,
377 StatusCode::MethodNotValidInThisState => 455,
378 StatusCode::HeaderFieldNotValidForResource => 456,
379 StatusCode::InvalidRange => 457,
380 StatusCode::ParameterIsReadOnly => 458,
381 StatusCode::AggregateOperationNotAllowed => 459,
382 StatusCode::OnlyAggregateOperationAllowed => 460,
383 StatusCode::UnsupportedTransport => 461,
384 StatusCode::DestinationUnreachable => 462,
385 StatusCode::DestinationProhibited => 463,
386 StatusCode::DataTransportNotReadyYet => 464,
387 StatusCode::NotificationReasonUnknown => 465,
388 StatusCode::KeyManagementError => 466,
389 StatusCode::ConnectionAuthorizationRequired => 470,
390 StatusCode::ConnectionCredentialsNotAccepted => 471,
391 StatusCode::FailureToEstablishSecureConnection => 472,
392 StatusCode::InternalServerError => 500,
393 StatusCode::NotImplemented => 501,
394 StatusCode::BadGateway => 502,
395 StatusCode::ServiceUnavailable => 503,
396 StatusCode::GatewayTimeout => 504,
397 StatusCode::RTSPVersionNotSupported => 505,
398 StatusCode::OptionNotSupported => 551,
399 StatusCode::ProxyUnavailable => 553,
400 StatusCode::Extension(v) => v,
401 }
402 }
403}
404
405impl fmt::Display for StatusCode {
407 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
408 match *self {
409 StatusCode::Continue => write!(fmt, "Continue"),
410 StatusCode::Ok => write!(fmt, "Ok"),
411 StatusCode::MovedPermanently => write!(fmt, "Moved Permanently"),
412 StatusCode::Found => write!(fmt, "Found"),
413 StatusCode::SeeOther => write!(fmt, "See Other"),
414 StatusCode::NotModified => write!(fmt, "Not Modified"),
415 StatusCode::UseProxy => write!(fmt, "Use Proxy"),
416 StatusCode::BadRequest => write!(fmt, "Bad Request"),
417 StatusCode::Unauthorized => write!(fmt, "Unauthorized"),
418 StatusCode::PaymentRequired => write!(fmt, "Payment Required"),
419 StatusCode::Forbidden => write!(fmt, "Forbidden"),
420 StatusCode::NotFound => write!(fmt, "Not Found"),
421 StatusCode::MethodNotAllowed => write!(fmt, "Method Not Allowed"),
422 StatusCode::NotAcceptable => write!(fmt, "Not Acceptable"),
423 StatusCode::ProxyAuthenticationRequired => write!(fmt, "Proxy Authentication Required"),
424 StatusCode::RequestTimeout => write!(fmt, "Request Timeout"),
425 StatusCode::Gone => write!(fmt, "Gone"),
426 StatusCode::PreconditionFailed => write!(fmt, "Precondition Failed"),
427 StatusCode::RequestMessageBodyTooLarge => write!(fmt, "Request Message Body Too Large"),
428 StatusCode::RequestURITooLong => write!(fmt, "Request URI Too Long"),
429 StatusCode::UnsupportedMediaType => write!(fmt, "Unsupported Media Type"),
430 StatusCode::ParameterNotUnderstood => write!(fmt, "Parameter Not Understood"),
431 StatusCode::Reserved => write!(fmt, "Reserved"),
432 StatusCode::NotEnoughBandwidth => write!(fmt, "Not Enough Bandwidth"),
433 StatusCode::SessionNotFound => write!(fmt, "Session Not Found"),
434 StatusCode::MethodNotValidInThisState => write!(fmt, "Method Not Valid In This State"),
435 StatusCode::HeaderFieldNotValidForResource => {
436 write!(fmt, "Header Field Not Valid For Resource")
437 }
438 StatusCode::InvalidRange => write!(fmt, "Invalid Range"),
439 StatusCode::ParameterIsReadOnly => write!(fmt, "Parameter Is Read-Only"),
440 StatusCode::AggregateOperationNotAllowed => {
441 write!(fmt, "Aggregate Operation Not Allowed")
442 }
443 StatusCode::OnlyAggregateOperationAllowed => {
444 write!(fmt, "Only Aggregate Operation ALlowed")
445 }
446 StatusCode::UnsupportedTransport => write!(fmt, "Unsupported Transport"),
447 StatusCode::DestinationUnreachable => write!(fmt, "Destination Unreachable"),
448 StatusCode::DestinationProhibited => write!(fmt, "Destination Prohibited"),
449 StatusCode::DataTransportNotReadyYet => write!(fmt, "Data Transport Not Ready Yet"),
450 StatusCode::NotificationReasonUnknown => write!(fmt, "Notification Reason Unknown"),
451 StatusCode::KeyManagementError => write!(fmt, "Key Management Error"),
452 StatusCode::ConnectionAuthorizationRequired => {
453 write!(fmt, "Connection Authorization Required")
454 }
455 StatusCode::ConnectionCredentialsNotAccepted => {
456 write!(fmt, "Connection Credentials Not Accepted")
457 }
458 StatusCode::FailureToEstablishSecureConnection => {
459 write!(fmt, "Failure To Establish Secure Connection")
460 }
461 StatusCode::InternalServerError => write!(fmt, "Internal Server Error"),
462 StatusCode::NotImplemented => write!(fmt, "Not Implemented"),
463 StatusCode::BadGateway => write!(fmt, "Bad Gateway"),
464 StatusCode::ServiceUnavailable => write!(fmt, "Service Unavailable"),
465 StatusCode::GatewayTimeout => write!(fmt, "Gateway Timeout"),
466 StatusCode::RTSPVersionNotSupported => write!(fmt, "RTSP Version Not Supported"),
467 StatusCode::OptionNotSupported => write!(fmt, "Option Not Supported"),
468 StatusCode::ProxyUnavailable => write!(fmt, "Proxy Unavailable"),
469 StatusCode::Extension(v) => write!(fmt, "Extension {v}"),
470 }
471 }
472}
473
474#[derive(Debug, PartialEq, Eq, Clone)]
479#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
480pub struct Empty;
481
482impl AsRef<[u8]> for Empty {
483 fn as_ref(&self) -> &[u8] {
484 &[]
485 }
486}
487
488#[derive(Debug)]
491pub enum ParseError {
492 Error,
494 Incomplete(Option<NonZeroUsize>),
496}
497
498impl std::error::Error for ParseError {}
499
500impl std::fmt::Display for ParseError {
501 fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
502 match *self {
503 ParseError::Error => write!(f, "Parse Error"),
504 ParseError::Incomplete(needed) => write!(f, "Incomplete message: {:?}", needed),
505 }
506 }
507}
508
509#[derive(Debug)]
512pub enum WriteError {
513 IoError(std::io::Error),
515}
516
517impl std::error::Error for WriteError {
518 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
519 match self {
520 WriteError::IoError(ref err) => Some(err),
521 }
522 }
523}
524
525impl std::fmt::Display for WriteError {
526 fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
527 match *self {
528 WriteError::IoError(ref error) => write!(f, "Write IO error: {error}"),
529 }
530 }
531}
532
533impl From<std::io::Error> for WriteError {
534 fn from(v: std::io::Error) -> Self {
535 WriteError::IoError(v)
536 }
537}