【问题标题】:Dealing with Bad request处理错误请求
【发布时间】:2018-01-09 04:55:52
【问题描述】:

我收到:“HTTP/1.1 400 Bad Request\r\n”,但我不明白为什么。看起来它进行了身份验证,然后进行了重定向,然后它现在不起作用。为什么会这样?

我原以为它是标题并且它缺少内容类型,但即使添加它也会产生相同的结果..

headers = {
    'basic_auth': 'brofewfefwefewef:EKAXsWkdt5H6yJEmtexN',
    'Content-Type': 'application/json'
}
client = Client(ClientConfig(), headers=headers, refresh=True)


class FileDownloader(object):
    ...Line 152...
    def _get_http_pool(self, secure=True):
        if secure:
            _http = urllib3.PoolManager(cert_reqs=str('CERT_REQUIRED'),
                                        ca_certs=certifi.where())
        else:
            _http = urllib3.PoolManager()

        if self.headers:
            content_type = self.headers.get('Content-Type')
            if 'Content-Type' in self.headers:
                del self.headers['Content-Type']
            _headers = urllib3.util.make_headers(**self.headers)
            _http.headers.update(_headers)
            if content_type:
                _http.headers['content-type'] = content_type
        print(_http.headers)
        return _http

https://github.com/JMSwag/PyUpdater/blob/master/pyupdater/client/downloader.py 第 366 行,是下载本身开始的地方。这至少可以说是令人困惑的。

错误:

DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.bitbucket.org
send: b'GET /2.0/repositories/Anexampleuser/repo/downloads/keys.gz HTTP/1.1\r\nHost: api.bitbucket.org\r\nAccept-Encoding: identity\r\nauthorization: Basic YnJvZmV3ZmVmd2VmZXdlZjpFS0FYc1drZHQ1SDZ5SkVtdGV4Tg==\r\n\r\n'
reply: 'HTTP/1.1 302 Found\r\n'
DEBUG:urllib3.connectionpool:https://api.bitbucket.org:443 "GET/2.0/repositories/Anexampleuser/repo/downloads/keys.gz HTTP/1.1" 302 0
DEBUG:urllib3.util.retry:Incremented Retry for (url='https://api.bitbucket.org/2.0/repositories/Anexampleuser/repo/downloads/keys.gz'): Retry(total=2, connect=None, read=None, redirect=None, status=None)
INFO:urllib3.poolmanager:Redirecting https://api.bitbucket.org/2.0/repositories/Anexampleuser/repo/downloads/keys.gz -> https://bbuseruploads.s3.amazonaws.com/a0e395b6-0c54-4efb-9074-57ec4190020b/downloads/3fc0be6d-ca69-42d3-9711-fbb5cfd2bc38/keys.gz?Signature=ZQxeUTvYC3Q%2Fo1aaS1CSuzyit0Q%3D&Expires=1515976464&AWSAccessKeyId=AKIAIQWXW6WLXMB5QZAQ&versionId=n.ymY11KRkq36Xozy25aChvfUT.YzTf5&response-content-disposition=attachment%3B%20filename%3D%22keys.gz%22
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): bbuseruploads.s3.amazonaws.com
header: Server header: Vary header: Content-Type header: X-OAuth-Scopes header: Strict-Transport-Security header: Date header: Location header: X-Served-By header: ETag header: X-Static-Version header: X-Content-Type-Options header: X-Accepted-OAuth-Scopes header: X-Credential-Type header: X-Render-Time header: Connection header: X-Request-Count header: X-Frame-Options header: X-Version header: Content-Length send: b'GET /a0e395b6-0c54-4efb-9074-57ec4190020b/downloads/3fc0be6d-ca69-42d3-9711-fbb5cfd2bc38/keys.gz?Signature=ZQxeUTvYC3Q%2Fo1aaS1CSuzyit0Q%3D&Expires=1515976464&AWSAccessKeyId=AKIAIQWXW6WLXMB5QZAQ&versionId=n.ymY11KRkq36Xozy25aChvfUT.YzTf5&response-content-disposition=attachment%3B%20filename%3D%22keys.gz%22 HTTP/1.1\r\nHost: bbuseruploads.s3.amazonaws.com\r\nAccept-Encoding: identity\r\nauthorization: Basic YnJvZmV3ZmVmd2VmZXdlZjpFS0FYc1drZHQ1SDZ5SkVtdGV4Tg==\r\n\r\n'
reply: 'HTTP/1.1 400 Bad Request\r\n'

