mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
More robust parsing of comma separated http lists
This commit is contained in:
parent
95ac70b875
commit
674817b8a4
@ -171,6 +171,51 @@ def create_sock_pair(port=0):
|
|||||||
|
|
||||||
return client_sock, srv_sock
|
return client_sock, srv_sock
|
||||||
|
|
||||||
|
def parse_http_list(header_val):
|
||||||
|
"""Parse lists as described by RFC 2068 Section 2.
|
||||||
|
|
||||||
|
In particular, parse comma-separated lists where the elements of
|
||||||
|
the list may include quoted-strings. A quoted-string could
|
||||||
|
contain a comma. A non-quoted string could have quotes in the
|
||||||
|
middle. Neither commas nor quotes count if they are escaped.
|
||||||
|
Only double-quotes count, not single-quotes.
|
||||||
|
"""
|
||||||
|
if isinstance(header_val, bytes):
|
||||||
|
slash, dquote, comma = b'\\",'
|
||||||
|
empty = b''
|
||||||
|
else:
|
||||||
|
slash, dquote, comma = '\\",'
|
||||||
|
empty = ''
|
||||||
|
|
||||||
|
part = empty
|
||||||
|
escape = quote = False
|
||||||
|
for cur in header_val:
|
||||||
|
if escape:
|
||||||
|
part += cur
|
||||||
|
escape = False
|
||||||
|
continue
|
||||||
|
if quote:
|
||||||
|
if cur == slash:
|
||||||
|
escape = True
|
||||||
|
continue
|
||||||
|
elif cur == dquote:
|
||||||
|
quote = False
|
||||||
|
part += cur
|
||||||
|
continue
|
||||||
|
|
||||||
|
if cur == comma:
|
||||||
|
yield part.strip()
|
||||||
|
part = empty
|
||||||
|
continue
|
||||||
|
|
||||||
|
if cur == dquote:
|
||||||
|
quote = True
|
||||||
|
|
||||||
|
part += cur
|
||||||
|
|
||||||
|
if part:
|
||||||
|
yield part.strip()
|
||||||
|
|
||||||
def sort_q_values(header_val):
|
def sort_q_values(header_val):
|
||||||
'Get sorted items from an HTTP header of type: a;q=0.5, b;q=0.7...'
|
'Get sorted items from an HTTP header of type: a;q=0.5, b;q=0.7...'
|
||||||
if not header_val:
|
if not header_val:
|
||||||
@ -185,7 +230,7 @@ def sort_q_values(header_val):
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
return e.strip(), q
|
return e.strip(), q
|
||||||
return tuple(map(itemgetter(0), sorted(map(item, header_val.split(',')), key=itemgetter(1), reverse=True)))
|
return tuple(map(itemgetter(0), sorted(map(item, parse_http_list(header_val)), key=itemgetter(1), reverse=True)))
|
||||||
|
|
||||||
def eintr_retry_call(func, *args, **kwargs):
|
def eintr_retry_call(func, *args, **kwargs):
|
||||||
while True:
|
while True:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user