Merge pull request #463 from hyperium/error-rename
refactor(error): remove redundant parts of error names
This commit is contained in:
		| @@ -43,8 +43,8 @@ use header::{ContentLength, Location}; | ||||
| use method::Method; | ||||
| use net::{NetworkConnector, NetworkStream, HttpConnector, ContextVerifier}; | ||||
| use status::StatusClass::Redirection; | ||||
| use {Url, HttpResult}; | ||||
| use HttpError::HttpUriError; | ||||
| use {Url}; | ||||
| use Error; | ||||
|  | ||||
| pub use self::pool::Pool; | ||||
| pub use self::request::Request; | ||||
| @@ -203,7 +203,7 @@ impl<'a, U: IntoUrl> RequestBuilder<'a, U> { | ||||
|     } | ||||
|  | ||||
|     /// Execute this request and receive a Response back. | ||||
|     pub fn send(self) -> HttpResult<Response> { | ||||
|     pub fn send(self) -> ::Result<Response> { | ||||
|         let RequestBuilder { client, method, url, headers, body } = self; | ||||
|         let mut url = try!(url.into_url()); | ||||
|         trace!("send {:?} {:?}", method, url); | ||||
| @@ -382,15 +382,15 @@ impl Default for RedirectPolicy { | ||||
|     } | ||||
| } | ||||
|  | ||||
| fn get_host_and_port(url: &Url) -> HttpResult<(String, u16)> { | ||||
| fn get_host_and_port(url: &Url) -> ::Result<(String, u16)> { | ||||
|     let host = match url.serialize_host() { | ||||
|         Some(host) => host, | ||||
|         None => return Err(HttpUriError(UrlError::EmptyHost)) | ||||
|         None => return Err(Error::Uri(UrlError::EmptyHost)) | ||||
|     }; | ||||
|     trace!("host={:?}", host); | ||||
|     let port = match url.port_or_default() { | ||||
|         Some(port) => port, | ||||
|         None => return Err(HttpUriError(UrlError::InvalidPort)) | ||||
|         None => return Err(Error::Uri(UrlError::InvalidPort)) | ||||
|     }; | ||||
|     trace!("port={:?}", port); | ||||
|     Ok((host, port)) | ||||
|   | ||||
| @@ -12,7 +12,6 @@ use net::{NetworkStream, NetworkConnector, HttpConnector, Fresh, Streaming}; | ||||
| use http::{self, HttpWriter, LINE_ENDING}; | ||||
| use http::HttpWriter::{ThroughWriter, ChunkedWriter, SizedWriter, EmptyWriter}; | ||||
| use version; | ||||
| use HttpResult; | ||||
| use client::{Response, get_host_and_port}; | ||||
|  | ||||
|  | ||||
| @@ -43,14 +42,14 @@ impl<W> Request<W> { | ||||
|  | ||||
| impl Request<Fresh> { | ||||
|     /// Create a new client request. | ||||
|     pub fn new(method: method::Method, url: Url) -> HttpResult<Request<Fresh>> { | ||||
|     pub fn new(method: method::Method, url: Url) -> ::Result<Request<Fresh>> { | ||||
|         let mut conn = HttpConnector(None); | ||||
|         Request::with_connector(method, url, &mut conn) | ||||
|     } | ||||
|  | ||||
|     /// Create a new client request with a specific underlying NetworkStream. | ||||
|     pub fn with_connector<C, S>(method: method::Method, url: Url, connector: &mut C) | ||||
|         -> HttpResult<Request<Fresh>> where | ||||
|         -> ::Result<Request<Fresh>> where | ||||
|         C: NetworkConnector<Stream=S>, | ||||
|         S: Into<Box<NetworkStream + Send>> { | ||||
|         let (host, port) = try!(get_host_and_port(&url)); | ||||
| @@ -76,7 +75,7 @@ impl Request<Fresh> { | ||||
|  | ||||
|     /// Consume a Fresh Request, writing the headers and method, | ||||
|     /// returning a Streaming Request. | ||||
|     pub fn start(mut self) -> HttpResult<Request<Streaming>> { | ||||
|     pub fn start(mut self) -> ::Result<Request<Streaming>> { | ||||
|         let mut uri = self.url.serialize_path().unwrap(); | ||||
|         //TODO: this needs a test | ||||
|         if let Some(ref q) = self.url.query { | ||||
| @@ -154,7 +153,7 @@ impl Request<Streaming> { | ||||
|     /// Completes writing the request, and returns a response to read from. | ||||
|     /// | ||||
|     /// Consumes the Request. | ||||
|     pub fn send(self) -> HttpResult<Response> { | ||||
|     pub fn send(self) -> ::Result<Response> { | ||||
|         let mut raw = try!(self.body.end()).into_inner().unwrap(); // end() already flushes | ||||
|         if !http::should_keep_alive(self.version, &self.headers) { | ||||
|             try!(raw.close(Shutdown::Write)); | ||||
|   | ||||
| @@ -12,7 +12,6 @@ use http::{self, HttpReader, RawStatus}; | ||||
| use http::HttpReader::{SizedReader, ChunkedReader, EofReader}; | ||||
| use status; | ||||
| use version; | ||||
| use HttpResult; | ||||
|  | ||||
| /// A response for a client request to a remote server. | ||||
| #[derive(Debug)] | ||||
| @@ -32,7 +31,7 @@ pub struct Response<S = HttpStream> { | ||||
| impl Response { | ||||
|  | ||||
|     /// Creates a new response from a server. | ||||
|     pub fn new(stream: Box<NetworkStream + Send>) -> HttpResult<Response> { | ||||
|     pub fn new(stream: Box<NetworkStream + Send>) -> ::Result<Response> { | ||||
|         let mut stream = BufReader::new(stream); | ||||
|  | ||||
|         let head = try!(http::parse_response(&mut stream)); | ||||
|   | ||||
							
								
								
									
										84
									
								
								src/error.rs
									
									
									
									
									
								
							
							
						
						
									
										84
									
								
								src/error.rs
									
									
									
									
									
								
							| @@ -1,88 +1,88 @@ | ||||
| //! HttpError and HttpResult module. | ||||
| use std::error::Error; | ||||
| //! Error and Result module. | ||||
| use std::error::Error as StdError; | ||||
| use std::fmt; | ||||
| use std::io::Error as IoError; | ||||
|  | ||||
| use httparse; | ||||
| use url; | ||||
|  | ||||
| use self::HttpError::{HttpMethodError, HttpUriError, HttpVersionError, | ||||
|                       HttpHeaderError, HttpStatusError, HttpIoError, | ||||
|                       HttpTooLargeError}; | ||||
| use self::Error::{Method, Uri, Version, | ||||
|                       Header, Status, Io, | ||||
|                       TooLarge}; | ||||
|  | ||||
|  | ||||
| /// Result type often returned from methods that can have `HttpError`s. | ||||
| pub type HttpResult<T> = Result<T, HttpError>; | ||||
| /// Result type often returned from methods that can have hyper `Error`s. | ||||
| pub type Result<T> = ::std::result::Result<T, Error>; | ||||
|  | ||||
| /// A set of errors that can occur parsing HTTP streams. | ||||
| #[derive(Debug)] | ||||
| pub enum HttpError { | ||||
| pub enum Error { | ||||
|     /// An invalid `Method`, such as `GE,T`. | ||||
|     HttpMethodError, | ||||
|     Method, | ||||
|     /// An invalid `RequestUri`, such as `exam ple.domain`. | ||||
|     HttpUriError(url::ParseError), | ||||
|     Uri(url::ParseError), | ||||
|     /// An invalid `HttpVersion`, such as `HTP/1.1` | ||||
|     HttpVersionError, | ||||
|     Version, | ||||
|     /// An invalid `Header`. | ||||
|     HttpHeaderError, | ||||
|     Header, | ||||
|     /// A message head is too large to be reasonable. | ||||
|     HttpTooLargeError, | ||||
|     TooLarge, | ||||
|     /// An invalid `Status`, such as `1337 ELITE`. | ||||
|     HttpStatusError, | ||||
|     Status, | ||||
|     /// An `IoError` that occured while trying to read or write to a network stream. | ||||
|     HttpIoError(IoError), | ||||
|     Io(IoError), | ||||
| } | ||||
|  | ||||
| impl fmt::Display for HttpError { | ||||
| impl fmt::Display for Error { | ||||
|     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||
|         f.write_str(self.description()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl Error for HttpError { | ||||
| impl StdError for Error { | ||||
|     fn description(&self) -> &str { | ||||
|         match *self { | ||||
|             HttpMethodError => "Invalid Method specified", | ||||
|             HttpUriError(_) => "Invalid Request URI specified", | ||||
|             HttpVersionError => "Invalid HTTP version specified", | ||||
|             HttpHeaderError => "Invalid Header provided", | ||||
|             HttpTooLargeError => "Message head is too large", | ||||
|             HttpStatusError => "Invalid Status provided", | ||||
|             HttpIoError(_) => "An IoError occurred while connecting to the specified network", | ||||
|             Method => "Invalid Method specified", | ||||
|             Uri(_) => "Invalid Request URI specified", | ||||
|             Version => "Invalid HTTP version specified", | ||||
|             Header => "Invalid Header provided", | ||||
|             TooLarge => "Message head is too large", | ||||
|             Status => "Invalid Status provided", | ||||
|             Io(_) => "An IoError occurred while connecting to the specified network", | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn cause(&self) -> Option<&Error> { | ||||
|     fn cause(&self) -> Option<&StdError> { | ||||
|         match *self { | ||||
|             HttpIoError(ref error) => Some(error), | ||||
|             HttpUriError(ref error) => Some(error), | ||||
|             Io(ref error) => Some(error), | ||||
|             Uri(ref error) => Some(error), | ||||
|             _ => None, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<IoError> for HttpError { | ||||
|     fn from(err: IoError) -> HttpError { | ||||
|         HttpIoError(err) | ||||
| impl From<IoError> for Error { | ||||
|     fn from(err: IoError) -> Error { | ||||
|         Io(err) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<url::ParseError> for HttpError { | ||||
|     fn from(err: url::ParseError) -> HttpError { | ||||
|         HttpUriError(err) | ||||
| impl From<url::ParseError> for Error { | ||||
|     fn from(err: url::ParseError) -> Error { | ||||
|         Uri(err) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<httparse::Error> for HttpError { | ||||
|     fn from(err: httparse::Error) -> HttpError { | ||||
| impl From<httparse::Error> for Error { | ||||
|     fn from(err: httparse::Error) -> Error { | ||||
|         match err { | ||||
|             httparse::Error::HeaderName => HttpHeaderError, | ||||
|             httparse::Error::HeaderValue => HttpHeaderError, | ||||
|             httparse::Error::NewLine => HttpHeaderError, | ||||
|             httparse::Error::Status => HttpStatusError, | ||||
|             httparse::Error::Token => HttpHeaderError, | ||||
|             httparse::Error::TooManyHeaders => HttpTooLargeError, | ||||
|             httparse::Error::Version => HttpVersionError, | ||||
|             httparse::Error::HeaderName => Header, | ||||
|             httparse::Error::HeaderValue => Header, | ||||
|             httparse::Error::NewLine => Header, | ||||
|             httparse::Error::Status => Status, | ||||
|             httparse::Error::Token => Header, | ||||
|             httparse::Error::TooManyHeaders => TooLarge, | ||||
|             httparse::Error::Version => Version, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -17,7 +17,6 @@ use typeable::Typeable; | ||||
| use unicase::UniCase; | ||||
|  | ||||
| use self::internals::Item; | ||||
| use error::HttpResult; | ||||
|  | ||||
| pub use self::shared::*; | ||||
| pub use self::common::*; | ||||
| @@ -113,7 +112,7 @@ impl Headers { | ||||
|     } | ||||
|  | ||||
|     #[doc(hidden)] | ||||
|     pub fn from_raw<'a>(raw: &[httparse::Header<'a>]) -> HttpResult<Headers> { | ||||
|     pub fn from_raw<'a>(raw: &[httparse::Header<'a>]) -> ::Result<Headers> { | ||||
|         let mut headers = Headers::new(); | ||||
|         for header in raw { | ||||
|             trace!("raw header: {:?}={:?}", header.name, &header.value[..]); | ||||
|   | ||||
							
								
								
									
										19
									
								
								src/http.rs
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								src/http.rs
									
									
									
									
									
								
							| @@ -13,8 +13,7 @@ use method::Method; | ||||
| use status::StatusCode; | ||||
| use uri::RequestUri; | ||||
| use version::HttpVersion::{self, Http10, Http11}; | ||||
| use HttpError::{HttpIoError, HttpTooLargeError}; | ||||
| use {HttpError, HttpResult}; | ||||
| use {Error}; | ||||
|  | ||||
| use self::HttpReader::{SizedReader, ChunkedReader, EofReader, EmptyReader}; | ||||
| use self::HttpWriter::{ThroughWriter, ChunkedWriter, SizedWriter, EmptyWriter}; | ||||
| @@ -334,17 +333,17 @@ const MAX_HEADERS: usize = 100; | ||||
|  | ||||
| /// Parses a request into an Incoming message head. | ||||
| #[inline] | ||||
| pub fn parse_request<R: Read>(buf: &mut BufReader<R>) -> HttpResult<Incoming<(Method, RequestUri)>> { | ||||
| pub fn parse_request<R: Read>(buf: &mut BufReader<R>) -> ::Result<Incoming<(Method, RequestUri)>> { | ||||
|     parse::<R, httparse::Request, (Method, RequestUri)>(buf) | ||||
| } | ||||
|  | ||||
| /// Parses a response into an Incoming message head. | ||||
| #[inline] | ||||
| pub fn parse_response<R: Read>(buf: &mut BufReader<R>) -> HttpResult<Incoming<RawStatus>> { | ||||
| pub fn parse_response<R: Read>(buf: &mut BufReader<R>) -> ::Result<Incoming<RawStatus>> { | ||||
|     parse::<R, httparse::Response, RawStatus>(buf) | ||||
| } | ||||
|  | ||||
| fn parse<R: Read, T: TryParse<Subject=I>, I>(rdr: &mut BufReader<R>) -> HttpResult<Incoming<I>> { | ||||
| fn parse<R: Read, T: TryParse<Subject=I>, I>(rdr: &mut BufReader<R>) -> ::Result<Incoming<I>> { | ||||
|     loop { | ||||
|         match try!(try_parse::<R, T, I>(rdr)) { | ||||
|             httparse::Status::Complete((inc, len)) => { | ||||
| @@ -355,12 +354,12 @@ fn parse<R: Read, T: TryParse<Subject=I>, I>(rdr: &mut BufReader<R>) -> HttpResu | ||||
|         } | ||||
|         match try!(rdr.read_into_buf()) { | ||||
|             0 if rdr.get_buf().is_empty() => { | ||||
|                 return Err(HttpIoError(io::Error::new( | ||||
|                 return Err(Error::Io(io::Error::new( | ||||
|                     io::ErrorKind::ConnectionAborted, | ||||
|                     "Connection closed" | ||||
|                 ))) | ||||
|             }, | ||||
|             0 => return Err(HttpTooLargeError), | ||||
|             0 => return Err(Error::TooLarge), | ||||
|             _ => () | ||||
|         } | ||||
|     } | ||||
| @@ -377,7 +376,7 @@ trait TryParse { | ||||
|     fn try_parse<'a>(headers: &'a mut [httparse::Header<'a>], buf: &'a [u8]) -> TryParseResult<Self::Subject>; | ||||
| } | ||||
|  | ||||
| type TryParseResult<T> = Result<httparse::Status<(Incoming<T>, usize)>, HttpError>; | ||||
| type TryParseResult<T> = Result<httparse::Status<(Incoming<T>, usize)>, Error>; | ||||
|  | ||||
| impl<'a> TryParse for httparse::Request<'a, 'a> { | ||||
|     type Subject = (Method, RequestUri); | ||||
| @@ -552,12 +551,12 @@ mod tests { | ||||
|     #[test] | ||||
|     fn test_parse_tcp_closed() { | ||||
|         use std::io::ErrorKind; | ||||
|         use error::HttpError::HttpIoError; | ||||
|         use error::Error; | ||||
|  | ||||
|         let mut empty = MockStream::new(); | ||||
|         let mut buf = BufReader::new(&mut empty); | ||||
|         match parse_request(&mut buf) { | ||||
|             Err(HttpIoError(ref e)) if e.kind() == ErrorKind::ConnectionAborted => (), | ||||
|             Err(Error::Io(ref e)) if e.kind() == ErrorKind::ConnectionAborted => (), | ||||
|             other => panic!("unexpected result: {:?}", other) | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -149,7 +149,7 @@ extern crate test; | ||||
| pub use mimewrapper::mime; | ||||
| pub use url::Url; | ||||
| pub use client::Client; | ||||
| pub use error::{HttpResult, HttpError}; | ||||
| pub use error::{Result, Error}; | ||||
| pub use method::Method::{Get, Head, Post, Delete}; | ||||
| pub use status::StatusCode::{Ok, BadRequest, NotFound}; | ||||
| pub use server::Server; | ||||
|   | ||||
| @@ -3,7 +3,7 @@ use std::fmt; | ||||
| use std::str::FromStr; | ||||
| use std::convert::AsRef; | ||||
|  | ||||
| use error::HttpError; | ||||
| use error::Error; | ||||
| use self::Method::{Options, Get, Post, Put, Delete, Head, Trace, Connect, Patch, | ||||
|                    Extension}; | ||||
|  | ||||
| @@ -87,10 +87,10 @@ impl Method { | ||||
| } | ||||
|  | ||||
| impl FromStr for Method { | ||||
|     type Err = HttpError; | ||||
|     fn from_str(s: &str) -> Result<Method, HttpError> { | ||||
|     type Err = Error; | ||||
|     fn from_str(s: &str) -> Result<Method, Error> { | ||||
|         if s == "" { | ||||
|             Err(HttpError::HttpMethodError) | ||||
|             Err(Error::Method) | ||||
|         } else { | ||||
|             Ok(match s { | ||||
|                 "OPTIONS" => Options, | ||||
|   | ||||
| @@ -33,8 +33,7 @@ pub use self::response::Response; | ||||
|  | ||||
| pub use net::{Fresh, Streaming}; | ||||
|  | ||||
| use HttpError::HttpIoError; | ||||
| use {HttpResult}; | ||||
| use Error; | ||||
| use buffer::BufReader; | ||||
| use header::{Headers, Expect}; | ||||
| use http; | ||||
| @@ -113,7 +112,7 @@ impl<'a, H: Handler + 'static> Server<'a, H, HttpListener> { | ||||
|  | ||||
| impl<'a, H: Handler + 'static> Server<'a, H, HttpListener> { | ||||
|     /// Binds to a socket, and starts handling connections using a task pool. | ||||
|     pub fn listen_threads<T: ToSocketAddrs>(self, addr: T, threads: usize) -> HttpResult<Listening> { | ||||
|     pub fn listen_threads<T: ToSocketAddrs>(self, addr: T, threads: usize) -> ::Result<Listening> { | ||||
|         let listener = try!(match self.ssl { | ||||
|             Some(SslConfig::CertAndKey(cert, key)) => HttpListener::https(addr, cert, key), | ||||
|             Some(SslConfig::Context(ssl_context)) => HttpListener::https_with_context(addr, ssl_context), | ||||
| @@ -123,7 +122,7 @@ impl<'a, H: Handler + 'static> Server<'a, H, HttpListener> { | ||||
|     } | ||||
|  | ||||
|     /// Binds to a socket and starts handling connections. | ||||
|     pub fn listen<T: ToSocketAddrs>(self, addr: T) -> HttpResult<Listening> { | ||||
|     pub fn listen<T: ToSocketAddrs>(self, addr: T) -> ::Result<Listening> { | ||||
|         self.listen_threads(addr, num_cpus::get() * 5 / 4) | ||||
|     } | ||||
| } | ||||
| @@ -133,12 +132,12 @@ H: Handler + 'static, | ||||
| L: NetworkListener<Stream=S> + Send + 'static, | ||||
| S: NetworkStream + Clone + Send> Server<'a, H, L> { | ||||
|     /// Creates a new server that will handle `HttpStream`s. | ||||
|     pub fn with_listener(self, listener: L, threads: usize) -> HttpResult<Listening> { | ||||
|     pub fn with_listener(self, listener: L, threads: usize) -> ::Result<Listening> { | ||||
|         with_listener(self.handler, listener, threads) | ||||
|     } | ||||
| } | ||||
|  | ||||
| fn with_listener<H, L>(handler: H, mut listener: L, threads: usize) -> HttpResult<Listening> | ||||
| fn with_listener<H, L>(handler: H, mut listener: L, threads: usize) -> ::Result<Listening> | ||||
| where H: Handler + 'static, | ||||
| L: NetworkListener + Send + 'static { | ||||
|     let socket = try!(listener.local_addr()); | ||||
| @@ -175,11 +174,11 @@ where S: NetworkStream + Clone, H: Handler { | ||||
|     while keep_alive { | ||||
|         let req = match Request::new(&mut rdr, addr) { | ||||
|             Ok(req) => req, | ||||
|             Err(HttpIoError(ref e)) if e.kind() == ErrorKind::ConnectionAborted => { | ||||
|             Err(Error::Io(ref e)) if e.kind() == ErrorKind::ConnectionAborted => { | ||||
|                 trace!("tcp closed, cancelling keep-alive loop"); | ||||
|                 break; | ||||
|             } | ||||
|             Err(HttpIoError(e)) => { | ||||
|             Err(Error::Io(e)) => { | ||||
|                 debug!("ioerror in keepalive loop = {:?}", e); | ||||
|                 break; | ||||
|             } | ||||
| @@ -235,7 +234,7 @@ impl Drop for Listening { | ||||
|  | ||||
| impl Listening { | ||||
|     /// Stop the server from listening to its socket address. | ||||
|     pub fn close(&mut self) -> HttpResult<()> { | ||||
|     pub fn close(&mut self) -> ::Result<()> { | ||||
|         let _ = self._guard.take(); | ||||
|         debug!("closing server"); | ||||
|         //try!(self.acceptor.close()); | ||||
|   | ||||
| @@ -5,7 +5,6 @@ | ||||
| use std::io::{self, Read}; | ||||
| use std::net::SocketAddr; | ||||
|  | ||||
| use {HttpResult}; | ||||
| use buffer::BufReader; | ||||
| use net::NetworkStream; | ||||
| use version::{HttpVersion}; | ||||
| @@ -35,7 +34,7 @@ impl<'a, 'b: 'a> Request<'a, 'b> { | ||||
|     /// Create a new Request, reading the StartLine and Headers so they are | ||||
|     /// immediately useful. | ||||
|     pub fn new(mut stream: &'a mut BufReader<&'b mut NetworkStream>, addr: SocketAddr) | ||||
|         -> HttpResult<Request<'a, 'b>> { | ||||
|         -> ::Result<Request<'a, 'b>> { | ||||
|  | ||||
|         let Incoming { version, subject: (method, uri), headers } = try!(http::parse_request(stream)); | ||||
|         debug!("Request Line: {:?} {:?} {:?}", method, uri, version); | ||||
|   | ||||
| @@ -3,7 +3,7 @@ use std::str::FromStr; | ||||
| use url::Url; | ||||
| use url::ParseError as UrlError; | ||||
|  | ||||
| use error::HttpError; | ||||
| use Error; | ||||
|  | ||||
| /// The Request-URI of a Request's StartLine. | ||||
| /// | ||||
| @@ -50,12 +50,12 @@ pub enum RequestUri { | ||||
| } | ||||
|  | ||||
| impl FromStr for RequestUri { | ||||
|     type Err = HttpError; | ||||
|     type Err = Error; | ||||
|  | ||||
|     fn from_str(s: &str) -> Result<RequestUri, HttpError> { | ||||
|     fn from_str(s: &str) -> Result<RequestUri, Error> { | ||||
|         let bytes = s.as_bytes(); | ||||
|         if bytes == [] { | ||||
|             Err(HttpError::HttpUriError(UrlError::InvalidCharacter)) | ||||
|             Err(Error::Uri(UrlError::InvalidCharacter)) | ||||
|         } else if bytes == b"*" { | ||||
|             Ok(RequestUri::Star) | ||||
|         } else if bytes.starts_with(b"/") { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user