【问题讨论】:

  • 切勿在您的问题中粘贴真实的身份验证数据。如果我有恶意,我可以轻松地遍历您的存储库并一一删除。我编辑了问题,但仍建议您立即更改密码/API 令牌。
  • 一定要尽快更改您的凭据 - 原始帖子仍然在编辑历史记录中可见。
  • 应用密码已更改。虽然他们是只读访问,所以不是一个巨大的安全问题。
  • 可能的 json 相关修复。错误 400 Urlib3 答案并不存在。我想这样的事情在理论上可能会解决,但还没有找到

标签: python urllib3


【解决方案1】:

BitBucket API 为 /downloads/ 端点返回 302,因此 Authorization 标头被执行到下一个请求,而亚马逊不喜欢该标头,因此它返回 400。解决方法是手动重新创建重定向的请求.例如:(省略错误检查)

import urllib3

http_pool = urllib3.PoolManager()
req = http_pool.urlopen(
    'GET', 'https://api.bitbucket.org/2.0/repositories/brofewfefwefewef/eee/downloads/keys.gz',
    redirect=False, headers={'Authorization': 'Basic YnJvZmV3ZmVmd2VmZXdlZjpFS0FYc1drZHQ1SDZ5SkVtdGV4Tg=='})
redirected_req = http_pool.urlopen('GET', req.headers['Location'], preload_content=False)
with open('keys.gz', 'wb') as f:
    f.write(redirected_req.read())

顺便说一句,您的访问令牌仍然可用。

【讨论】:

  • 谢谢:)。您能否提供一个示例以使其成功更新到 main-win-1.4.zip?我很感激
  • 我懒得建立一个测试 pyupdater 的 repo :) 我敢打赌你会从 pyupdater 作者那里得到更多反馈。
  • 很公平。公平地说,如果您将粘贴配置文件和 main.py 复制到任何目录中,它应该会告诉您确切的输出。你已经有了我的应用通行证和用户名;)
  • 这会将文件下载到当前目录。如果它可以更新当前的 main.exe,它将得到解决:)。可悲的是pyupdater的作者不是很活跃。
【解决方案2】:

您需要通过在 bitbucket 中创建一个团队来授予他们对存储库的访问权限。然后你可以使用 git --export 来下载文件

git archive --remote=ssh://git@bitbucket.org/<your-username>/<reponame>.git <branchname> <filename> --output output.tar

当然,您需要经过 git 身份验证,例如。使用 ssh 密钥或类似密钥

我认为没有办法在 bitbucket 中使用 auth 创建直接下载链接,那么您需要在 bitbucket 之外进行设置。

【讨论】:

  • 嗯...据我所知,您无法使用 bitbucket 下载存储库。如果您不希望您的帐户被盗,则必须使用 https 和应用密码。
【解决方案3】:

由于这是 400,我猜对 Amazon 的 S3 服务的请求不喜欢也不应该有 Authorization 标头,但请求在重定向时仍然通过它。

您应该做的是使用allow_redirects=False,然后自己进行重定向,从响应的Location 标头中提取位置。

【讨论】:

  • 感谢您的回复 :) 您能提供工作示例吗?我无法让它更新。我添加了 redirect=False 并尝试包含 Yen Chi Hsuan 的解决方案
猜你喜欢
  • 2013-10-02
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多