diff options
| author | Zeyla Hellyer <[email protected]> | 2017-06-14 21:06:42 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-06-14 21:06:42 -0700 |
| commit | a3e843b0a3d379a96c983555274a4acf2268a78e (patch) | |
| tree | 2a6534ff26cbdc3bb23de4752099f6bec40b89a4 | |
| parent | Run clippy on examples (diff) | |
| download | serenity-a3e843b0a3d379a96c983555274a4acf2268a78e.tar.xz serenity-a3e843b0a3d379a96c983555274a4acf2268a78e.zip | |
Call send_files from http::send_file
When made, the `http::send_files` code was duplicated from
`http::send_file`. Instead call `http::send_files`, which provides a
fix for when an, e.g. 4xx status code, is received, and the library
would continue to deserialize the response as usual.
This fixes errors like:
```
Err(Json(ErrorImpl { code: Message("missing field `id`"), line: 1, column: 54 }))
```
Instead returning:
```
Err(Http(InvalidRequest(PayloadTooLarge)))
```
| -rw-r--r-- | src/http/mod.rs | 42 |
1 files changed, 7 insertions, 35 deletions
diff --git a/src/http/mod.rs b/src/http/mod.rs index b8a40ca..0dce8c8 100644 --- a/src/http/mod.rs +++ b/src/http/mod.rs @@ -1394,42 +1394,10 @@ pub fn remove_group_recipient(group_id: u64, user_id: u64) -> Result<()> { #[deprecated(since="0.2.0", note="Please use `send_files` instead.")] pub fn send_file<R: Read>(channel_id: u64, mut file: R, filename: &str, map: JsonMap) -> Result<Message> { - let uri = format!(api!("/channels/{}/messages"), channel_id); - let url = match Url::parse(&uri) { - Ok(url) => url, - Err(_) => return Err(Error::Url(uri)), - }; + let mut bytes = vec![]; + file.read_to_end(&mut bytes)?; - let tc = NativeTlsClient::new()?; - let connector = HttpsConnector::new(tc); - let mut request = Request::with_connector(Method::Post, url, &connector)?; - - request.headers_mut() - .set(header::Authorization(TOKEN.lock().unwrap().clone())); - request.headers_mut() - .set(header::UserAgent(constants::USER_AGENT.to_owned())); - - let mut request = Multipart::from_request(request)?; - - request.write_stream("file", &mut file, Some(filename), None)?; - - for (k, v) in map { - let _ = match v { - Value::Bool(false) => request.write_text(&k, "false")?, - Value::Bool(true) => request.write_text(&k, "true")?, - Value::Number(inner) => request.write_text(&k, inner.to_string())?, - Value::String(inner) => request.write_text(&k, inner)?, - _ => continue, - }; - } - - let response = request.send()?; - - if response.status.class() != StatusClass::Success { - return Err(Error::Http(HttpError::InvalidRequest(response.status))); - } - - serde_json::from_reader::<HyperResponse, Message>(response).map_err(From::from) + send_files(channel_id, vec![AttachmentType::Bytes((&bytes, filename))], map) } /// Sends file(s) to a channel. @@ -1491,6 +1459,10 @@ pub fn send_files<'a, T>(channel_id: u64, files: Vec<T>, map: JsonMap) let response = request.send()?; + if response.status.class() != StatusClass::Success { + return Err(Error::Http(HttpError::InvalidRequest(response.status))); + } + serde_json::from_reader::<HyperResponse, Message>(response).map_err(From::from) } |