google-apis-rs
google-apis-rs copied to clipboard
Unable to call `upload_resumable` when setting a thumbnail
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")) })
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.