zoukankan      html  css  js  c++  java
  • python解析curl命令内容

    将curl解析次字典形式,代码如下:

    # coding:utf-8
    import argparse
    import warnings
    from shlex import split
    from http.cookies import SimpleCookie
    from urllib.parse import urlparse
    from w3lib.http import basic_auth_header
    
    
    class CurlParser(argparse.ArgumentParser):
        def error(self, message):
            error_msg = 
                'There was an error parsing the curl command: {}'.format(message)
            raise ValueError(error_msg)
    
    
    # 自定义解析的内容 curl_parser
    = CurlParser() curl_parser.add_argument('url') curl_parser.add_argument('-H', '--header', dest='headers', action='append') curl_parser.add_argument('-X', '--request', dest='method', default='get') curl_parser.add_argument('-d', '--data-raw', dest='data') curl_parser.add_argument('-u', '--user', dest='auth') safe_to_ignore_arguments = [ ['--compressed'], # `--compressed` argument is not safe to ignore, but it's included here # because the `HttpCompressionMiddleware` is enabled by default ['-s', '--silent'], ['-v', '--verbose'], ['-#', '--progress-bar'] ] for argument in safe_to_ignore_arguments: curl_parser.add_argument(*argument, action='store_true') def curl_to_request_kwargs(curl_command, ignore_unknown_options=True): """Convert a cURL command syntax to Request kwargs. :param str curl_command: string containing the curl command :param bool ignore_unknown_options: If true, only a warning is emitted when cURL options are unknown. Otherwise raises an error. (default: True) :return: dictionary of Request kwargs """ curl_args = split(curl_command) if curl_args[0] != 'curl': raise ValueError('A curl command must start with "curl"') parsed_args, argv = curl_parser.parse_known_args(curl_args[1:]) if argv: msg = 'Unrecognized options: {}'.format(', '.join(argv)) if ignore_unknown_options: warnings.warn(msg) else: raise ValueError(msg) url = parsed_args.url # curl automatically prepends 'http' if the scheme is missing, but Request # needs the scheme to work parsed_url = urlparse(url) print(parsed_url, "parsed_url---") if not parsed_url.scheme: url = 'http://' + url result = {'method': parsed_args.method.upper(), 'url': url} headers = [] cookies = {} for header in parsed_args.headers or (): name, val = header.split(':', 1) name = name.strip() val = val.strip() if name.title() == 'Cookie': for name, morsel in SimpleCookie(val).items(): cookies[name] = morsel.value else: headers.append((name, val)) if parsed_args.auth: user, password = parsed_args.auth.split(':', 1) headers.append(('Authorization', basic_auth_header(user, password))) if headers: result['headers'] = headers if cookies: result['cookies'] = cookies if parsed_args.data: result['body'] = parsed_args.data return result

    调度如下:

    import curl_to_request_kwargs
    #忽略未知参数
    curl_command = """
                    curl --location -g --request GET '{{baseUrl}}/api/v1/ps/get?l=22&kj=5' 
                    --header 'ab: 11' 
                    --header 'fg: dfg' 
                    --header "Content-Type: text/plain" 
                    --data-raw '{"s": 0}'
                   """
    result = curl_to_request_kwargs(curl_command)
    #不忽略未知参数
    result = curl_to_request_kwargs(curl_command,False)

    解析结果如下:

    {'method': 'GET', 'url': 'http://{{baseUrl}}/api/v1/ps/get?l=22&kj=5', 'headers': [('ab', '11'), ('fg', 'dfg'), ('Content-Type', 'text/plain')], 'body': '{"s": 0}'}

    结束!

  • 相关阅读:
    Qt Quick实现的涂鸦程序
    Java并发学习之十九——线程同步工具之Phaser
    poj 1845(等比数列前n项和及高速幂)
    装饰模式(旧恋)
    cocos2d-x 3.1.1 学习笔记[3]Action 动作
    Nmap 源代码学习四 软件简单使用
    关于phpcmsv9更新缓存出现链接被重置的问题
    POJ 3159 Candies(SPFA+栈)差分约束
    Ubuntu 配置ISCSI服务
    iSCSI存储技术
  • 原文地址:https://www.cnblogs.com/aaronthon/p/15123690.html
Copyright © 2011-2022 走看看