Requests: Anfragen 2.11: check_header_validity bei Header mit Integer-Wert fehlgeschlagen

Erstellt am 8. Aug. 2016  ·  23Kommentare  ·  Quelle: psf/requests

Hi,

Seit Anfragen 2.11 werden alle meine Anrufe, die Anfragen für meine App verwenden, unterbrochen. Nach dem Debuggen scheint diese Version Header mit Integer-Werten nicht wie zuvor zu akzeptieren.

2.10:

In [1]: import requests

In [2]: requests.get('http://bing.com', headers={'Content-Length': 42})
Out[2]: <Response [200]>

2.11

In [1]: import requests

In [2]: requests.get('http://bing.com', headers={'Content-Length': 42})
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\utils.py in check_header_validity(header)
    751     try:
--> 752         if not pat.match(value):
    753             raise InvalidHeader("Invalid return character or leading space in header: %s" % name)

TypeError: expected string or bytes-like object

During handling of the above exception, another exception occurred:

InvalidHeader                             Traceback (most recent call last)
<ipython-input-2-ae7ec2933e34> in <module>()
----> 1 requests.get('http://bing.com', headers={'Content-Length': 42})

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\api.py in get(url, params, **kwargs)
     68
     69     kwargs.setdefault('allow_redirects', True)
---> 70     return request('get', url, params=params, **kwargs)
     71
     72

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\api.py in request(method, url, **kwargs)
     54     # cases, and look like a memory leak in others.
     55     with sessions.Session() as session:
---> 56         return session.request(method=method, url=url, **kwargs)
     57
     58

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    455             hooks = hooks,
    456         )
--> 457         prep = self.prepare_request(req)
    458
    459         proxies = proxies or {}

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\sessions.py in prepare_request(self, request)
    388             auth=merge_setting(auth, self.auth),
    389             cookies=merged_cookies,
--> 390             hooks=merge_hooks(request.hooks, self.hooks),
    391         )
    392         return p

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\models.py in prepare(self, method, url, headers, files, data, params, auth, cookies, hooks, json)
    293         self.prepare_method(method)
    294         self.prepare_url(url, params)
--> 295         self.prepare_headers(headers)
    296         self.prepare_cookies(cookies)
    297         self.prepare_body(data, files, json)

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\models.py in prepare_headers(self, headers)
    407             for header in headers.items():
    408                 # Raise exception on invalid header value.
--> 409                 check_header_validity(header)
    410                 name, value = header
    411                 self.headers[to_native_string(name)] = value

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\utils.py in check_header_validity(header)
    754     except TypeError:
    755         raise InvalidHeader("Header value %s must be of type str or bytes, "
--> 756                             "not %s" % (value, type(value)))
    757
    758

InvalidHeader: Header value 42 must be of type str or bytes, not <class 'int'>

Wir definieren 'Content-Length' in jeder Anfrage. Wie auch immer, die Verwendung einer Ganzzahl für einen Header, der semantisch eine Ganzzahl ist, macht keinen Sinn?

Hilfreichster Kommentar

Scheint eine bahnbrechende Änderung für ein Dot-Release zu sein, nicht wahr?

Alle 23 Kommentare

Nicht-Strings für Header-Werte waren leider nie eine akzeptierte Methode zur Verwendung von Requests, und obwohl dies in früheren Versionen zulässig war, haben wir seitdem Änderungen vorgenommen, die dies nicht zulassen. Dies liegt in erster Linie daran, dass Header _wirklich_ Zeichenfolgen-String-Zuordnungen sind, aber auch daran, dass der allgemeine Ansatz, str für Dinge aufzurufen, die an Requests übergeben werden, dazu neigt, sich auf unerwartete Weise falsch zu verhalten, die Benutzer überrascht.

Die TL; DR davon ist: Ja, dies wurde mit Absicht gemacht, und nein, wir glauben nicht, dass es sich um einen Fehler handelt.

Siehe auch: #865.

Scheint eine bahnbrechende Änderung für ein Dot-Release zu sein, nicht wahr?

