Tratar con mala solicitud

Recibo: ‘HTTP / 1.1 400 Bad Request \ r \ n’ y no entiendo por qué. Parece que se autentica y luego hay una redirección y ahora no funciona. ¿Por qué está pasando esto?

Pensé que era el encabezado y que faltaba el tipo de contenido, pero incluso agregando eso produjo el mismo resultado …

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 La línea 366 es donde comienza la descarga. Esto es desconcertante para decir lo menos.

Error:

 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' 

La API de BitBucket devuelve 302 para el /downloads/ punto final /downloads/ , por lo que el encabezado de Authorization se lleva a cabo en la siguiente solicitud, mientras que a Amazon no le gusta ese encabezado, por lo que devuelve 400. Una solución alternativa es volver a crear la solicitud redirigida manualmente. Por ejemplo: (comprobación de error omitida)

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

Por cierto, su token de acceso todavía es utilizable.

Debe darles acceso al repository creando un equipo dentro de bitbucket. Luego puedes usar git –export para descargar archivos

 git archive --remote=ssh://git@bitbucket.org//.git   --output output.tar 

Por supuesto, necesitas tener git autentificado, por ejemplo. usando una tecla ssh o similar

No creo que haya una manera de hacer enlaces de descarga directa con autenticación en bitbucket, entonces necesitas configurar eso fuera de bitbucket.

Como se trata de un 400, supongo que la solicitud al servicio S3 de Amazon no le gusta y no debería tener el encabezado de Authorization , pero las solicitudes se pasan de todos modos al redirigir.

Lo que debe hacer es usar allow_redirects=False y luego hacer la redirección, extrayendo la ubicación del encabezado de la ubicación de la respuesta.