O upload para s3 retorna SignatureDoesNotMatch

Tenho implementado upload direto para S3 para meu aplicativo heroku. Por algum tempo, obtive uma resposta 403 com SignatureDoesNotMatcherro. Após investigação, encontrei o problema. AWS S3 não gosta +de url. Em vez de quote_pluseu usei quote. Código fixo:

@app.route("/sign-s3/")
def sign_s3():
AWS_ACCESS_KEY
= app.config["AWS_ACCESS_KEY_ID"]
AWS_SECRET_KEY
= app.config["AWS_SECRET_ACCESS_KEY"]
S3_BUCKET
= app.config["S3_BUCKET"]

object_name
= quote(request.args.get("s3_object_name").encode('ascii', 'ignore')) # ignoring unicode for now (hmac issue)
mime_type
= request.args.get("s3_object_type")

expires
= int(time.time()) + 60 # 60 sec for starting request should be enough
amz_headers
= "x-amz-acl:public-read"

put_request
= "PUTnn%sn%dn%sn/%s/%s" % (mime_type, expires, amz_headers, S3_BUCKET, object_name)
signature
= base64.encodestring(hmac.new(AWS_SECRET_KEY, put_request, sha1).digest())
signature
= quote(signature.strip()).replace("/", "%2F")

app
.logger.info("signing for %s with signature %s", put_request, signature)
url
= "https://%s.s3.amazonaws.com/%s" % (S3_BUCKET, object_name)

return jsonify({
"signed_request": "%s?AWSAccessKeyId=%s&Expires=%d&Signature=%s" % (url, AWS_ACCESS_KEY, expires, signature),
"url": url
})

Eu também estava conseguindo net::ERR_CONNECTION_RESET. Encontrei o bug em s3upload.js. Quando o callback cantando é executado, ele codifica a url no formato errado com decodeURIComponent. Aqui está a solicitação de pull https://github.com/tadruj/s3upload-coffee-javascript/pull/8