我收到:' 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
答案 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
标题中提取位置。