maj/src/status_code.rs

133 lines
6.2 KiB
Rust

/// Status codes as specified in [the spec](https://gemini.circumlunar.space/docs/specification.html).
#[derive(Copy, Clone, num_derive::FromPrimitive, PartialEq, Debug)]
pub enum StatusCode {
/// The requested resource accepts a line of textual user input.
/// The <META> line is a prompt which should be displayed to the
/// user. The same resource should then be requested again with the
/// user's input included as a query component. Queries are
/// included in requests as per the usual generic URL definition in
/// RFC3986, i.e. separated from the path by a ?. Reserved characters
/// used in the user's input must be "percent-encoded" as per RFC3986,
/// and space characters should also be percent-encoded.
Input = 10,
/// As per status code 10, but for use with sensitive input such as
/// passwords. Clients should present the prompt as per status code
/// 10, but the user's input should not be echoed to the screen to
/// prevent it being read by "shoulder surfers".
SensitiveInput = 11,
/// The request was handled successfully and a response body will follow the response header. The <META> line is a MIME media type which applies to the response body.
Success = 20,
/// The server is redirecting the client to a new location for the
/// requested resource. There is no response body. <META> is a new
/// URL for the requested resource. The URL may be absolute or
/// relative. The redirect should be considered temporary, i.e.
/// clients should continue to request the resource at the original
/// address and should not performance convenience actions like
/// automatically updating bookmarks. There is no response body.
TemporaryRedirect = 30,
/// The requested resource should be consistently requested from the
/// new URL provided in future. Tools like search engine indexers or
/// content aggregators should update their configurations to avoid
/// requesting the old URL, and end-user clients may automatically
/// update bookmarks, etc. Note that clients which only pay attention
/// to the initial digit of status codes will treat this as a temporary
/// redirect. They will still end up at the right place, they just
/// won't be able to make use of the knowledge that this redirect is
/// permanent, so they'll pay a small performance penalty by having
///to follow the redirect each time.
PermanentRedirect = 31,
/// The request has failed. There is no response body. The nature of
/// the failure is temporary, i.e. an identical request MAY succeed
/// in the future. The contents of <META> may provide additional
/// information on the failure, and should be displayed to human users.
TemporaryFailure = 40,
/// The server is unavailable due to overload or maintenance. (cf HTTP
/// 503)
ServerUnavailable = 41,
/// A CGI process, or similar system for generating dynamic content,
/// died unexpectedly or timed out.
CGIError = 42,
/// A proxy request failed because the server was unable to
/// successfully complete a transaction with the remote host. (cf HTTP
/// 502, 504)
ProxyError = 43,
/// Rate limiting is in effect. <META> is an integer number of seconds
/// which the client must wait before another request is made to this
/// server. (cf HTTP 429)
SlowDown = 44,
/// The request has failed. There is no response body. The nature of
/// the failure is permanent, i.e. identical future requests will
/// reliably fail for the same reason. The contents of <META> may
/// provide additional information on the failure, and should be
/// displayed to human users. Automatic clients such as aggregators
/// or indexing crawlers should not repeat this request.
PermanentFailure = 50,
/// The requested resource could not be found but may be available in
/// the future. (cf HTTP 404) (struggling to remember this important
/// status code? Easy: you can't find things hidden at Area 51!)
NotFound = 51,
/// The resource requested is no longer available and will not be
/// available again. Search engines and similar tools should remove this
/// resource from their indices. Content aggregators should stop
/// requesting the resource and convey to their human users that the
/// subscribed resource is gone. (cf HTTP 410)
Gone = 52,
/// The request was for a resource at a domain not served by the server
/// and the server does not accept proxy requests.
ProxyRequestRefused = 53,
/// The server was unable to parse the client's request, presumably due
/// to a malformed request. (cf HTTP 400)
BadRequest = 59,
/// The requested resource requires a client certificate to access. If
/// the request was made without a certificate, it should be repeated
/// with one. If the request was made with a certificate, the server
/// did not accept it and the request should be repeated with a
/// different certificate. The contents of <META> (and/or the specific
/// 6x code) may provide additional information on certificate
/// requirements or the reason a certificate was rejected.
ClientCertificateRequired = 60,
/// The supplied client certificate is not authorised for accessing the
/// particular requested resource. The problem is not with the
/// certificate itself, which may be authorised for other resources.
CertificateNotAuthorized = 61,
/// The supplied client certificate was not accepted because it is not
/// valid. This indicates a problem with the certificate in and of itself,
/// with no consideration of the particular requested resource. The most
/// likely cause is that the certificate's validity start date is in the
/// future or its expiry date has passed, but this code may also
/// indicate an invalid signature, or a violation of a X509 standard
/// requirements. The <META> should provide more information about the
/// exact error.
CertificateNotValid = 62,
}
impl StatusCode {
// Converts this StatusCode to its numerical representation, consuming it.
pub fn num(self) -> u8 {
self as u8
}
}
impl Default for StatusCode {
fn default() -> Self {
StatusCode::Success
}
}