1use std::convert;
2use std::error;
3use std::fmt;
4use std::io;
5
6use super::message::Uri;
7
8pub type Result<T> = std::result::Result<T, Error>;
9
10#[derive(Debug)]
11pub enum Error {
12 Encoding,
15 RequestLineMalformed { line: String },
17 VersionMissing { line: String },
21 StatusCodeMissing { line: String },
24 MethodUnknown { method: String },
26 UriMissing { line: String },
30 UriMalformed { line: String, uri: String },
33 UriNotAbsolute { uri: Uri },
36 ReasonPhraseMissing { line: String },
39 VersionMalformed { line: String, version: String },
42 StatusCodeNotInteger { line: String, status_code: String },
45 HeaderMalformed { line: String },
47 ContentLengthMissing,
49 ContentLengthNotInteger { value: String },
52 HeadAlreadyDone,
56 BodyAlreadyDone,
60 MetadataNotParsed,
62 NotDone,
65 VersionUnknown,
68 TransportProtocolProfileMissing { value: String },
72 TransportLowerUnknown { value: String },
75 TransportParameterUnknown { var: String },
78 TransportParameterValueMissing { var: String },
81 TransportParameterValueInvalid { var: String, val: String },
83 TransportParameterInvalid { parameter: String },
85 TransportChannelMalformed { value: String },
87 TransportPortMalformed { value: String },
89 InterleavedInvalid,
92 InterleavedPayloadTooLarge,
95 RangeMalformed { value: String },
97 RangeUnitNotSupported { value: String },
99 RangeTimeNotSupported { value: String },
101 RangeNptTimeMalfored { value: String },
104 RtpInfoUrlMissing { value: String },
106 RtpInfoParameterUnknown { value: String },
109 RtpInfoParameterInvalid { value: String },
112 RtpInfoParameterUnexpected { value: String },
114 Shutdown,
117 Io(io::Error),
119}
120
121impl fmt::Display for Error {
122 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
123 match self {
124 Error::Encoding => write!(f, "encoding incorrect"),
125 Error::RequestLineMalformed { line } => write!(f, "request line malformed: {}", &line),
126 Error::VersionMissing { line } => {
127 write!(f, "version missing in request line: {}", &line)
128 }
129 Error::StatusCodeMissing { line } => {
130 write!(f, "status code missing in response line: {}", &line)
131 }
132 Error::MethodUnknown { method } => write!(f, "method unknown: {}", &method),
133 Error::UriMissing { line } => write!(f, "uri missing in request line: {}", &line),
134 Error::UriMalformed { line, uri } => {
135 write!(f, "uri malformed: {} (in line: {})", &uri, &line)
136 }
137 Error::UriNotAbsolute { uri } => {
138 write!(f, "uri must be absolute, but it is relative: {}", &uri)
139 }
140 Error::ReasonPhraseMissing { line } => {
141 write!(f, "reason phrase missing in response line: {}", &line)
142 }
143 Error::VersionMalformed { line, version } => {
144 write!(f, "version malformed: {} (in line: {})", &version, &line)
145 }
146 Error::StatusCodeNotInteger { line, status_code } => write!(
147 f,
148 "response has invalid status code: {} (in response line: {})",
149 &status_code, &line
150 ),
151 Error::HeaderMalformed { line } => write!(f, "header line malformed: {}", &line),
152 Error::ContentLengthMissing => write!(f, "request does not have Content-Length header"),
153 Error::ContentLengthNotInteger { value } => write!(
154 f,
155 "request has invalid value for Content-Length: {}",
156 &value
157 ),
158 Error::HeadAlreadyDone => write!(f, "head already done (cycle in state machine)"),
159 Error::BodyAlreadyDone => write!(f, "body already done (cycle in state machine)"),
160 Error::MetadataNotParsed => write!(f, "metadata not parsed"),
161 Error::NotDone => write!(f, "parser not done yet"),
162 Error::VersionUnknown => write!(f, "response has unknown version"),
163 Error::TransportProtocolProfileMissing { value } => {
164 write!(f, "transport protocol and/or profile missing: {}", &value)
165 }
166 Error::TransportLowerUnknown { value } => {
167 write!(f, "transport lower protocol unknown: {}", &value)
168 }
169 Error::TransportParameterUnknown { var } => {
170 write!(f, "transport parameter unknown: {}", &var)
171 }
172 Error::TransportParameterValueMissing { var } => write!(
173 f,
174 "transport parameter should have value but does not (var: {})",
175 &var
176 ),
177 Error::TransportParameterValueInvalid { var, val } => write!(
178 f,
179 "transport parameter value is invalid or malformed (var: {}, val: {})",
180 &var, &val
181 ),
182 Error::TransportParameterInvalid { parameter } => {
183 write!(f, "transport parameter invalid: {}", ¶meter)
184 }
185 Error::TransportChannelMalformed { value } => {
186 write!(f, "transport channel malformed: {}", &value)
187 }
188 Error::TransportPortMalformed { value } => {
189 write!(f, "transport port malformed: {}", &value)
190 }
191 Error::InterleavedInvalid => write!(
192 f,
193 "interleaved data does not have valid header magic character"
194 ),
195 Error::InterleavedPayloadTooLarge => write!(f, "interleaved payload too large"),
196 Error::RangeMalformed { value } => write!(f, "range malformed: {}", value),
197 Error::RangeUnitNotSupported { value } => {
198 write!(f, "range unit not supported: {}", &value)
199 }
200 Error::RangeTimeNotSupported { value } => {
201 write!(f, "range time not supported: {}", &value)
202 }
203 Error::RangeNptTimeMalfored { value } => {
204 write!(f, "range npt time malformed: {}", &value)
205 }
206 Error::RtpInfoUrlMissing { value } => write!(f, "rtp info url missing: {}", &value),
207 Error::RtpInfoParameterUnknown { value } => {
208 write!(f, "rtp info parameter unknown: {}", &value)
209 }
210 Error::RtpInfoParameterInvalid { value } => {
211 write!(f, "rtp info parameter invalid: {}", &value)
212 }
213 Error::RtpInfoParameterUnexpected { value } => {
214 write!(f, "rtp info contains unexpected parameter: {}", &value)
215 }
216 Error::Shutdown => write!(f, "underlying socket was shut down"),
217 Error::Io(err) => write!(f, "{}", err),
218 }
219 }
220}
221
222impl convert::From<io::Error> for Error {
223 fn from(error: io::Error) -> Self {
224 Error::Io(error)
225 }
226}
227
228impl error::Error for Error {}