Merge "Replace string slicing with proper string methods"
This commit is contained in:
commit
b3d6fa1319
@ -293,14 +293,14 @@ def _parse_set_info_values(argvish):
|
|||||||
devs = builder.search_devs(parse_search_value(search_value))
|
devs = builder.search_devs(parse_search_value(search_value))
|
||||||
change = {}
|
change = {}
|
||||||
ip = ''
|
ip = ''
|
||||||
if len(change_value) and change_value[0].isdigit():
|
if change_value and change_value[0].isdigit():
|
||||||
i = 1
|
i = 1
|
||||||
while (i < len(change_value) and
|
while (i < len(change_value) and
|
||||||
change_value[i] in '0123456789.'):
|
change_value[i] in '0123456789.'):
|
||||||
i += 1
|
i += 1
|
||||||
ip = change_value[:i]
|
ip = change_value[:i]
|
||||||
change_value = change_value[i:]
|
change_value = change_value[i:]
|
||||||
elif len(change_value) and change_value[0] == '[':
|
elif change_value and change_value.startswith('['):
|
||||||
i = 1
|
i = 1
|
||||||
while i < len(change_value) and change_value[i] != ']':
|
while i < len(change_value) and change_value[i] != ']':
|
||||||
i += 1
|
i += 1
|
||||||
@ -318,14 +318,14 @@ def _parse_set_info_values(argvish):
|
|||||||
if change_value.startswith('R'):
|
if change_value.startswith('R'):
|
||||||
change_value = change_value[1:]
|
change_value = change_value[1:]
|
||||||
replication_ip = ''
|
replication_ip = ''
|
||||||
if len(change_value) and change_value[0].isdigit():
|
if change_value and change_value[0].isdigit():
|
||||||
i = 1
|
i = 1
|
||||||
while (i < len(change_value) and
|
while (i < len(change_value) and
|
||||||
change_value[i] in '0123456789.'):
|
change_value[i] in '0123456789.'):
|
||||||
i += 1
|
i += 1
|
||||||
replication_ip = change_value[:i]
|
replication_ip = change_value[:i]
|
||||||
change_value = change_value[i:]
|
change_value = change_value[i:]
|
||||||
elif len(change_value) and change_value[0] == '[':
|
elif change_value and change_value.startswith('['):
|
||||||
i = 1
|
i = 1
|
||||||
while i < len(change_value) and change_value[i] != ']':
|
while i < len(change_value) and change_value[i] != ']':
|
||||||
i += 1
|
i += 1
|
||||||
@ -1147,7 +1147,7 @@ def main(arguments=None):
|
|||||||
print(Commands.default.__doc__.strip())
|
print(Commands.default.__doc__.strip())
|
||||||
print()
|
print()
|
||||||
cmds = [c for c, f in Commands.__dict__.items()
|
cmds = [c for c, f in Commands.__dict__.items()
|
||||||
if f.__doc__ and c[0] != '_' and c != 'default']
|
if f.__doc__ and not c.startswith('_') and c != 'default']
|
||||||
cmds.sort()
|
cmds.sort()
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
print(Commands.__dict__[cmd].__doc__.strip())
|
print(Commands.__dict__[cmd].__doc__.strip())
|
||||||
|
@ -97,17 +97,17 @@ def clean_acl(name, value):
|
|||||||
values.append(raw_value)
|
values.append(raw_value)
|
||||||
continue
|
continue
|
||||||
first, second = (v.strip() for v in raw_value.split(':', 1))
|
first, second = (v.strip() for v in raw_value.split(':', 1))
|
||||||
if not first or first[0] != '.':
|
if not first or not first.startswith('.'):
|
||||||
values.append(raw_value)
|
values.append(raw_value)
|
||||||
elif first in ('.r', '.ref', '.referer', '.referrer'):
|
elif first in ('.r', '.ref', '.referer', '.referrer'):
|
||||||
if 'write' in name:
|
if 'write' in name:
|
||||||
raise ValueError('Referrers not allowed in write ACL: '
|
raise ValueError('Referrers not allowed in write ACL: '
|
||||||
'%s' % repr(raw_value))
|
'%s' % repr(raw_value))
|
||||||
negate = False
|
negate = False
|
||||||
if second and second[0] == '-':
|
if second and second.startswith('-'):
|
||||||
negate = True
|
negate = True
|
||||||
second = second[1:].strip()
|
second = second[1:].strip()
|
||||||
if second and second != '*' and second[0] == '*':
|
if second and second != '*' and second.startswith('*'):
|
||||||
second = second[1:].strip()
|
second = second[1:].strip()
|
||||||
if not second or second == '.':
|
if not second or second == '.':
|
||||||
raise ValueError('No host/domain value after referrer '
|
raise ValueError('No host/domain value after referrer '
|
||||||
@ -263,13 +263,13 @@ def referrer_allowed(referrer, referrer_acl):
|
|||||||
if referrer_acl:
|
if referrer_acl:
|
||||||
rhost = urlparse(referrer or '').hostname or 'unknown'
|
rhost = urlparse(referrer or '').hostname or 'unknown'
|
||||||
for mhost in referrer_acl:
|
for mhost in referrer_acl:
|
||||||
if mhost[0] == '-':
|
if mhost.startswith('-'):
|
||||||
mhost = mhost[1:]
|
mhost = mhost[1:]
|
||||||
if mhost == rhost or (mhost[0] == '.' and
|
if mhost == rhost or (mhost.startswith('.') and
|
||||||
rhost.endswith(mhost)):
|
rhost.endswith(mhost)):
|
||||||
allow = False
|
allow = False
|
||||||
elif mhost == '*' or mhost == rhost or \
|
elif mhost == '*' or mhost == rhost or \
|
||||||
(mhost[0] == '.' and rhost.endswith(mhost)):
|
(mhost.startswith('.') and rhost.endswith(mhost)):
|
||||||
allow = True
|
allow = True
|
||||||
return allow
|
return allow
|
||||||
|
|
||||||
|
@ -434,7 +434,7 @@ class DynamicLargeObject(object):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
if not container or not prefix or '?' in value or '&' in value or \
|
if not container or not prefix or '?' in value or '&' in value or \
|
||||||
prefix[0] == '/':
|
prefix.startswith('/'):
|
||||||
return HTTPBadRequest(
|
return HTTPBadRequest(
|
||||||
request=req,
|
request=req,
|
||||||
body=('X-Object-Manifest must be in the '
|
body=('X-Object-Manifest must be in the '
|
||||||
|
@ -68,7 +68,7 @@ class DomainRemapMiddleware(object):
|
|||||||
def __init__(self, app, conf):
|
def __init__(self, app, conf):
|
||||||
self.app = app
|
self.app = app
|
||||||
self.storage_domain = conf.get('storage_domain', 'example.com')
|
self.storage_domain = conf.get('storage_domain', 'example.com')
|
||||||
if self.storage_domain and self.storage_domain[0] != '.':
|
if self.storage_domain and not self.storage_domain.startswith('.'):
|
||||||
self.storage_domain = '.' + self.storage_domain
|
self.storage_domain = '.' + self.storage_domain
|
||||||
self.path_root = conf.get('path_root', 'v1').strip('/')
|
self.path_root = conf.get('path_root', 'v1').strip('/')
|
||||||
prefixes = conf.get('reseller_prefixes', 'AUTH')
|
prefixes = conf.get('reseller_prefixes', 'AUTH')
|
||||||
|
@ -272,7 +272,7 @@ class FormPost(object):
|
|||||||
hdrs['Content-Type'] or 'application/octet-stream'
|
hdrs['Content-Type'] or 'application/octet-stream'
|
||||||
status, subheaders, message = \
|
status, subheaders, message = \
|
||||||
self._perform_subrequest(env, attributes, fp, keys)
|
self._perform_subrequest(env, attributes, fp, keys)
|
||||||
if status[:1] != '2':
|
if not status.startswith('2'):
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
data = ''
|
data = ''
|
||||||
@ -337,7 +337,7 @@ class FormPost(object):
|
|||||||
del subenv['QUERY_STRING']
|
del subenv['QUERY_STRING']
|
||||||
subenv['HTTP_TRANSFER_ENCODING'] = 'chunked'
|
subenv['HTTP_TRANSFER_ENCODING'] = 'chunked'
|
||||||
subenv['wsgi.input'] = _CappedFileLikeObject(fp, max_file_size)
|
subenv['wsgi.input'] = _CappedFileLikeObject(fp, max_file_size)
|
||||||
if subenv['PATH_INFO'][-1] != '/' and \
|
if not subenv['PATH_INFO'].endswith('/') and \
|
||||||
subenv['PATH_INFO'].count('/') < 4:
|
subenv['PATH_INFO'].count('/') < 4:
|
||||||
subenv['PATH_INFO'] += '/'
|
subenv['PATH_INFO'] += '/'
|
||||||
subenv['PATH_INFO'] += attributes['filename'] or 'filename'
|
subenv['PATH_INFO'] += attributes['filename'] or 'filename'
|
||||||
|
@ -350,7 +350,7 @@ class _StaticWebContext(WSGIContext):
|
|||||||
if config_true_value(env.get('HTTP_X_WEB_MODE', 'f')):
|
if config_true_value(env.get('HTTP_X_WEB_MODE', 'f')):
|
||||||
return HTTPNotFound()(env, start_response)
|
return HTTPNotFound()(env, start_response)
|
||||||
return self.app(env, start_response)
|
return self.app(env, start_response)
|
||||||
if env['PATH_INFO'][-1] != '/':
|
if not env['PATH_INFO'].endswith('/'):
|
||||||
resp = HTTPMovedPermanently(
|
resp = HTTPMovedPermanently(
|
||||||
location=(env['PATH_INFO'] + '/'))
|
location=(env['PATH_INFO'] + '/'))
|
||||||
return resp(env, start_response)
|
return resp(env, start_response)
|
||||||
@ -415,13 +415,13 @@ class _StaticWebContext(WSGIContext):
|
|||||||
tmp_env['HTTP_USER_AGENT'] = \
|
tmp_env['HTTP_USER_AGENT'] = \
|
||||||
'%s StaticWeb' % env.get('HTTP_USER_AGENT')
|
'%s StaticWeb' % env.get('HTTP_USER_AGENT')
|
||||||
tmp_env['swift.source'] = 'SW'
|
tmp_env['swift.source'] = 'SW'
|
||||||
if tmp_env['PATH_INFO'][-1] != '/':
|
if not tmp_env['PATH_INFO'].endswith('/'):
|
||||||
tmp_env['PATH_INFO'] += '/'
|
tmp_env['PATH_INFO'] += '/'
|
||||||
tmp_env['PATH_INFO'] += self._index
|
tmp_env['PATH_INFO'] += self._index
|
||||||
resp = self._app_call(tmp_env)
|
resp = self._app_call(tmp_env)
|
||||||
status_int = self._get_status_int()
|
status_int = self._get_status_int()
|
||||||
if is_success(status_int) or is_redirection(status_int):
|
if is_success(status_int) or is_redirection(status_int):
|
||||||
if env['PATH_INFO'][-1] != '/':
|
if not env['PATH_INFO'].endswith('/'):
|
||||||
resp = HTTPMovedPermanently(
|
resp = HTTPMovedPermanently(
|
||||||
location=env['PATH_INFO'] + '/')
|
location=env['PATH_INFO'] + '/')
|
||||||
return resp(env, start_response)
|
return resp(env, start_response)
|
||||||
@ -429,7 +429,7 @@ class _StaticWebContext(WSGIContext):
|
|||||||
self._response_exc_info)
|
self._response_exc_info)
|
||||||
return resp
|
return resp
|
||||||
if status_int == HTTP_NOT_FOUND:
|
if status_int == HTTP_NOT_FOUND:
|
||||||
if env['PATH_INFO'][-1] != '/':
|
if not env['PATH_INFO'].endswith('/'):
|
||||||
tmp_env = make_env(
|
tmp_env = make_env(
|
||||||
env, 'GET', '/%s/%s/%s' % (
|
env, 'GET', '/%s/%s/%s' % (
|
||||||
self.version, self.account, self.container),
|
self.version, self.account, self.container),
|
||||||
|
@ -177,9 +177,9 @@ class TempAuth(object):
|
|||||||
'"/auth/" (Non-empty auth prefix path '
|
'"/auth/" (Non-empty auth prefix path '
|
||||||
'is required)' % self.auth_prefix)
|
'is required)' % self.auth_prefix)
|
||||||
self.auth_prefix = '/auth/'
|
self.auth_prefix = '/auth/'
|
||||||
if self.auth_prefix[0] != '/':
|
if not self.auth_prefix.startswith('/'):
|
||||||
self.auth_prefix = '/' + self.auth_prefix
|
self.auth_prefix = '/' + self.auth_prefix
|
||||||
if self.auth_prefix[-1] != '/':
|
if not self.auth_prefix.endswith('/'):
|
||||||
self.auth_prefix += '/'
|
self.auth_prefix += '/'
|
||||||
self.token_life = int(conf.get('token_life', 86400))
|
self.token_life = int(conf.get('token_life', 86400))
|
||||||
self.allow_overrides = config_true_value(
|
self.allow_overrides = config_true_value(
|
||||||
|
@ -284,44 +284,48 @@ class TempURL(object):
|
|||||||
DEFAULT_INCOMING_REMOVE_HEADERS.split())]
|
DEFAULT_INCOMING_REMOVE_HEADERS.split())]
|
||||||
#: Headers to remove from incoming requests. Uppercase WSGI env style,
|
#: Headers to remove from incoming requests. Uppercase WSGI env style,
|
||||||
#: like `HTTP_X_PRIVATE`.
|
#: like `HTTP_X_PRIVATE`.
|
||||||
self.incoming_remove_headers = [h for h in headers if h[-1] != '*']
|
self.incoming_remove_headers = \
|
||||||
|
[h for h in headers if not h.endswith('*')]
|
||||||
#: Header with match prefixes to remove from incoming requests.
|
#: Header with match prefixes to remove from incoming requests.
|
||||||
#: Uppercase WSGI env style, like `HTTP_X_SENSITIVE_*`.
|
#: Uppercase WSGI env style, like `HTTP_X_SENSITIVE_*`.
|
||||||
self.incoming_remove_headers_startswith = \
|
self.incoming_remove_headers_startswith = \
|
||||||
[h[:-1] for h in headers if h[-1] == '*']
|
[h[:-1] for h in headers if h.endswith('*')]
|
||||||
|
|
||||||
headers = [header_to_environ_key(h)
|
headers = [header_to_environ_key(h)
|
||||||
for h in conf.get('incoming_allow_headers',
|
for h in conf.get('incoming_allow_headers',
|
||||||
DEFAULT_INCOMING_ALLOW_HEADERS.split())]
|
DEFAULT_INCOMING_ALLOW_HEADERS.split())]
|
||||||
#: Headers to allow in incoming requests. Uppercase WSGI env style,
|
#: Headers to allow in incoming requests. Uppercase WSGI env style,
|
||||||
#: like `HTTP_X_MATCHES_REMOVE_PREFIX_BUT_OKAY`.
|
#: like `HTTP_X_MATCHES_REMOVE_PREFIX_BUT_OKAY`.
|
||||||
self.incoming_allow_headers = [h for h in headers if h[-1] != '*']
|
self.incoming_allow_headers = \
|
||||||
|
[h for h in headers if not h.endswith('*')]
|
||||||
#: Header with match prefixes to allow in incoming requests. Uppercase
|
#: Header with match prefixes to allow in incoming requests. Uppercase
|
||||||
#: WSGI env style, like `HTTP_X_MATCHES_REMOVE_PREFIX_BUT_OKAY_*`.
|
#: WSGI env style, like `HTTP_X_MATCHES_REMOVE_PREFIX_BUT_OKAY_*`.
|
||||||
self.incoming_allow_headers_startswith = \
|
self.incoming_allow_headers_startswith = \
|
||||||
[h[:-1] for h in headers if h[-1] == '*']
|
[h[:-1] for h in headers if h.endswith('*')]
|
||||||
|
|
||||||
headers = [h.title()
|
headers = [h.title()
|
||||||
for h in conf.get('outgoing_remove_headers',
|
for h in conf.get('outgoing_remove_headers',
|
||||||
DEFAULT_OUTGOING_REMOVE_HEADERS.split())]
|
DEFAULT_OUTGOING_REMOVE_HEADERS.split())]
|
||||||
#: Headers to remove from outgoing responses. Lowercase, like
|
#: Headers to remove from outgoing responses. Lowercase, like
|
||||||
#: `x-account-meta-temp-url-key`.
|
#: `x-account-meta-temp-url-key`.
|
||||||
self.outgoing_remove_headers = [h for h in headers if h[-1] != '*']
|
self.outgoing_remove_headers = \
|
||||||
|
[h for h in headers if not h.endswith('*')]
|
||||||
#: Header with match prefixes to remove from outgoing responses.
|
#: Header with match prefixes to remove from outgoing responses.
|
||||||
#: Lowercase, like `x-account-meta-private-*`.
|
#: Lowercase, like `x-account-meta-private-*`.
|
||||||
self.outgoing_remove_headers_startswith = \
|
self.outgoing_remove_headers_startswith = \
|
||||||
[h[:-1] for h in headers if h[-1] == '*']
|
[h[:-1] for h in headers if h.endswith('*')]
|
||||||
|
|
||||||
headers = [h.title()
|
headers = [h.title()
|
||||||
for h in conf.get('outgoing_allow_headers',
|
for h in conf.get('outgoing_allow_headers',
|
||||||
DEFAULT_OUTGOING_ALLOW_HEADERS.split())]
|
DEFAULT_OUTGOING_ALLOW_HEADERS.split())]
|
||||||
#: Headers to allow in outgoing responses. Lowercase, like
|
#: Headers to allow in outgoing responses. Lowercase, like
|
||||||
#: `x-matches-remove-prefix-but-okay`.
|
#: `x-matches-remove-prefix-but-okay`.
|
||||||
self.outgoing_allow_headers = [h for h in headers if h[-1] != '*']
|
self.outgoing_allow_headers = \
|
||||||
|
[h for h in headers if not h.endswith('*')]
|
||||||
#: Header with match prefixes to allow in outgoing responses.
|
#: Header with match prefixes to allow in outgoing responses.
|
||||||
#: Lowercase, like `x-matches-remove-prefix-but-okay-*`.
|
#: Lowercase, like `x-matches-remove-prefix-but-okay-*`.
|
||||||
self.outgoing_allow_headers_startswith = \
|
self.outgoing_allow_headers_startswith = \
|
||||||
[h[:-1] for h in headers if h[-1] == '*']
|
[h[:-1] for h in headers if h.endswith('*')]
|
||||||
#: HTTP user agent to use for subrequests.
|
#: HTTP user agent to use for subrequests.
|
||||||
self.agent = '%(orig)s TempURL'
|
self.agent = '%(orig)s TempURL'
|
||||||
|
|
||||||
|
@ -223,7 +223,7 @@ def is_valid_hostname(hostname):
|
|||||||
"""
|
"""
|
||||||
if len(hostname) < 1 or len(hostname) > 255:
|
if len(hostname) < 1 or len(hostname) > 255:
|
||||||
return False
|
return False
|
||||||
if hostname[-1] == ".":
|
if hostname.endswith('.'):
|
||||||
# strip exactly one dot from the right, if present
|
# strip exactly one dot from the right, if present
|
||||||
hostname = hostname[:-1]
|
hostname = hostname[:-1]
|
||||||
allowed = re.compile("(?!-)[A-Z\d-]{1,63}(?<!-)$", re.IGNORECASE)
|
allowed = re.compile("(?!-)[A-Z\d-]{1,63}(?<!-)$", re.IGNORECASE)
|
||||||
@ -328,13 +328,13 @@ def parse_search_value(search_value):
|
|||||||
search_value = search_value[i:]
|
search_value = search_value[i:]
|
||||||
if search_value.startswith('-'):
|
if search_value.startswith('-'):
|
||||||
search_value = search_value[1:]
|
search_value = search_value[1:]
|
||||||
if len(search_value) and search_value[0].isdigit():
|
if search_value and search_value[0].isdigit():
|
||||||
i = 1
|
i = 1
|
||||||
while i < len(search_value) and search_value[i] in '0123456789.':
|
while i < len(search_value) and search_value[i] in '0123456789.':
|
||||||
i += 1
|
i += 1
|
||||||
match['ip'] = search_value[:i]
|
match['ip'] = search_value[:i]
|
||||||
search_value = search_value[i:]
|
search_value = search_value[i:]
|
||||||
elif len(search_value) and search_value[0] == '[':
|
elif search_value and search_value.startswith('['):
|
||||||
i = 1
|
i = 1
|
||||||
while i < len(search_value) and search_value[i] != ']':
|
while i < len(search_value) and search_value[i] != ']':
|
||||||
i += 1
|
i += 1
|
||||||
@ -356,14 +356,14 @@ def parse_search_value(search_value):
|
|||||||
# replication parameters
|
# replication parameters
|
||||||
if search_value.startswith('R'):
|
if search_value.startswith('R'):
|
||||||
search_value = search_value[1:]
|
search_value = search_value[1:]
|
||||||
if len(search_value) and search_value[0].isdigit():
|
if search_value and search_value[0].isdigit():
|
||||||
i = 1
|
i = 1
|
||||||
while (i < len(search_value) and
|
while (i < len(search_value) and
|
||||||
search_value[i] in '0123456789.'):
|
search_value[i] in '0123456789.'):
|
||||||
i += 1
|
i += 1
|
||||||
match['replication_ip'] = search_value[:i]
|
match['replication_ip'] = search_value[:i]
|
||||||
search_value = search_value[i:]
|
search_value = search_value[i:]
|
||||||
elif len(search_value) and search_value[0] == '[':
|
elif search_value and search_value.startswith('['):
|
||||||
i = 1
|
i = 1
|
||||||
while i < len(search_value) and search_value[i] != ']':
|
while i < len(search_value) and search_value[i] != ']':
|
||||||
i += 1
|
i += 1
|
||||||
|
@ -972,7 +972,7 @@ class Request(object):
|
|||||||
the path segment.
|
the path segment.
|
||||||
"""
|
"""
|
||||||
path_info = self.path_info
|
path_info = self.path_info
|
||||||
if not path_info or path_info[0] != '/':
|
if not path_info or not path_info.startswith('/'):
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
slash_loc = path_info.index('/', 1)
|
slash_loc = path_info.index('/', 1)
|
||||||
|
@ -296,7 +296,7 @@ def config_auto_int_value(value, default):
|
|||||||
|
|
||||||
|
|
||||||
def append_underscore(prefix):
|
def append_underscore(prefix):
|
||||||
if prefix and prefix[-1] != '_':
|
if prefix and not prefix.endswith('_'):
|
||||||
prefix += '_'
|
prefix += '_'
|
||||||
return prefix
|
return prefix
|
||||||
|
|
||||||
@ -439,7 +439,8 @@ def get_log_line(req, res, trans_time, additional_info):
|
|||||||
|
|
||||||
|
|
||||||
def get_trans_id_time(trans_id):
|
def get_trans_id_time(trans_id):
|
||||||
if len(trans_id) >= 34 and trans_id[:2] == 'tx' and trans_id[23] == '-':
|
if len(trans_id) >= 34 and \
|
||||||
|
trans_id.startswith('tx') and trans_id[23] == '-':
|
||||||
try:
|
try:
|
||||||
return int(trans_id[24:34], 16)
|
return int(trans_id[24:34], 16)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
@ -1401,7 +1402,7 @@ class SwiftLogFormatter(logging.Formatter):
|
|||||||
record.exc_text = self.formatException(
|
record.exc_text = self.formatException(
|
||||||
record.exc_info).replace('\n', '#012')
|
record.exc_info).replace('\n', '#012')
|
||||||
if record.exc_text:
|
if record.exc_text:
|
||||||
if msg[-3:] != '#012':
|
if not msg.endswith('#012'):
|
||||||
msg = msg + '#012'
|
msg = msg + '#012'
|
||||||
msg = msg + record.exc_text
|
msg = msg + record.exc_text
|
||||||
|
|
||||||
|
@ -1416,7 +1416,7 @@ class ECAppIter(object):
|
|||||||
def put_fragments_in_queue(frag_iter, queue):
|
def put_fragments_in_queue(frag_iter, queue):
|
||||||
try:
|
try:
|
||||||
for fragment in frag_iter:
|
for fragment in frag_iter:
|
||||||
if fragment[0] == ' ':
|
if fragment.startswith(' '):
|
||||||
raise Exception('Leading whitespace on fragment.')
|
raise Exception('Leading whitespace on fragment.')
|
||||||
queue.put(fragment)
|
queue.put(fragment)
|
||||||
except GreenletExit:
|
except GreenletExit:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user