Und du hast diese riesige Modifikation nicht im ChangeLog beschrieben :(

Dies ist keine bahnbrechende API-Änderung – die API ist in der gesamten Dokumentation eindeutig als string-basiert dokumentiert. Die Tatsache, dass Sie es mit Ganzzahlen anstelle der beabsichtigten Eingabe verwendet haben, ist ein Fehler in Ihrem Code, nicht in dieser Codebasis oder einer Änderung in der API.

Es kann eine gute Idee sein, im Changelog eine Notiz zu dieser nicht brechenden Änderung hinzuzufügen.

@clarkbreyman-yammer Um es klar zu sagen, dies ist ein Grenzfall. Sie können die Entscheidungsfindung zuletzt in #3386 und #3388 sehen, aber das grundlegende Argument ist: Nicht-String-Header waren nie _vorgesehen_ zu funktionieren, daher ist die Tatsache, dass sie nicht mehr funktionieren, akzeptabel. Tatsächlich hat das früher in der Vergangenheit nicht funktioniert.

@lmazuel Sie haben Recht, dass dies im Changelog übersehen wurde, und das ist zu 100% meine Schuld: Der Bruch hier war zufällig auf unsere strengere Überprüfung der Header-Werte zurückzuführen, und infolgedessen habe ich es beim Kompilieren der nicht gesehen Änderungsprotokoll. Ich würde mich über eine PR freuen, die das Changelog aktualisiert, wenn Sie eines erstellen möchten.

Und da sind wir uns alle drei einig. Die Tatsache, dass das Senden einer ganzen Zahl dorthin _jemals_ funktionierte, war reines Glück. Früher hat es überhaupt nicht funktioniert und wir haben uns vor langer Zeit entschieden, dass es nie funktionieren sollte. Wir hatten jedoch nie etwas, das das _erzwungen_.

Abgesehen davon ist es möglicherweise eine großartige Idee, dies als unterstützte Funktion hinzuzufügen, und wäre eine willkommene API-Änderung in meinem Buch (wenn die Implementierung gut gemacht wurde). Der aktuelle Stand der Dinge dürfte jedoch für längere Zeit bestehen bleiben.

Eine Notiz im Changelog hinzugefügt.

Danke @kennethreitz.

Okay, danke für die Aufklärung. Ich werde meinen Code entsprechend aktualisieren.
@kennethreitz, wenn Sie Ihre Notiz auch in PyPI hinzufügen könnten, wäre es großartig.

@lmazuel drauf!

@lmazuel fertig

@lmazuel ps danke für die

Ich habe meinen Code korrigiert, alles andere funktioniert super. Vielen Dank für Ihre ultraschnelle Reaktionszeit!

in den offiziellen Dokumentationen wird die große Änderung nicht erwähnt. Es ist wirklich irreführend.

Es wird vom Requests-Team nicht als große Änderung angesehen, sondern als Fehlerbehebung, die innerhalb der Grenzen des dokumentierten Bibliotheksverhaltens liegt.

Hey @COLDMOUNT , du findest die Dokumentation hier im letzten Absatz aus dem Quickstart-Abschnitt für benutzerdefinierte Header. Wir haben auch die Änderung in HISTORY.rst für 2.11.0, das Changelog von Requests, veröffentlicht.

Es ist besser, ein Beispiel für die Header im str-Typ anzubieten, oder wie es geht
Übersetze einen Header im dict-Typ in den str-Typ, danke.

2016-09-27 1:30 GMT+08:00 Nate Prewitt [email protected] :

Hey @COLDMOUNT https://github.com/COLDMOUNT , du findest die
Dokumentation hier
http://docs.python-requests.org/en/master/user/quickstart/#custom -headers
im letzten Absatz aus dem Schnellstart-Abschnitt für benutzerdefinierte Kopfzeilen. Wir
veröffentlichte die Änderung auch in (HISTORY.rst)[ https://github.
com/kennethreitz/requests/blob/master/HISTORY.rst] für 2.11.0, das ist
Änderungsprotokoll der Anfragen.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249638650,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/ARIa89wU7tKL8Br2WWU6lJy8HEbNr72Vks5quAE3gaJpZM4JffFG
.

oder wie man einen Header im dict-Typ in den str-Typ übersetzt

Warte was? Wie hast du vorher Header gesendet?

Genau wie die Anleitung auf der Seite --
http://docs.python-requests.org/en/master/user/quickstart/ -- "Wenn Sie möchten,
wenn Sie einer Anfrage HTTP-Header hinzufügen möchten, übergeben Sie einfach ein dict an die Header
Parameter." Aber jetzt wird der dict-Typ nicht mehr akzeptiert, und was bedeutet die str
Typ aussehen?

2016-09-27 17:51 GMT+08:00 Cory Benfield [email protected] :

oder wie man einen Header im dict-Typ in den str-Typ übersetzt

Warte was? Wie hast du vorher Header gesendet?


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249819028,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/ARIa8_ZPJmzxH2lWmpTvSJ3PvHE7jlpvks5quOcrgaJpZM4JffFG
.

@COLDMOUNT dict wird _absolut_ akzeptiert, daran haben wir nichts geändert. Was wir geändert haben, ist, dass die Schlüssel und Werte dieses Diktats jetzt Zeichenfolgen sein müssen. Zuvor war es möglich, dass es sich um ein paar andere Typen handelte, was jetzt behoben wurde. Die Dokumentation muss nicht geändert werden.

Verstanden, cool! Vielen Dank! :)

2016-09-27 18:23 GMT+08:00 Cory Benfield [email protected] :

@COLDMOUNT https://github.com/COLDMOUNT dict wird _absolut_ akzeptiert,
das haben wir gar nicht geändert. Was wir geändert haben ist, dass die Schlüssel und
Werte dieses Diktats müssen jetzt Zeichenfolgen sein. Früher war es möglich für
es handelte sich um ein paar andere Typen aus Versehen, was jetzt behoben wurde. Die
Dokumentation muss nicht geändert werden.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249825918,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/ARIa8z0jZ-ovBtvFWl4hTXnkk_kJXobrks5quO6ggaJpZM4JffFG
.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen