Byron / google-apis-rs

A binding and CLI generator for all Google APIs
http://byron.github.io/google-apis-rs
Other
1.02k stars 136 forks source link

Unable to call `upload_resumable` when setting a thumbnail #331

Open rnag opened 2 years ago

rnag commented 2 years ago

first of all, this is an excellent library, so thank you! I have found that when it works, it works really well.

I'm currently running into an issue when calling the upload_resumable approach when using Thumbnails#set API to set a thumbnail on a YT video.

Here's how I'm calling it in my code:

self
            .hub
            .thumbnails()
            .set(video_id)
            .upload_resumable(content, "image/jpeg".parse().unwrap())
            .await
            .context("couldn't set thumbnail")?;

The error, from what I could gather, seems to indicate the following issue:

POST requests require a <code>Content-length</code> header. 

I've included the complete error I'm receiving from the YT API below.

Note that my current workaround is to use the upload method instead of upload_resumable, which seems to work well enough for my use case.

couldn't set thumbnail: Failure(Response { status: 411, version: HTTP/1.0, headers: {"content-type": "text/html; charset=UTF-8", "referrer-policy": "no-referrer", "content-length": "1564", "date": "Wed, 13 Apr 2022 14:57:37 GMT"}, body: Body(Full(b"<!DOCTYPE html>\n<html lang=en>\n  <meta charset=utf-8>\n  <meta name=viewport content=\"initial-scale=1, minimum-scale=1, width=device-width\">\n  <title>Error 411 (Length Required)!!1</title>\n  <style>\n    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}\n  </style>\n  <a href=//www.google.com/><span id=logo aria-label=Google></span></a>\n  <p><b>411.</b> <ins>That\xe2\x80\x99s an error.</ins>\n  <p>POST requests require a <code>Content-length</code> header.  <ins>That\xe2\x80\x99s all we know.</ins>\n")) })
Byron commented 2 years ago

Thanks for the praise, and thanks for reporting :).

This looks like upload_resumable should indeed set the content-length header, and a PR to achieve this would be very welcome. It might be that the current API works with std::io::Read which makes retrieving it ahead of time impossible, but if it would be changed to Read + Seek it should be possible to retrieve the size. Alternatively, the expected amount of bytes could be passed as additional argument. A fix, in any case, is a breaking change, but that's alright.