Python Simple SOAP Library

Overview

PySimpleSOAP / soap2py

Python simple and lightweight SOAP library for client and server webservices interfaces, aimed to be as small and easy as possible, supporting most common functionality. Initially it was inspired by PHP Soap Extension (mimicking its functionality, simplicity and ease of use), with many advanced features added.

Supports Python 3 (same codebase, no need to run 2to3)

Goals

  • Simple: originally less than 200LOC client/server concrete implementation for easy maintainability and enhancements.
  • Flexible: adapted to several SOAP dialects/servers (Java Axis, .Net, WCF, JBoss, "jetty"), with the possibility of fine-tuning XML request and responses
  • Pythonic: no artifacts, no class generation, no special types, RPC calls parameters and return values are simple python structures (dicts, list, etc.)
  • Dynamic: no definition (WSDL) required, dynamic generation and parsing supported (cached in a pickle file for performance, supporting fixing broken WSDL)
  • Easy: simple xml manipulation, including basic serialization and raw object-like access to SOAP messages
  • Extensible: supports several HTTP wrappers (httplib2, pycurl, urllib2) for special transport needs over SSL and proxy (ISA)
  • WSGI compliant: server dispatcher can be integrated to other python frameworks (web2py, django, etc.)
  • Backwards compatible: stable API, no breaking changes between releases
  • Lightweight: low memory footprint and fast processing (an order of magnitude in some situations, relative to other implementations)

History

