def build_httpie_command(request): parts = ['http', '-j'] # Method if request.command != 'GET': parts.append(request.command) # URL parts.append(request.url()) # Authorization (prepare) method, token = request.auth() # Headers for header in sorted(request.headers): if header in EXCLUDE_HEADERS_HTTP: continue part = '{}:{}'.format(header, request.headers[header]) if header == 'Cookie': parts.append("'{}'".format(part)) else: parts.append(part) if method != 'Basic' and 'Authorization' in request.headers: header = 'Authorization' parts.append('{}:"{}"'.format(header, request.headers[header])) # JSON or raw data data = maybe_str(request.data()) if data: if request.headers.get('Content-Type') == 'application/json': for k, v in data.items(): k = k.replace('@', '\\' * 2 + '@') v = maybe_str(v) if isinstance(v, str): if ' ' in v: parts.append('{}="{}"'.format(k, v)) else: parts.append('{}={}'.format(k, v)) elif any([ v is None, isinstance(v, int), isinstance(v, float), isinstance(v, bool), ]): # JSON values parts.append('{}:={}'.format(k, json.dumps(v))) else: # JSON structures parts.append("{}:='{}'".format(k, json.dumps(v))) else: parts.append(data) # Authorization if method == 'Basic': parts.append('-a {}'.format(token)) return ' '.join(parts)
def build_requests_command(request): # Method tree = ast.parse('requests.{}()'.format(request.command.lower())) call = tree.body[0].value call.keywords = [] # URL call.args.append(ast.Str(request.url())) # Authorization (prepare) method, token = request.auth() # Headers header_keys = [] header_values = [] for header in sorted(request.headers): if header in EXCLUDE_HEADERS_REQUESTS: continue header_keys.append(ast.Str(header)) header_values.append(ast.Str(request.headers[header])) if method != 'Basic' and 'Authorization' in request.headers: header_keys.append(ast.Str('Authorization')) header_values.append(ast.Str(request.headers['Authorization'])) if header_keys and header_values: call.keywords.append( ast.keyword('headers', ast.Dict(header_keys, header_values))) # JSON or raw data data = maybe_str(request.data()) if data: if request.headers.get('Content-Type') == 'application/json': json_keys = [] json_values = [] for k, v in data.items(): json_keys.append(ast.Str(maybe_str(k))) v = maybe_str(v) if isinstance(v, str): json_values.append(ast.Str(v)) else: json_values.append(ast.parse(str(v)).body[0].value) if json_keys and json_values: call.keywords.append( ast.keyword('json', ast.Dict(json_keys, json_values))) else: call.keywords.append(ast.keyword('data', ast.Str(data))) # Authorization if method == 'Basic': token = maybe_str(token) call.keywords.append( ast.keyword('auth', ast.Tuple( tuple(map(ast.Str, token.split(':'))), None))) return astunparse.unparse(tree).strip()
def build_curl_command(request): parts = ['curl', '-i'] # Method if request.command != 'GET': parts.append('-X {}'.format(request.command)) # URL parts.append(request.url()) # Authorization (prepare) method, token = request.auth() # Headers for header in sorted(request.headers): if header in EXCLUDE_HEADERS: continue parts.append('-H "{}: {}"'.format(header, request.headers[header])) if method != 'Basic' and 'Authorization' in request.headers: header = 'Authorization' parts.append('-H "{}: {}"'.format(header, request.headers[header])) # JSON data = maybe_str(request.data()) if data: if request.headers.get('Content-Type') == 'application/json': data = json.dumps(data) parts.append('--data-raw \'{}\''.format(data)) # Authorization if method == 'Basic': parts.append('--user {}'.format(token)) return ' '.join(parts)
def build_httpie_command(request): parts = ['http'] redir_input = '' # Method if request.command != 'GET': parts.append(request.command) # URL parts.append(shlex_quote(request.url())) # Authorization (prepare) method, token = request.auth() # Headers for header in sorted(request.headers): if header in EXCLUDE_HEADERS_HTTP: continue parts.append('{}:{}'.format(header, shlex_quote( request.headers[header]))) # noqa if method != 'Basic' and 'Authorization' in request.headers: header = 'Authorization' parts.append('{}:{}'.format(header, shlex_quote( request.headers[header]))) # noqa # JSON or raw data data = maybe_str(request.data()) if data: content_type = request.headers.get('Content-Type', '') if is_json(content_type): # We need to explicitly set the separators to get consistent # whitespace handling across Python 2 and 3. See # https://bugs.python.org/issue16333 for details. redir_input = shlex_quote( json.dumps(data, indent=2, sort_keys=True, separators=(',', ': '))) elif is_form(content_type): parts[0] += ' --form' parts.append(data.replace('\n', ' ')) else: redir_input = shlex_quote(data) # Authorization if method == 'Basic': parts.append('-a {}'.format(token)) cmd = ' '.join(parts) if not redir_input: return cmd else: return 'echo {} | {}'.format(redir_input, cmd)
def astify_json_obj(obj): obj = maybe_str(obj) if isinstance(obj, str): return ast.Str(obj) elif isinstance(obj, bool): return ast.Name(obj, ast.Load()) elif isinstance(obj, int): return ast.Name(obj, ast.Load()) elif isinstance(obj, list): json_values = [] for v in obj: json_values.append(astify_json_obj(v)) return ast.List(json_values, ast.Load()) elif isinstance(obj, dict): json_values = [] json_keys = [] for k, v in obj.items(): json_keys.append(ast.Str(maybe_str(k))) json_values.append(astify_json_obj(v)) return ast.Dict(json_keys, json_values) else: raise Exception('Cannot astify {0:s}'.format(str(obj)))
def build_wget_command(request): parts = ['wget', '-S', '-O-'] # Method if request.command not in ['GET', 'POST']: parts.append('--method={}'.format(request.command)) # URL parts.append(shlex_quote(request.url())) # Authorization (prepare) method, token = request.auth() # Headers for header in sorted(request.headers): if header in EXCLUDE_HEADERS: continue header_line = shlex_quote('{}: {}'.format( header, request.headers[header])) # noqa: E501 parts.append('--header={}'.format(header_line)) if method != 'Basic' and 'Authorization' in request.headers: header = 'Authorization' header_line = shlex_quote('{}: {}'.format( header, request.headers[header])) # noqa: E501 parts.append('--header={}'.format(header_line)) # JSON or raw data data = maybe_str(request.data()) if data: if is_json(request.headers.get('Content-Type', '')): data = json.dumps(data) if request.command == 'POST': parts.append('--post-data=\'{}\''.format(data)) elif request.command != 'POST': parts.append('--body-data=\'{}\''.format(data)) # Authorization if method == 'Basic': user, password = token.split(':') parts.append('--auth-no-challenge') parts.append('--user={}'.format(user)) parts.append('--password={}'.format(password)) return ' '.join(parts)
def build_curl_command(request): parts = ['curl', '-i'] # Method if request.command != 'GET': parts.append('-X {}'.format(request.command)) # URL parts.append(shlex_quote(request.url())) # Authorization (prepare) method, token = request.auth() # Headers for header in sorted(request.headers): if header in EXCLUDE_HEADERS: continue header_line = shlex_double_quote( '{}: {}'.format(header, request.headers[header]), ) parts.append('-H {}'.format(header_line)) if method != 'Basic' and 'Authorization' in request.headers: header = 'Authorization' header_line = shlex_double_quote( '{}: {}'.format(header, request.headers[header]), ) parts.append('-H {}'.format(header_line)) # JSON data = maybe_str(request.data()) if data: if is_json(request.headers.get('Content-Type', '')): data = json.dumps(data) parts.append("--data-raw '{}'".format(data)) # Authorization if method == 'Basic': parts.append('--user {}'.format(token)) return ' '.join(parts)
def build_requests_command(request): # Method tree = ast.parse('requests.{}()'.format(request.command.lower())) call = tree.body[0].value call.keywords = [] # URL call.args.append(ast.Str(request.url())) # Authorization (prepare) method, token = request.auth() # Headers header_keys = [] header_values = [] for header in sorted(request.headers): if header in EXCLUDE_HEADERS_REQUESTS: continue header_keys.append(ast.Str(header)) header_values.append(ast.Str(request.headers[header])) if method != 'Basic' and 'Authorization' in request.headers: header_keys.append(ast.Str('Authorization')) header_values.append(ast.Str(request.headers['Authorization'])) if header_keys and header_values: call.keywords.append( ast.keyword('headers', ast.Dict(header_keys, header_values))) # JSON or raw data data = maybe_str(request.data()) def astify_json_obj(obj): obj = maybe_str(obj) if isinstance(obj, str): return ast.Str(obj) elif isinstance(obj, bool): return ast.Name(obj, ast.Load()) elif isinstance(obj, int): return ast.Name(obj, ast.Load()) elif isinstance(obj, float): return ast.Name(obj, ast.Load()) elif isinstance(obj, list): json_values = [] for v in obj: json_values.append(astify_json_obj(v)) return ast.List(json_values, ast.Load()) elif isinstance(obj, dict): json_values = [] json_keys = [] for k, v in obj.items(): json_keys.append(ast.Str(maybe_str(k))) json_values.append(astify_json_obj(v)) return ast.Dict(json_keys, json_values) else: raise Exception('Cannot astify {0:s}'.format(str(obj))) if data: if is_json(request.headers.get('Content-Type', '')): call.keywords.append(ast.keyword('json', astify_json_obj(data))) else: call.keywords.append(ast.keyword('data', ast.Str(data))) # Authorization if method == 'Basic': token = maybe_str(token) call.keywords.append( ast.keyword('auth', ast.Tuple(tuple(map(ast.Str, token.split(':'))), None))) return astunparse.unparse(tree).strip()
def test_maybe_str(): assert isinstance(utils.maybe_str(b''), str) assert isinstance(utils.maybe_str(b''.decode('utf-8')), str) assert isinstance(utils.maybe_str(''), str) assert not isinstance(utils.maybe_str(1), str)