处理错误的请求

时间:2018-01-09 04:55:52

标签: python urllib3

我收到:' HTTP / 1.1 400错误请求\ r \ n'而且我不明白为什么。它看起来像验证,然后有一个重定向,然后它现在不起作用。为什么会这样?

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<table>
  <thead>
      <tr>
          <th>Index</th>
          <th>Name</th>
          <th>Property</th>
          <th>Edit/Delete</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td class="index"></td>
          <td>NameOne</td>
          <td>PropOne</td>
          <td><span class="edit">Edit Icon</span> <span class="delete">Delete Icon</span></td>
      </tr>
      <tr>
          <td class="index"></td>
          <td>NameTwo</td>
          <td>PropTwo</td>
          <td><span class="edit">Edit Icon</span> <span class="delete">Delete Icon</span></td>
      </tr>
      <tr>
          <td class="index"></td>
          <td>NameThree</td>
          <td>PropThree</td>
          <td><span class="edit">Edit Icon</span> <span class="delete">Delete Icon</span></td>
      </tr>
  </tbody>
</table>

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

错误:

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

3 个答案:

答案 0 :(得分:3)

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())

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

答案 1 :(得分:1)

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

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

当然,你需要让git authed例如。使用ssh密钥或类似的

我认为没有办法在bitbucket中使用auth直接下载链接,然后你需要在bitbucket之外设置它。

答案 2 :(得分:1)

由于这是一个400,我猜这个对亚马逊S3服务的请求不喜欢也不应该有Authorization标题,但是在重定向时请求仍会传递它。

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