Client initially developed for AFIP (Argentina's IRS) web services: electronic invoice, tax bonus, insurance, foreign trade, agriculture, customs, etc. (http://code.google.com/p/pyafipws/wiki/ProjectSummary)

Now it has been extended to support other webservices like Currency Exchange Control and TrazaMed (National Traceability of Medical Drugs Program)

Also, includes Server side support (a generic dispatcher, in order to be exposed from web2py service framework, adaptable to other webservers, including examples for standalone WSGI and django)

Source Code originally available on GoogleCode

Changelog

Recent changes (2014/2015):

  • Plug-in system to support for WSSE (Web-Services Security extensions)
  • WSSE UsernameToken, UsernameDigestToken and BinaryTokenSignature support
  • Pythonic XML Security Library basic implementation (canonicalization, SHA1 hashing and RSA signing / verification using X509 digital certificates)
  • Improved SOAP Fault details
  • Several fixes (basic python3 support, CDATA, )
  • [Breaking] Fixed bugs that occur when dealing with WSDL's that contain nested complex types. Such WSDL's are commonly generated by .NET WCF services that have been developed using "contract first" style where developers define classes with a full inheritance hierarchy that are implicitly converted to WCF soap services. See Issue #42 (https://github.com/pysimplesoap/pysimplesoap/issues/42).

Ongoing efforts:

  • Unit Tests update & clean up (removing old tests, better framework, fixing non-deterministic results, etc.)
  • WSDL advanced support (unifying nested elements structure dialects)
  • Python3 support for WSSE XMLSec (M2Crypto alternatives?)
  • Source code refactoring to improve readability and maintainability
  • Improving interop with .NET WCF services

Previous contributed features (circa 2013, forked and merged back):

  • Corrected support for multiple SOAP ports/bindings
  • Support for both import and include stanzas in WSDL
  • Support for a WSDL base directory to deal with relative pathnames in import/include stanzas
  • Somewhat saner tracing/logging (traces now go to log.debug(), which you can handle per module)
  • Somewhat more readable logic (by removing a bunch of helpers to a separate file)

Testing

Using Python 2.7+:

python -m unittest discover

Using older Python versions:

python -m unittest tests/suite.py

Code coverage:

sudo pip install coverage
coverage run tests/suite.py
coverage report -m
coverage html

Support

For community support, please fell free to fill an issue or send an email to [email protected]. Please do not add comment to wiki pages if you have technical questions.

For priority commercial technical support, you can contact Mariano Reingart (project creator and main maintainer, see AUTHORS for more info).

Comments
  • Problems with Nested ComplexTypes in WSDL

    Problems with Nested ComplexTypes in WSDL

    There are issues interpreting XML schema definitions with nested complex types. It looks like there are multiple different symptoms of this issue, but I am providing a repro of a case where the service wsdl defines a property as an array, yet the PySimpleSoap client sees it as a single object.

    I've been able to reproduce this using .NET WCF services, defined as such:

    classdiagram1

    The relevant schema from the wsdl looks like this:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/ComplexWsdl" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/ComplexWsdl">
        <xs:complexType name="IcedCoffee">
            <xs:complexContent mixed="false">
                <xs:extension base="tns:Coffee">
                    <xs:sequence>
                        <xs:element minOccurs="0" name="IceCubes" type="xs:int" />
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
        <xs:element name="IcedCoffee" nillable="true" type="tns:IcedCoffee" />
        <xs:complexType name="Coffee">
            <xs:complexContent mixed="false">
                <xs:extension base="tns:Beverage">
                    <xs:sequence>
                        <xs:element minOccurs="0" name="Beans" nillable="true" type="tns:ArrayOfCoffeeBean" />
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
        <xs:element name="Coffee" nillable="true" type="tns:Coffee" />
        <xs:complexType name="Beverage">
            <xs:sequence>
                <xs:element minOccurs="0" name="Ingredients" nillable="true" type="tns:ArrayOfIngredient" />
                <xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
        <xs:element name="Beverage" nillable="true" type="tns:Beverage" />
        <xs:complexType name="ArrayOfIngredient">
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" name="Ingredient" nillable="true" type="tns:Ingredient" />
            </xs:sequence>
        </xs:complexType>
        <xs:element name="ArrayOfIngredient" nillable="true" type="tns:ArrayOfIngredient" />
        <xs:complexType name="Ingredient">
            <xs:sequence>
                <xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
        <xs:element name="Ingredient" nillable="true" type="tns:Ingredient" />
        <xs:complexType name="ArrayOfCoffeeBean">
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" name="CoffeeBean" nillable="true" type="tns:CoffeeBean" />
            </xs:sequence>
        </xs:complexType>
        <xs:element name="ArrayOfCoffeeBean" nillable="true" type="tns:ArrayOfCoffeeBean" />
        <xs:complexType name="CoffeeBean">
            <xs:sequence>
                <xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
                <xs:element minOccurs="0" name="Roast" nillable="true" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
        <xs:element name="CoffeeBean" nillable="true" type="tns:CoffeeBean" />
    </xs:schema>
    

    The PySimpleSoap client is incorrectly interpreting that the Ingredients property as single object of Ingredient:

    Port name: BasicHttpBinding_ICoffeeService
    Operation Name:  SubmitIcedCoffee
    SOAPAction:  http://tempuri.org/ICoffeeService/SubmitIcedCoffee
    Input:  {
        "SubmitIcedCoffee": {
            "icedCoffee": {
                "IceCubes": "<type 'int'>",
                "Beans": [
                    {
                        "CoffeeBean": {
                            "Name": "<type 'str'>",
                            "Roast": "<type 'str'>"
                        }
                    }
                ],
                "Name": "<type 'str'>",
                "Ingredients": {
                    "Ingredient": {
                        "Name": "<type 'str'>"
                    }
                }
            }
        }
    }
    Output:  {'SubmitIcedCoffeeResponse': {u'SubmitIcedCoffeeResult': <type 'bool'>}}
    

    The code for interpreting the wsdl schema types, is defined in the two recursive routines of helpers.py, postprocess_element and process_element. It appears that the postprocess_element function is responsible for interpreting extended classes, yet it is failing to fully process all of the complex types when there is an inheritance hierarchy 3 levels deep.

    There are lots of comments mentioning that the recursion needs to be fixed. If anyone can help or provide any insight on to the issue it would be greatly appreciated!

    opened by dotnetdan 23
  • AttributeError: module httplib2 has no attribute SSLHandshakeError (python3)

    AttributeError: module httplib2 has no attribute SSLHandshakeError (python3)

    Error at python3: AttributeError: module httplib2 has no attribute SSLHandshakeError

    httplib2 at python3 does not support SSLHandshakeError any more.

    So if there was an error at the connection, it does not throws which was the error, pysimplesoap throws an error regarding that httlib2 has no attribute SSLHandshakeError.

    https://github.com/pysimplesoap/pysimplesoap/blob/stable_py3k/pysimplesoap/transport.py#L118

    bug 
    opened by lukio 14
  • Support `nil`s values

    Support `nil`s values

    Parse response <item /> as empty string (None now), and <item xsi:nil="true" /> as None.

    Send <item xsi:nil="true" /> nodes for None values in the request (it drops it out now).

    As usual, tests haven't become worse.

    opened by anton-ryzhov 10
  • Fix posting non-ascii data via httplib[2]

    Fix posting non-ascii data via httplib[2]

    For python2: Headers and http method had been unicode (because of __future__ unicode_literals), but location and body — string (bytes). httplib2 uses httplib inside, httplib tries to concatenate headers and strings, decoding payload bytes with default (ascii) encoder. UnicodeError happened. I've converted all data to string, httplib sends it as is.

    Python3: httplib just works with unicode data everywhere. Everything is OK.

    As usual unittests haven't become worse, but still didn't pass.

    opened by anton-ryzhov 9
  • ssl.SSLError: [SSL: DH_KEY_TOO_SMALL] dh key too small

    ssl.SSLError: [SSL: DH_KEY_TOO_SMALL] dh key too small

    I'm trying to use SoapClient and getting the following error:

    SoapClient(
                wsdl='https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl',
                cache='/home/wendy/GitHub/AgroSoft/afip/cache',
                proxy=None,
                cacert=None,
                timeout=30,
                ns='ser', 
                soap_server=None,
                trace="--trace" in sys.argv)
    
      File "/home/wendy/GitHub/AgroSoft/venv/lib/python3.8/site-packages/pysimplesoap/client.py", line 169, in __init__
        self.services = wsdl and self.wsdl_parse(wsdl, cache=cache)
      File "/home/wendy/GitHub/AgroSoft/venv/lib/python3.8/site-packages/pysimplesoap/client.py", line 861, in wsdl_parse
        wsdl = self._url_to_xml_tree(url, cache, force_download)
      File "/home/wendy/GitHub/AgroSoft/venv/lib/python3.8/site-packages/pysimplesoap/client.py", line 535, in _url_to_xml_tree
        xml = fetch(url, self.http, cache, force_download, self.wsdl_basedir, self.http_headers)
      File "/home/wendy/GitHub/AgroSoft/venv/lib/python3.8/site-packages/pysimplesoap/helpers.py", line 76, in fetch
        response, xml = http.request(url, 'GET', None, headers)
      File "/home/wendy/GitHub/AgroSoft/venv/lib/python3.8/site-packages/httplib2/__init__.py", line 1708, in request
        (response, content) = self._request(
      File "/home/wendy/GitHub/AgroSoft/venv/lib/python3.8/site-packages/httplib2/__init__.py", line 1424, in _request
        (response, content) = self._conn_request(conn, request_uri, method, body, headers)
      File "/home/wendy/GitHub/AgroSoft/venv/lib/python3.8/site-packages/httplib2/__init__.py", line 1346, in _conn_request
        conn.connect()
      File "/home/wendy/GitHub/AgroSoft/venv/lib/python3.8/site-packages/httplib2/__init__.py", line 1138, in connect
        self.sock = self._context.wrap_socket(sock, server_hostname=self.host)
      File "/usr/lib/python3.8/ssl.py", line 500, in wrap_socket
        return self.sslsocket_class._create(
      File "/usr/lib/python3.8/ssl.py", line 1040, in _create
        self.do_handshake()
      File "/usr/lib/python3.8/ssl.py", line 1309, in do_handshake
        self._sslobj.do_handshake()
    ssl.SSLError: [SSL: DH_KEY_TOO_SMALL] dh key too small (_ssl.c:1123)
    
    

    I'm using Python 3.8.5

    opened by wenscl 6
  • Mejoras varias

    Mejoras varias

    • Estuve corrigiendo algunos tests que no corrían.
    • Actualice el README un poco porque tenía información un poco alejada la realidad de la rama.
    • Agregué un .gitignore, porque al trabajar sobre el proyecto empece a tener pila de archivos sin versionar detectados por git y se hace incomodo trabajar así.

    Haría falta acomodar un poco el tema de los tests y agregar algunos faltantes, principalmente los de client y transport.

    No tengo privilegios para esto, pero estaría bueno meter algún tipo de CI.

    Saludos

    opened by cperezabo 6
  • Sending a call and retrieving the xml output response.

    Sending a call and retrieving the xml output response.

    Because of issues I would like to get the raw response from the call I make in pysimplesoap. That way soap can make the calls and I can manually parse the xml when I need to. Is there a parameter to make that happen or should I create the feature?

    opened by encompass 4
  • Do parse recursive `elements` in schema

    Do parse recursive `elements` in schema

    I didn't get why do you forbid recursive elements parsing in 68ef40e996e034f2f4bb23c0ca4454f10f4d9a60 and 9b07c32261050d897b55d83720fa863ada63f18e . There is no comment, ticket, bug report or testcase.

    I've faced with bug — I have tree structure HumanTaskTypeInfo in my WSDL ( http://pastebin.com/pSn4P4mH ). Current version of pysimplesoap just drops subtask element from schema in parsing step and fails when receives this field from server on second.

    I was really surprised then I've removed described lines — everything had been parsed well, no recursion, executed successfuly. Even unittests didn't report any bugs.

    Pre- 68ef40e996e034f2f4bb23c0ca4454f10f4d9a60 version works good for me too.

    And small fix to my previous PR (about style).

    opened by anton-ryzhov 4
  • Some refactoring for future fixes

    Some refactoring for future fixes

    Hello guys! I'd chosen your library as best available for python and I've started to use it in my project. I've faced with some issues, and going to fix it and make pull-requests. As first step I've made some refactoring — today wsdl_parse is too complex to understand and work with. Looks like I've made no degradation with this fix according to tests.

    I hope you'll like it and further fixes.

    opened by anton-ryzhov 4
  • 1.16.2 seems to be broken

    1.16.2 seems to be broken

    Version 1.16.2 seems to be broken across python2 and -3 and while the previous version was not.

    Traceback (most recent call last):
      File "/home/travis/build/venthur/python-debianbts/test/test_debianbts.py", line 152, in test_bug_log_message_unicode
        buglogs = bts.get_bug_log(773321)
      File "/home/travis/build/venthur/python-debianbts/debianbts/debianbts.py", line 316, in get_bug_log
        reply = _soap_client_call('get_bug_log', nr)
      File "/home/travis/build/venthur/python-debianbts/debianbts/debianbts.py", line 488, in _soap_client_call
        return getattr(soap_client, method_name)(soap_client, *soap_args)
      File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/pysimplesoap/client.py", line 175, in <lambda>
        return lambda *args, **kwargs: self.call(attr, *args, **kwargs)
      File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/pysimplesoap/client.py", line 213, in call
        for k, v in parameters:  # dict: tag=valor
    TypeError: 'SoapClient' object is not iterable
    

    https://travis-ci.org/venthur/python-debianbts/builds/393292840

    opened by venthur 3
  • Drop transitional package (fixes #63 and #101)

    Drop transitional package (fixes #63 and #101)

    New versions of setuptools/pip build wheels by default and cache them. Calling setup() twice breaks wheels. Therefore pysimplesoap is getting increasingly difficult to install for increasing numbers of users. This behaviour was to meant to help users, and is now harming them, so should be removed.

    opened by Jc2k 3
  • Remove inspect for Python 3.11 compatibility

    Remove inspect for Python 3.11 compatibility

    Fixes issue in pyafipws:

    /opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/pysimplesoap/transport.py:[14](https://github.com/reingart/pyafipws/actions/runs/3519199212/jobs/5898894972#step:13:15)1: in <module>
        if 'timeout' in inspect.getargspec(httplib2.Http.__init__)[0]:
    E   AttributeError: module 'inspect' has no attribute 'getargspec'
    
    opened by reingart 0
  • API used successfully in Python 2.7 application does not work in Python 3.6

    API used successfully in Python 2.7 application does not work in Python 3.6

    I have an application written in python 2.7 that uses pysimplesoap successfully. I am in the process of migrating that app to Python 3.6, and have found that the pysimplesoap module is behaving differently in at least one case. Here is a SOAP request sent by the 2.7 application:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://fprint.net/PAC">
    <soapenv:Header/>
    <soapenv:Body>
        <**tns:viewServer**>
            <username>L3cdnc</username><password>!@l3cndc714</password><ServerID>185216</ServerID>
        </**tns:viewServer**>
    </soapenv:Body>
    </soapenv:Envelope>
    

    The next one is what is sent by the python 3 code:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://fprint.net/PAC">\n
    <soapenv:Header/>\n
    <soapenv:Body>
        <**viewServer**>
            <username>L3cdnc</username><password>!@l3cndc714</password><ServerID>212788</ServerID>
        </**viewServer**>
    </soapenv:Body>
    </soapenv:Envelope>
    

    The way the application uses pysimplesoap has not changed. The differences above are in bold. What is causing the ns to not be prepended to the viewServer tag in Python 3, and how can I get around it?

    Thank you.

    opened by dschreyergill 0
  • Why passing unicode string to xml.dom.minidom.parseString? (python2)

    Why passing unicode string to xml.dom.minidom.parseString? (python2)

    Hello, I'm using version 1.16.2 on python2.7. I'm facing problems when requests contain latin digits as à/è/ì/ò/ù. Snipping the request XML with chardet library it seems well encoded in UTF-8. But method do_POST in server.py source file decode the string to unicode before passing it to dispatcher

        def do_POST(self):
            """SOAP POST gateway"""
            request = self.rfile.read(int(self.headers.get('content-length')))
            # convert xml request to unicode (according to request headers)
            if sys.version < '3':
                encoding = self.headers.getparam("charset")
            else:
                encoding = self.headers.get_param("charset")
            request = request.decode(encoding)
            fault = {}
            # execute the method
            response = self.server.dispatcher.dispatch(request, fault=fault)
    

    Inside, the parsing of the request parameter causes an "ExpatError: not well-formed" exception. Since the parser inside is using xml.dom.minidom.parseString according to https://stackoverflow.com/questions/8144131/unicode-error-when-passing-unicode-object-to-xml-parser the string should remain encoded. Commenting the instruction request = request.decode(encoding) in do_POST no exception is raised.

    Why passing unicode string to xml.dom.minidom.parseString?

    Thanks in advance, Roberto

    opened by RobiIhs 0
  • Avoid verify ssl in postprocess

    Avoid verify ssl in postprocess

    I am using your code from https://github.com/reingart/py_efactura_uy/blob/master/consulta_rut.py

    I see the trace and works, data is coming, but after the data comes, the postprocess trows an error.

    Traceback (most recent call last): File "obtenerEmpresaPorRUT.py", line 83, in ret = client.call("AWS_PERSONAGETACTEMPRESARIAL.Execute", param) File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/client.py", line 281, in call self.__headers, soap_uri) File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/wsse.py", line 179, in postprocess raise RuntimeError("WSSE certificate validation failed") RuntimeError: WSSE certificate validation failed

    How can avoid the validation process or put the validation certificate from DGI ?

    is there any attribute for BinaryTokenSignature similar to: verify_cert_client="myfile.crt"; ?

    Regards Juan

    opened by jcav2 0
  • Fix for error due to dictionary key type change from 'list' to 'dict_keys' in python3

    Fix for error due to dictionary key type change from 'list' to 'dict_keys' in python3

    Error occurred while checking whether a dictionary is present in the keys of of another dictionary:

    File "/usr/local/lib/python3.6/site-packages/pysimplesoap/server.py", line 521, in do_get response = self.dispatcher.wsdl() File "/usr/local/lib/python3.6/site-packages/pysimplesoap/server.py", line 395, in wsdl parse_element("%sResponse" % method, returns and returns.items()) File "/usr/local/lib/python3.6/site-packages/pysimplesoap/server.py", line 375, in parse_element if v in TYPE_MAP.keys(): TypeError: unhashable type: 'dict'

    opened by Jyothsnaosper 1
Releases(1.13)
  • 1.13(May 6, 2014)

    Bug fixes:

    • avoid recursive errors while postprocessing wsdl elements
    • references to elements in wsdl parsing
    • updated issues tests
    • commented process_element wsdl helper
    • better support for extension (wsdl parsing)
    • removed unicode literals and fixed print syntax for python3 (tests)
    • fixed pyton3 TypeError: 'dict_keys' object does not support indexing (server)
    • proper unicode conversion of the request in server post method for python3
    Source code(tar.gz)
    Source code(zip)
  • 1.12(May 6, 2014)

    Bug fixes:

    • duration marshalling hack (rollbacked)
    • python 3 compatibility
    • schema and any returned in responses (do not unmarshall)
    • added soap-envelope ns in server
    • set logging level using trace (SoapClient)
    • salesforce wsdl
    • relative paths
    • added support for parameterOrder rpc style
    • better support for rpc style messages
    • input element is missing namespace
    • support basic schema list element (values separated by sapaces)
    • service is not present in wsdl
    • namespace handling at top level parameters in wsdl call
    Source code(tar.gz)
    Source code(zip)
  • 1.11(Jan 21, 2014)

  • 1.10(May 6, 2014)

    Stable release with a lot of clean-ups and accumulated fixes.

    For the detail of around a hundreds of changes, please see the commit history and the list of authors that contributed them.

    Note that this release is slightly backwards incompatible, so please test it carefully.

    Source code(tar.gz)
    Source code(zip)
A simple, yet elegant HTTP library.

Requests Requests is a simple, yet elegant HTTP library. >>> import requests >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')

Python Software Foundation 48.8k Jan 5, 2023
Small, fast HTTP client library for Python. Features persistent connections, cache, and Google App Engine support. Originally written by Joe Gregorio, now supported by community.

Introduction httplib2 is a comprehensive HTTP client library, httplib2.py supports many features left out of other HTTP libraries. HTTP and HTTPS HTTP

null 457 Dec 10, 2022
Python HTTP library with thread-safe connection pooling, file post support, user friendly, and more.

urllib3 is a powerful, user-friendly HTTP client for Python. Much of the Python ecosystem already uses urllib3 and you should too. urllib3 brings many

urllib3 3.2k Dec 29, 2022
Python HTTP library with thread-safe connection pooling, file post support, user friendly, and more.

urllib3 is a powerful, user-friendly HTTP client for Python. Much of the Python ecosystem already uses urllib3 and you should too. urllib3 brings many

urllib3 3.2k Jan 2, 2023
EasyRequests is a minimalistic HTTP-Request Library that wraps aiohttp and asyncio in a small package that allows for sequential, parallel or even single requests

EasyRequests EasyRequests is a minimalistic HTTP-Request Library that wraps aiohttp and asyncio in a small package that allows for sequential, paralle

Avi 1 Jan 27, 2022
curl statistics made simple

httpstat httpstat visualizes curl(1) statistics in a way of beauty and clarity. It is a single file ?? Python script that has no dependency ?? and is

Xiao Meng 5.3k Jan 4, 2023
Aiohttp simple project with Swagger and ccxt integration

crypto_finder What Where Documentation http://localhost:8899/docs Maintainer nordzisko Crypto Finder aiohttp application Application that connects to

Norbert Danisik 5 Feb 27, 2022
A next generation HTTP client for Python. 🦋

HTTPX - A next-generation HTTP client for Python. HTTPX is a fully featured HTTP client for Python 3, which provides sync and async APIs, and support

Encode 9.8k Jan 5, 2023
Python requests like API built on top of Twisted's HTTP client.

treq: High-level Twisted HTTP Client API treq is an HTTP library inspired by requests but written on top of Twisted's Agents. It provides a simple, hi

Twisted Matrix Labs 553 Dec 18, 2022
Asynchronous HTTP client/server framework for asyncio and Python

Async http client/server framework Key Features Supports both client and server side of HTTP protocol. Supports both client and server Web-Sockets out

aio-libs 13.1k Jan 1, 2023
PycURL - Python interface to libcurl

PycURL -- A Python Interface To The cURL library PycURL is a Python interface to libcurl, the multiprotocol file transfer library. Similarly to the ur

PycURL 933 Jan 9, 2023
A toolbelt of useful classes and functions to be used with python-requests

The Requests Toolbelt This is just a collection of utilities for python-requests, but don't really belong in requests proper. The minimum tested reque

null 892 Jan 6, 2023
Asynchronous Python HTTP Requests for Humans using Futures

Asynchronous Python HTTP Requests for Humans Small add-on for the python requests http library. Makes use of python 3.2's concurrent.futures or the ba

Ross McFarland 2k Dec 30, 2022
HTTP/2 for Python.

Hyper: HTTP/2 Client for Python This project is no longer maintained! Please use an alternative, such as HTTPX or others. We will not publish further

Hyper 1k Dec 23, 2022
HTTP request/response parser for python in C

http-parser HTTP request/response parser for Python compatible with Python 2.x (>=2.7), Python 3 and Pypy. If possible a C parser based on http-parser

Benoit Chesneau 334 Dec 24, 2022
Screaming-fast Python 3.5+ HTTP toolkit integrated with pipelining HTTP server based on uvloop and picohttpparser.

Screaming-fast Python 3.5+ HTTP toolkit integrated with pipelining HTTP server based on uvloop and picohttpparser.

Paweł Piotr Przeradowski 8.6k Jan 4, 2023
🔄 🌐 Handle thousands of HTTP requests, disk writes, and other I/O-bound tasks simultaneously with Python's quintessential async libraries.

?? ?? Handle thousands of HTTP requests, disk writes, and other I/O-bound tasks simultaneously with Python's quintessential async libraries.

Hackers and Slackers 15 Dec 12, 2022
A Python obfuscator using HTTP Requests and Hastebin.

?? Jawbreaker ?? Jawbreaker is a Python obfuscator written in Python3, using double encoding in base16, base32, base64, HTTP requests and a Hastebin-l

Billy 50 Sep 28, 2022
Single-file replacement for python-requests

mureq mureq is a single-file, zero-dependency replacement for python-requests, intended to be vendored in-tree by Linux systems software and other lig

Shivaram Lingamneni 267 Dec 28, 2022