PycURL - Python interface to libcurl

Related tags

HTTP Clients pycurl
Overview

PycURL -- A Python Interface To The cURL library

https://api.travis-ci.org/pycurl/pycurl.png https://ci.appveyor.com/api/projects/status/q40v2q8r5d06bu92/branch/master?svg=true

PycURL is a Python interface to libcurl, the multiprotocol file transfer library. Similarly to the urllib Python module, PycURL can be used to fetch objects identified by a URL from a Python program. Beyond simple fetches however PycURL exposes most of the functionality of libcurl, including:

  • Speed - libcurl is very fast and PycURL, being a thin wrapper above libcurl, is very fast as well. PycURL was benchmarked to be several times faster than requests.
  • Features including multiple protocol support, SSL, authentication and proxy options. PycURL supports most of libcurl's callbacks.
  • Multi and share interfaces.
  • Sockets used for network operations, permitting integration of PycURL into the application's I/O loop (e.g., using Tornado).

Requirements

  • Python 3.5-3.8.
  • libcurl 7.19.0 or better.

Installation

Download source and binary distributions from PyPI or Bintray. Binary wheels are now available for 32 and 64 bit Windows versions.

Please see INSTALL.rst for installation instructions. If installing from a Git checkout, please follow instruction in the Git Checkout section of INSTALL.rst.

Documentation

Documentation for the most recent PycURL release is available on PycURL website.

Documentation for the development version of PycURL is available here.

To build documentation from source, run make docs. Building documentation requires Sphinx to be installed, as well as pycurl extension module built as docstrings are extracted from it. Built documentation is stored in build/doc subdirectory.

Support

For support questions please use curl-and-python mailing list. Mailing list archives are available for your perusal as well.

Although not an official support venue, Stack Overflow has been popular with some PycURL users.

Bugs can be reported via GitHub. Please use GitHub only for bug reports and direct questions to our mailing list instead.

Automated Tests

PycURL comes with an automated test suite. To run the tests, execute:

make test

The suite depends on packages nose and bottle, as well as vsftpd.

Some tests use vsftpd configured to accept anonymous uploads. These tests are not run by default. As configured, vsftpd will allow reads and writes to anything the user running the tests has read and write access. To run vsftpd tests you must explicitly set PYCURL_VSFTPD_PATH variable like so:

# use vsftpd in PATH
export PYCURL_VSFTPD_PATH=vsftpd

# specify full path to vsftpd
export PYCURL_VSFTPD_PATH=/usr/local/libexec/vsftpd

Test Matrix

The test matrix is a separate framework that runs tests on more esoteric configurations. It supports:

  • Testing against Python 2.4, which bottle does not support.
  • Testing against Python compiled without threads, which requires an out of process test server.
  • Testing against locally compiled libcurl with arbitrary options.

To use the test matrix, first start the test server from Python 2.5+ by running:

python -m tests.appmanager

Then in a different shell, and preferably in a separate user account, run the test matrix:

# run ftp tests, etc.
export PYCURL_VSFTPD_PATH=vsftpd
# create a new work directory, preferably not under pycurl tree
mkdir testmatrix
cd testmatrix
# run the matrix specifying absolute path
python /path/to/pycurl/tests/matrix.py

The test matrix will download, build and install supported Python versions and supported libcurl versions, then run pycurl tests against each combination. To see what the combinations are, look in tests/matrix.py.

Contribute

For smaller changes:

  1. Fork the repository on Github.
  2. Create a branch off master.
  3. Make your changes.
  4. Write a test which shows that the bug was fixed or that the feature works as expected.
  5. Send a pull request.
  6. Check back after 10-15 minutes to see if tests passed on Travis CI. PycURL supports old Python and libcurl releases and their support is tested on Travis.

For larger changes:

  1. Join the mailing list.
  2. Discuss your proposal on the mailing list.
  3. When consensus is reached, implement it as described above.

Please contribute binary distributions for your system to the downloads repository.

License

Copyright (C) 2001-2008 by Kjetil Jacobsen <kjetilja at gmail.com>
Copyright (C) 2001-2008 by Markus F.X.J. Oberhumer <markus at oberhumer.com>
Copyright (C) 2013-2020 by Oleg Pudeyev <oleg at bsdpower.com>

All rights reserved.

PycURL is dual licensed under the LGPL and an MIT/X derivative license
based on the cURL license.  A full copy of the LGPL license is included
in the file COPYING-LGPL.  A full copy of the MIT/X derivative license is
included in the file COPYING-MIT.  You can redistribute and/or modify PycURL
according to the terms of either license.
Comments
  • certinfo_test, 2 fail under py2.7; post_test, 2 fail under py3.4

    certinfo_test, 2 fail under py2.7; post_test, 2 fail under py3.4

    with Python 3.4.0;

    running build_ext
    /usr/lib64/python3.4/site-packages/nose/plugins/manager.py:395: RuntimeWarning: Unable to load plugin html-output = htmloutput.htmloutput:HtmlOutput: No module named 'version'
      RuntimeWarning)
    ............S......................................................Traceback (most recent call last):
      File "/usr/lib64/python3.4/site-packages/bottle.py", line 862, in _handle
        return route.call(**args)
      File "/usr/lib64/python3.4/site-packages/bottle.py", line 1727, in wrapper
        rv = callback(*a, **ka)
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python3_4/tests/app.py", line 73, in files
        files = [convert_file(key, bottle.request.files[key]) for key in bottle.request.files]
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python3_4/tests/app.py", line 73, in <listcomp>
        files = [convert_file(key, bottle.request.files[key]) for key in bottle.request.files]
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python3_4/tests/app.py", line 60, in convert_file
        'data': file.file.read().decode(),
    ValueError: I/O operation on closed file.
    F.Traceback (most recent call last):
      File "/usr/lib64/python3.4/site-packages/bottle.py", line 862, in _handle
        return route.call(**args)
      File "/usr/lib64/python3.4/site-packages/bottle.py", line 1727, in wrapper
        rv = callback(*a, **ka)
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python3_4/tests/app.py", line 73, in files
        files = [convert_file(key, bottle.request.files[key]) for key in bottle.request.files]
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python3_4/tests/app.py", line 73, in <listcomp>
        files = [convert_file(key, bottle.request.files[key]) for key in bottle.request.files]
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python3_4/tests/app.py", line 60, in convert_file
        'data': file.file.read().decode(),
    ValueError: read of closed file
    F......................successUnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
    Traceback (most recent call last):
    .  File "/usr/lib64/python3.4/wsgiref/handlers.py", line 138, in run
        self.finish_response()
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 180, in finish_response
        self.write(data)
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 274, in write
        self.send_headers()
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 332, in send_headers
        self.send_preamble()
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 255, in send_preamble
        ('Date: %s\r\n' % format_date_time(time.time())).encode('iso-8859-1')
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 453, in _write
        self.stdout.write(data)
      File "/usr/lib64/python3.4/socket.py", line 391, in write
        return self._sock.send(b)
    BrokenPipeError: [Errno 32] Broken pipe
    Traceback (most recent call last):
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 138, in run
        self.finish_response()
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 180, in finish_response
        self.write(data)
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 274, in write
        self.send_headers()
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 332, in send_headers
        self.send_preamble()
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 255, in send_preamble
        ('Date: %s\r\n' % format_date_time(time.time())).encode('iso-8859-1')
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 453, in _write
        self.stdout.write(data)
      File "/usr/lib64/python3.4/socket.py", line 391, in write
        return self._sock.send(b)
    BrokenPipeError: [Errno 32] Broken pipe
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 141, in run
        self.handle_error()
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 368, in handle_error
        self.finish_response()
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 180, in finish_response
        self.write(data)
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 274, in write
        self.send_headers()
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 331, in send_headers
        if not self.origin_server or self.client_is_modern():
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 344, in client_is_modern
        return self.environ['SERVER_PROTOCOL'].upper() != 'HTTP/0.9'
    TypeError: 'NoneType' object is not subscriptable
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/lib64/python3.4/socketserver.py", line 306, in _handle_request_noblock
        self.process_request(request, client_address)
      File "/usr/lib64/python3.4/socketserver.py", line 332, in process_request
        self.finish_request(request, client_address)
      File "/usr/lib64/python3.4/socketserver.py", line 345, in finish_request
        self.RequestHandlerClass(request, client_address, self)
      File "/usr/lib64/python3.4/socketserver.py", line 666, in __init__
        self.handle()
      File "/usr/lib64/python3.4/wsgiref/simple_server.py", line 126, in handle
        handler.run(self.server.get_app())
      File "/usr/lib64/python3.4/wsgiref/handlers.py", line 144, in run
        self.close()
      File "/usr/lib64/python3.4/wsgiref/simple_server.py", line 35, in close
        self.status.split(' ',1)[0], self.bytes_sent
    AttributeError: 'NoneType' object has no attribute 'split'
    ...S.......................successpycurl.error: write callback must return int or None
    .pycurl.error: write callback must return int or None
    .......TypeError: string argument expected, got 'bytes'
    .
    ======================================================================
    FAIL: test_post_buffer (tests.post_test.PostTest)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python3_4/tests/post_test.py", line 112, in test_post_buffer
        self.check_post(send, expect, 'http://localhost:8380/files')
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python3_4/tests/post_test.py", line 122, in check_post
        self.assertEqual(200, self.curl.getinfo(pycurl.HTTP_CODE))
    AssertionError: 200 != 500
    
    ===============================================================
    FAIL: test_post_file (tests.post_test.PostTest)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python3_4/tests/post_test.py", line 100, in test_post_file
        self.check_post(send, expect, 'http://localhost:8380/files')
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python3_4/tests/post_test.py", line 122, in check_post
        self.assertEqual(200, self.curl.getinfo(pycurl.HTTP_CODE))
    AssertionError: 200 != 500
    
    ----------------------------------------------------------------------
    Ran 127 tests in 27.442s
    
    FAILED (SKIP=2, failures=2
    

    The BrokenPipeError: [Errno 32] Broken pipe portion seems somewhat harmless. Now for py2.7; Python 2.7.6

    running build_ext
    .EE.........S.........S.......................................................................successUnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128)
    .Traceback (most recent call last):
      File "/usr/lib64/python2.7/wsgiref/handlers.py", line 86, in run
        self.finish_response()
      File "/usr/lib64/python2.7/wsgiref/handlers.py", line 128, in finish_response
        self.write(data)
      File "/usr/lib64/python2.7/wsgiref/handlers.py", line 212, in write
        self.send_headers()
      File "/usr/lib64/python2.7/wsgiref/handlers.py", line 270, in send_headers
        self.send_preamble()
      File "/usr/lib64/python2.7/wsgiref/handlers.py", line 194, in send_preamble
        'Date: %s\r\n' % format_date_time(time.time())
      File "/usr/lib64/python2.7/socket.py", line 324, in write
        self.flush()
      File "/usr/lib64/python2.7/socket.py", line 303, in flush
        self._sock.sendall(view[write_offset:write_offset+buffer_size])
    error: [Errno 32] Broken pipe
    Traceback (most recent call last):
      File "/usr/lib64/python2.7/SocketServer.py", line 295, in _handle_request_noblock
        self.process_request(request, client_address)
      File "/usr/lib64/python2.7/SocketServer.py", line 321, in process_request
        self.finish_request(request, client_address)
      File "/usr/lib64/python2.7/SocketServer.py", line 334, in finish_request
        self.RequestHandlerClass(request, client_address, self)
      File "/usr/lib64/python2.7/SocketServer.py", line 651, in __init__
        self.finish()
      File "/usr/lib64/python2.7/SocketServer.py", line 710, in finish
        self.wfile.close()
      File "/usr/lib64/python2.7/socket.py", line 279, in close
        self.flush()
      File "/usr/lib64/python2.7/socket.py", line 303, in flush
        self._sock.sendall(view[write_offset:write_offset+buffer_size])
    error: [Errno 32] Broken pipe
    ...S.......................successpycurl.error: write callback must return int or None
    .pycurl.error: write callback must return int or None
    .....S.S
    ======================================================================
    ERROR: test_request_with_certinfo (tests.certinfo_test.CertinfoTest)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python2_7/tests/util.py", line 81, in decorated
        return fn(*args, **kwargs)
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python2_7/tests/util.py", line 99, in decorated
        return fn(*args, **kwargs)
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python2_7/tests/certinfo_test.py", line 55, in test_request_with_certinfo
        self.curl.perform()
    error: (56, 'SSL read: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number, errno 0')
    
    ===============================================================
    ERROR: test_request_without_certinfo (tests.certinfo_test.CertinfoTest)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python2_7/tests/util.py", line 81, in decorated
        return fn(*args, **kwargs)
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python2_7/tests/util.py", line 99, in decorated
        return fn(*args, **kwargs)
      File "/mnt/gen2/TmpDir/portage/dev-python/pycurl-7.19.3.1/work/pycurl-7.19.3.1-python2_7/tests/certinfo_test.py", line 35, in test_request_without_certinfo
        self.curl.perform()
    error: (56, 'SSL read: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number, errno 0')
    
    ----------------------------------------------------------------------
    Ran 129 tests in 34.645s
    
    FAILED (SKIP=5, errors=2)
    Makefile:18: recipe for target 'do-test' failed
    make: *** [do-test] Error 1
    

    Oh, this is pycurl-7.19.3.1. Do you get this with those 2 pys?

    opened by idella 59
  • adding pycurl to setup_requires fails

    adding pycurl to setup_requires fails

    What did you try to do?

    
    import setuptools
    
    setuptools.setup(
        name='some_package`,
        setup_requires=['pycurl>=7.43.0.2']
    )
    

    What happened?

    
    Searching for pycurl>=1.43.0.2
    Reading https://pypi.org/simple/pycurl/
    Downloading https://files.pythonhosted.org/packages/ac/b3/0f3979633b7890bab6098d84c84467030b807a1e2b31f5d30103af5a71ca/pycurl-7.43.0.3.tar.gz#sha256=6f08330c5cf79fa8ef68b9912b9901db7ffd34b63e225dce74db56bb21deda8e
    Best match: pycurl 7.43.0.3
    Processing pycurl-7.43.0.3.tar.gz
    Writing \AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\setup.cfg
    Running pycurl-7.43.0.3\setup.py -q bdist_egg --dist-dir \AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\egg-dist-tmp-kbq85v3f
    Please specify --curl-dir=/path/to/built/libcurl
    Traceback (most recent call last):
      File "\lib\site-packages\setuptools\sandbox.py", line 154, in save_modules
        yield saved
      File "\lib\site-packages\setuptools\sandbox.py", line 195, in setup_context
        yield
      File "\lib\site-packages\setuptools\sandbox.py", line 250, in run_setup
        _execfile(setup_script, ns)
      File "\lib\site-packages\setuptools\sandbox.py", line 45, in _execfile
        exec(code, globals, locals)
      File "\AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\setup.py", line 944, in <module>
      File "\AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\setup.py", line 606, in get_extension
      File "\AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\setup.py", line 101, in __init__
        INIT_SCRIPT = os.path.join(BASE_PATH, 'init_scripts', 'init_script.py')
      File "\AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\setup.py", line 388, in configure_windows
        ]
      File "\AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\setup.py", line 37, in fail
    
      File "\lib\_sitebuiltins.py", line 26, in __call__
        raise SystemExit(code)
    SystemExit: 10
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "\lib\site-packages\setuptools\command\easy_install.py", line 1141, in run_setup
        run_setup(setup_script, args)
      File "\lib\site-packages\setuptools\sandbox.py", line 253, in run_setup
        raise
      File "\lib\contextlib.py", line 77, in __exit__
        self.gen.throw(type, value, traceback)
      File "\lib\site-packages\setuptools\sandbox.py", line 195, in setup_context
        yield
      File "\lib\contextlib.py", line 77, in __exit__
        self.gen.throw(type, value, traceback)
      File "\lib\site-packages\setuptools\sandbox.py", line 166, in save_modules
        saved_exc.resume()
      File "\lib\site-packages\setuptools\sandbox.py", line 141, in resume
        six.reraise(type, exc, self._tb)
      File "\lib\site-packages\setuptools\_vendor\six.py", line 685, in reraise
        raise value.with_traceback(tb)
      File "\lib\site-packages\setuptools\sandbox.py", line 154, in save_modules
        yield saved
      File "\lib\site-packages\setuptools\sandbox.py", line 195, in setup_context
        yield
      File "\lib\site-packages\setuptools\sandbox.py", line 250, in run_setup
        _execfile(setup_script, ns)
      File "\lib\site-packages\setuptools\sandbox.py", line 45, in _execfile
        exec(code, globals, locals)
      File "\AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\setup.py", line 944, in <module>
      File "\AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\setup.py", line 606, in get_extension
      File "\AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\setup.py", line 101, in __init__
        INIT_SCRIPT = os.path.join(BASE_PATH, 'init_scripts', 'init_script.py')
      File "\AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\setup.py", line 388, in configure_windows
        ]
      File "\AppData\Local\Temp\easy_install-2i_f3n0j\pycurl-7.43.0.3\setup.py", line 37, in fail
    
      File "\lib\_sitebuiltins.py", line 26, in __call__
        raise SystemExit(code)
    SystemExit: 10
    

    What did you expect to happen?

    I expected pycurl to be installed into the /.eggs/pycurl-7.43.0.3-py3.5-win-amd64.egg folder where the script above is located

    What is the PycURL version?

    7.43.0.3

    What is your Python version?

    Python 3.5.4 (Stackless)

    What is your operating system and its version?

    Windows 7 x64 SP2

    Other versions

    setuptools 40.2.0

    Is this the most recent PycURL release?

    It is what ever the latest release on pypi is

    Did you check libcurl behavior?

    Issue is with the installation of pycurl and not the operation of pycurl

    any help with this would be appreciated... Thanks

    opened by kdschlosser 58
  • Pycurl 7.43.0.3 binary builds missing (windows & linux)

    Pycurl 7.43.0.3 binary builds missing (windows & linux)

    Hello!

    I am contacting you because I use PyCurl in a work related project and currently we always try to install latest version. However, since yesterday this doesn't work because the wheels for version 7.43.0.3 for windows are missing. We are using Python 2.7.8 (32-bits) on windows.

    Is there an ETA for the upload of the new wheels on pypi?

    Thank you, Laura Surcel

    opened by laura-surcel 32
  • Install pycurl on windows

    Install pycurl on windows

    What happened?

    Recently I want to install pycurl, but i met a problem when I use pip install pycurl and it infomationed that 'Please specify --curl-dir'. But when I read setup.py I find out what you have written in this file that 'Windows users have to pass --curl-dir parameter', how I should do to pass that parameter? By using '#' where this parameter appear?

    What is the PycURL version?

    7.43.0.6(acturally most recent version of pycurl unless using whl to install

    What is your Python version?

    3.8.1

    What is your operating system and its version?

    Microsoft Windows 10 profrssional

    opened by Eziodeng 20
  • PycURL 💔 Windows & Python 64-bit

    PycURL 💔 Windows & Python 64-bit

    Hello,

    I am facing an issue where PycURL would cause Python 64-bit to crash on a Windows machine executing a simple snippet.

    I tried to attach as much details as possible to the issue. I would appreciate your thoughts about it. Thank you !

    Summary

    Python 64-bit (only) is crashing on Windows when executing socket_action(pycurl.SOCKET_TIMEOUT, 0).

    How to reproduce ?

    Python version

    Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:40:30) [MSC v.1500 64 bit (AMD64)] on win32
    

    PycURL version

    import pycurl
    print pycurl.version
    
    PycURL/7.43.0 libcurl/7.47.0 OpenSSL/1.0.2e zlib/1.2.8 c-ares/1.10.0 libssh2/1.6.0
    

    Pathological Python snippet

    import pycurl
    
    m = pycurl.CurlMulti()
    m.socket_action(pycurl.SOCKET_TIMEOUT, 0)
    

    The previous snippet is immediately followed by a "python.exe has stopped working" Windows pop-up.

    Trace

    For what it's worth, here is the trace reported in Windows Event Viewer:

    Log Name:      Application
    Source:        Application Error
    Date:          3/7/2016 2:17:32 PM
    Event ID:      1000
    Task Category: (100)
    Level:         Error
    Keywords:      Classic
    User:          N/A
    Computer:      vagrant-2012-r2
    Description:
    Faulting application name: python.exe, version: 0.0.0.0, time stamp: 0x56634c02
    Faulting module name: pycurl.pyd, version: 0.0.0.0, time stamp: 0x56b36320
    Exception code: 0xc0000005
    Fault offset: 0x000000000003ccbc
    Faulting process id: 0xd20
    Faulting application start time: 0x01d178bf25047ab7
    Faulting application path: C:\Python27\python.exe
    Faulting module path: C:\Python27\lib\site-packages\pycurl.pyd
    Report Id: 62cd9e37-e4b2-11e5-80f6-0800270bbc81
    Faulting package full name: 
    Faulting package-relative application ID: 
    Event Xml:
    <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
      <System>
        <Provider Name="Application Error" />
        <EventID Qualifiers="0">1000</EventID>
        <Level>2</Level>
        <Task>100</Task>
        <Keywords>0x80000000000000</Keywords>
        <TimeCreated SystemTime="2016-03-07T22:17:32.000000000Z" />
        <EventRecordID>4794</EventRecordID>
        <Channel>Application</Channel>
        <Computer>vagrant-2012-r2</Computer>
        <Security />
      </System>
      <EventData>
        <Data>python.exe</Data>
        <Data>0.0.0.0</Data>
        <Data>56634c02</Data>
        <Data>pycurl.pyd</Data>
        <Data>0.0.0.0</Data>
        <Data>56b36320</Data>
        <Data>c0000005</Data>
        <Data>000000000003ccbc</Data>
        <Data>d20</Data>
        <Data>01d178bf25047ab7</Data>
        <Data>C:\Python27\python.exe</Data>
        <Data>C:\Python27\lib\site-packages\pycurl.pyd</Data>
        <Data>62cd9e37-e4b2-11e5-80f6-0800270bbc81</Data>
        <Data>
        </Data>
        <Data>
        </Data>
      </EventData>
    </Event>
    
    Log Name:      Application
    Source:        Windows Error Reporting
    Date:          3/7/2016 2:17:44 PM
    Event ID:      1001
    Task Category: None
    Level:         Information
    Keywords:      Classic
    User:          N/A
    Computer:      vagrant-2012-r2
    Description:
    Fault bucket 120412894622, type 4
    Event Name: APPCRASH
    Response: Not available
    Cab Id: 0
    
    Problem signature:
    P1: python.exe
    P2: 0.0.0.0
    P3: 56634c02
    P4: pycurl.pyd
    P5: 0.0.0.0
    P6: 56b36320
    P7: c0000005
    P8: 000000000003ccbc
    P9: 
    P10: 
    
    Attached files:
    C:\Users\vagrant\AppData\Local\Temp\WER2F42.tmp.WERInternalMetadata.xml
    
    These files may be available here:
    C:\Users\vagrant\AppData\Local\Microsoft\Windows\WER\ReportArchive\AppCrash_python.exe_f03c5c8812e8fb8255e14ca173dfcd2911e89f55_2dfb6b66_0bbd5de4
    
    Analysis symbol: 
    Rechecking for solution: 0
    Report Id: 62cd9e37-e4b2-11e5-80f6-0800270bbc81
    Report Status: 0
    Hashed bucket: 4574cdb765e8a16599f3eeae27ae22d2
    Event Xml:
    <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
      <System>
        <Provider Name="Windows Error Reporting" />
        <EventID Qualifiers="0">1001</EventID>
        <Level>4</Level>
        <Task>0</Task>
        <Keywords>0x80000000000000</Keywords>
        <TimeCreated SystemTime="2016-03-07T22:17:44.000000000Z" />
        <EventRecordID>4795</EventRecordID>
        <Channel>Application</Channel>
        <Computer>vagrant-2012-r2</Computer>
        <Security />
      </System>
      <EventData>
        <Data>120412894622</Data>
        <Data>4</Data>
        <Data>APPCRASH</Data>
        <Data>Not available</Data>
        <Data>0</Data>
        <Data>python.exe</Data>
        <Data>0.0.0.0</Data>
        <Data>56634c02</Data>
        <Data>pycurl.pyd</Data>
        <Data>0.0.0.0</Data>
        <Data>56b36320</Data>
        <Data>c0000005</Data>
        <Data>000000000003ccbc</Data>
        <Data>
        </Data>
        <Data>
        </Data>
        <Data>
    C:\Users\vagrant\AppData\Local\Temp\WER2F42.tmp.WERInternalMetadata.xml</Data>
        <Data>C:\Users\vagrant\AppData\Local\Microsoft\Windows\WER\ReportArchive\AppCrash_python.exe_f03c5c8812e8fb8255e14ca173dfcd2911e89f55_2dfb6b66_0bbd5de4</Data>
        <Data>
        </Data>
        <Data>0</Data>
        <Data>62cd9e37-e4b2-11e5-80f6-0800270bbc81</Data>
        <Data>0</Data>
        <Data>4574cdb765e8a16599f3eeae27ae22d2</Data>
      </EventData>
    </Event>
    
    opened by yannmh 17
  • Error install with new version 7.43.0.2

    Error install with new version 7.43.0.2

    Hi, Thank you for your library. Today i tried to update my server with command: pip3 install pycurl --global-option="--with-nss" --upgrade But I faced a bug that I had not encountered before, I guess because of your update:

    Downloading https://files.pythonhosted.org/packages/e8/e4/0dbb8735407189f00b33d84122b9be52c790c7c3b25286826f4e1bdb7bde/pycurl-7.43.0.2.tar.gz (214kB)
      Complete output from command python setup.py egg_info:
      Using curl-config (libcurl 7.53.1)
      Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-8p7rj2ze/pycurl/setup.py", line 913, in <module>
      ext = get_extension(sys.argv, split_extension_source=split_extension_source)
      File "/tmp/pip-install-8p7rj2ze/pycurl/setup.py", line 582, in get_extension
      ext_config = ExtensionConfiguration(argv)
      File "/tmp/pip-install-8p7rj2ze/pycurl/setup.py", line 99, in __init__
      self.configure()
      File "/tmp/pip-install-8p7rj2ze/pycurl/setup.py", line 316, in configure_unix
      specify the SSL backend manually.''')
      __main__.ConfigurationError: Curl is configured to use SSL, but we have not been able to determine which SSL backend it is using. Please see PycURL documentation for how to specify the SSL backend manually.
    

    Please check out it! Thank you again

    opened by pavel-corsaghin 16
  • Can't install pycurl on Python 3.9, window 10, Pycharm but with Python 3.6 ...

    Can't install pycurl on Python 3.9, window 10, Pycharm but with Python 3.6 ...

    Prior to creating an issue, please review the troubleshooting documentation: http://pycurl.io/docs/dev/troubleshooting.html I did research for some time.

    What did you try to do?

    I try to find what the problem is. I try to install several Python version to check if it work with pycurl.

    What happened?

    And the Python 3.6 is working well currently. It install pycurl 7.43.0.5 when I use "pip install" command. When I try to install the lastest pycurl version, it give me the ERROR: Command errored out with exit status 10:

    Another error when I try to install this with Python 3.9: https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl pycurl: libcurl link-time ssl backends (schannel) do not include compile-time ssl backend (openssl)

    What did you expect to happen?

    I would like to install pycurl on Python 3.9 smoothly.

    What is the PycURL version?

    7.43.0.5

    What is your Python version?

    3.9

    What is your operating system and its version?

    Windows 10 ( Lastest version )

    Other versions

    If your report references any software besides PycURL, for example pip, what are the versions of this software? (pip --version, etc.)

    pip 21.3

    Is this the most recent PycURL release?

    Yes it is.

    opened by animax1991 14
  • multi_timer_callback fails to acquire thread when called by add_handle

    multi_timer_callback fails to acquire thread when called by add_handle

    What did you try to do?

    I tried using pycurl.M_TIMERFUNCTION (see CURLMOPT_TIMERFUNCTION):

    import pycurl
    
    TIMER_CALLED = False
    
    def timer_function(timeout_ms):
        global TIMER_CALLED
        TIMER_CALLED = True
        #print('timer function called:', timeout_ms)
        # "The timer callback should return 0 on success, and -1 on error."
        return 0 
    
    # init multi
    multi = pycurl.CurlMulti()
    multi.setopt(pycurl.M_TIMERFUNCTION, timer_function)
    
    # init easy
    curl = pycurl.Curl()
    curl.setopt(pycurl.VERBOSE, 1)
    curl.setopt(pycurl.URL, 'https://nghttp2.org/httpbin/get')
    
    print('adding handle, should call timer_function')
    multi.add_handle(curl)
    print('was timer_function called by add_handle?', TIMER_CALLED)
    
    # a dumb perform loop implementation
    TIMER_CALLED = False
    print('performing the transfer')
    while multi.perform()[1]:
        multi.select(1.0)
    print('was timer_function called during perform?', TIMER_CALLED)
    
    curl.close()
    multi.remove_handle(curl)
    multi.close()
    

    What happened?

    Timer function is not called by add_handle, contrary to libcurl specification. See curl_multi_add_handle:

    If you have CURLMOPT_TIMERFUNCTION set in the multi handle (and you really should if you're working event-based with curl_multi_socket_action and friends), that callback will be called from within this function to ask for an updated timer so that your main event loop will get the activity on this handle to get started.

    If you want to make sure you can also check libcurl's implementation:

    • curl_multi_add_hanle calls Curl_update_timer: https://github.com/curl/curl/blob/5050edb12484551f4c666212409c117cf38f9784/lib/multi.c#L499
    • Curl_update_timer calls multi->timer_cb (set via CURLMOPT_TIMERFUNCTION): https://github.com/curl/curl/blob/5050edb12484551f4c666212409c117cf38f9784/lib/multi.c#L2878

    On the other hand the timer function is called by multi perform and socket_action, so the issue appears only when called from within add_handle call.

    Specifically, the problem is in multi_timer_callback in pycurl's multi.c where PYCURL_ACQUIRE_THREAD_MULTI() returns 0. My guess is that CurlMultiObject->state is not yet initialized at that point.

    What is the PycURL version?

    PycURL/7.43.0.3 libcurl/7.58.0 GnuTLS/3.5.18 zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3

    What is your Python version?

    Python 3.6.8

    opened by fsbs 13
  • Domain name resolving timeouts on windows system

    Domain name resolving timeouts on windows system

    In Grab project I've received multiple feedback about DNS problems with recent version of pycurl (7.43) on windows machines.

    Direct links to the comments:

    • https://github.com/lorien/grab/issues/198#issuecomment-236714375 (quite verbose description of the problem)
    • https://github.com/lorien/grab/issues/172#issuecomment-202098135 (pay attention that the problem has gone when the author of ticket downgraded to 7.19 version)
    • https://groups.google.com/forum/#!topic/python-grab/PwoplNwa1TI (see last comment in the thread)

    This is not a duplicate of #398

    As I see there is a problem in specific version of pycurl (recent) on specific platform (windows). Maybe there should be more specific conditions to reproduce the problem.

    I can't provide more details, I am not a windows user.

    opened by lorien 13
  • Mnt py310 compat

    Mnt py310 compat

    There was a change in the CPython c-api to change Py_TYPE from a macro to an inline function (python/cpython#20290). This requires a change to using Py_SET_TYPE which was introduced on py39a4.

    opened by tacaswell 12
  • Program consumed memory keeps growing while using PyCurl in multi threaded environment

    Program consumed memory keeps growing while using PyCurl in multi threaded environment

    Python program consumed memory grows over time when PyCurl is used in multi-threaded environment for concurrent HTTP API calls.This makes PyCurl unusable for an application that has to run 24/7.

    Attached Python code snippet demonstrates the problem. Program simply hit URLs in multiple threads using PyCurl and logs memory usage after every iteration.

    Test Environment

    • OS: Ubuntu 20.04
    • Python: 3.8.10
    • PyCurl and LibCurl: PycURL/7.44.1 libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3

    Required Python Packages

    • pycurl
    • psutil (for getting program consumed memory)

    Code

    '''
    Run pycurl in multi-threaded environment and log memory usage.
    '''
    
    import os
    import io
    import sys
    import time
    import logging
    import itertools
    from multiprocessing.pool import ThreadPool
    
    import pycurl
    import psutil
    
    # Number of threads for concurrent HTTP calls
    THREAD_COUNT = 100
    
    # URLs for testing
    URLS = [x.strip() for x in open('urls.txt') if x.strip()]
    URLS = itertools.cycle(URLS)
    
    # Setup logger
    LOGGER = logging.getLogger('TestPyCURL')
    CONSOLE_HANDLER = logging.StreamHandler(sys.stdout)
    LOG_FORMAT = '%(asctime)s - %(threadName)s - %(message)s'
    FORMATTER = logging.Formatter(LOG_FORMAT, '%b %d %I:%M:%S')
    CONSOLE_HANDLER.setFormatter(FORMATTER)
    CONSOLE_HANDLER.setLevel(logging.DEBUG)
    LOGGER.addHandler(CONSOLE_HANDLER)
    LOGGER.setLevel(logging.DEBUG)
    
    
    # Note current memory usage of program
    process = psutil.Process(os.getpid())
    last_usage = process.memory_info().rss
    def log_memory_usage():
        '''
        Log change in memory usage of process.
        '''
        global last_usage
        usage = process.memory_info().rss
        change = usage - last_usage
        change_prcnt = change / last_usage * 100
        if usage == last_usage:
            slope = 'No change'
        elif usage > last_usage:
            slope = 'Increased'
        else:
            slope = 'Decreased'
        last_usage = usage
        LOGGER.info('Memory usage: Total: %s MB Change: %s, %s KB, %.3f %%',
                    usage / 1000000, slope, change / 1000, change_prcnt)
    
    
    def curl_request(url):
        '''
        Do HTTP request using Curl.
        '''
        buffer = io.BytesIO()
        curl = pycurl.Curl()
        curl.setopt(curl.URL, url)
        curl.setopt(curl.TIMEOUT, 10)
        curl.setopt(curl.CONNECTTIMEOUT, 5)
        curl.setopt(curl.WRITEDATA, buffer)
        try:
            curl.perform()
        except pycurl.error as exce:
            status = str(exce)
        else:
            status_code = curl.getinfo(curl.RESPONSE_CODE)
            status = status_code, len(buffer.getvalue())
        LOGGER.info('%s, %s', url, status)
        buffer.close()
        curl.close()
    
    
    def main():
        '''
        Test pycurl.
        '''
        # Create pool of worker threads
        pool = ThreadPool(THREAD_COUNT)
        # Run forever
        while True:
            # Log change in memory usage of program
            log_memory_usage()
            # Sleep
            time.sleep(5)
            # Launch parallel HTTP requests
            urls = [next(URLS) for _ in range(0, THREAD_COUNT)]
            pool.map(curl_request, urls)
    
    
    if __name__ == '__main__':
        try:
            main()
        except KeyboardInterrupt:
            pass
    
    

    Memory Usage Over Time

    Memory usage over time logged by test program

    Dec 17 05:30:02 - MainThread - Memory usage: Total: 32.17408 MB Change: Increased, 14008.32 KB, 77.114 %
    Dec 17 05:30:17 - MainThread - Memory usage: Total: 34.28352 MB Change: Increased, 2109.44 KB, 6.556 %
    Dec 17 05:30:33 - MainThread - Memory usage: Total: 104.075264 MB Change: Increased, 69791.744 KB, 203.572 %
    Dec 17 05:30:43 - MainThread - Memory usage: Total: 124.370944 MB Change: Increased, 20295.68 KB, 19.501 %
    Dec 17 05:30:53 - MainThread - Memory usage: Total: 130.592768 MB Change: Increased, 6221.824 KB, 5.003 %
    Dec 17 05:31:08 - MainThread - Memory usage: Total: 137.158656 MB Change: Increased, 6565.888 KB, 5.028 %
    Dec 17 05:31:18 - MainThread - Memory usage: Total: 139.640832 MB Change: Increased, 2482.176 KB, 1.810 %
    Dec 17 05:31:25 - MainThread - Memory usage: Total: 143.33952 MB Change: Increased, 3698.688 KB, 2.649 %
    Dec 17 05:31:40 - MainThread - Memory usage: Total: 145.32608 MB Change: Increased, 1986.56 KB, 1.386 %
    Dec 17 05:31:51 - MainThread - Memory usage: Total: 149.516288 MB Change: Increased, 4190.208 KB, 2.883 %
    ....
    Dec 17 05:54:17 - MainThread - Memory usage: Total: 261.025792 MB Change: Decreased, -81.92 KB, -0.031 %
    Dec 17 05:54:27 - MainThread - Memory usage: Total: 261.050368 MB Change: Increased, 24.576 KB, 0.009 %
    Dec 17 05:54:39 - MainThread - Memory usage: Total: 261.087232 MB Change: Increased, 36.864 KB, 0.014 %
    Dec 17 05:54:54 - MainThread - Memory usage: Total: 261.935104 MB Change: Increased, 847.872 KB, 0.325 %
    Dec 17 05:55:10 - MainThread - Memory usage: Total: 261.869568 MB Change: Decreased, -65.536 KB, -0.025 %
    Dec 17 05:55:25 - MainThread - Memory usage: Total: 261.55008 MB Change: Decreased, -319.488 KB, -0.122 %
    Dec 17 05:55:40 - MainThread - Memory usage: Total: 261.844992 MB Change: Increased, 294.912 KB, 0.113 %
    Dec 17 05:55:50 - MainThread - Memory usage: Total: 261.853184 MB Change: Increased, 8.192 KB, 0.003 %
    Dec 17 05:56:00 - MainThread - Memory usage: Total: 261.709824 MB Change: Decreased, -143.36 KB, -0.055 %
    Dec 17 05:56:15 - MainThread - Memory usage: Total: 261.91872 MB Change: Increased, 208.896 KB, 0.080 %
    ....
    Dec 17 06:18:22 - MainThread - Memory usage: Total: 315.809792 MB Change: Increased, 8.192 KB, 0.003 %
    Dec 17 06:18:34 - MainThread - Memory usage: Total: 315.850752 MB Change: Increased, 40.96 KB, 0.013 %
    Dec 17 06:18:44 - MainThread - Memory usage: Total: 315.711488 MB Change: Decreased, -139.264 KB, -0.044 %
    Dec 17 06:19:00 - MainThread - Memory usage: Total: 315.67872 MB Change: Decreased, -32.768 KB, -0.010 %
    Dec 17 06:19:13 - MainThread - Memory usage: Total: 315.826176 MB Change: Increased, 147.456 KB, 0.047 %
    Dec 17 06:19:19 - MainThread - Memory usage: Total: 315.744256 MB Change: Decreased, -81.92 KB, -0.026 %
    Dec 17 06:19:25 - MainThread - Memory usage: Total: 315.793408 MB Change: Increased, 49.152 KB, 0.016 %
    Dec 17 06:19:41 - MainThread - Memory usage: Total: 323.272704 MB Change: Increased, 7479.296 KB, 2.368 %
    Dec 17 06:19:51 - MainThread - Memory usage: Total: 323.416064 MB Change: Increased, 143.36 KB, 0.044 %
    Dec 17 06:20:06 - MainThread - Memory usage: Total: 323.293184 MB Change: Decreased, -122.88 KB, -0.038 %
    ....
    Dec 17 06:43:19 - MainThread - Memory usage: Total: 344.764416 MB Change: Increased, 20.48 KB, 0.006 %
    Dec 17 06:43:30 - MainThread - Memory usage: Total: 344.707072 MB Change: Decreased, -57.344 KB, -0.017 %
    Dec 17 06:43:45 - MainThread - Memory usage: Total: 345.001984 MB Change: Increased, 294.912 KB, 0.086 %
    Dec 17 06:43:55 - MainThread - Memory usage: Total: 344.870912 MB Change: Decreased, -131.072 KB, -0.038 %
    Dec 17 06:44:05 - MainThread - Memory usage: Total: 344.887296 MB Change: Increased, 16.384 KB, 0.005 %
    Dec 17 06:44:18 - MainThread - Memory usage: Total: 344.94464 MB Change: Increased, 57.344 KB, 0.017 %
    Dec 17 06:44:28 - MainThread - Memory usage: Total: 345.018368 MB Change: Increased, 73.728 KB, 0.021 %
    Dec 17 06:44:39 - MainThread - Memory usage: Total: 344.977408 MB Change: Decreased, -40.96 KB, -0.012 %
    Dec 17 06:44:54 - MainThread - Memory usage: Total: 344.928256 MB Change: Decreased, -49.152 KB, -0.014 %
    Dec 17 06:45:04 - MainThread - Memory usage: Total: 344.879104 MB Change: Decreased, -49.152 KB, -0.014 %
    ....
    Dec 17 07:08:09 - MainThread - Memory usage: Total: 364.01152 MB Change: Increased, 3289.088 KB, 0.912 %
    Dec 17 07:08:24 - MainThread - Memory usage: Total: 364.044288 MB Change: Increased, 32.768 KB, 0.009 %
    Dec 17 07:08:39 - MainThread - Memory usage: Total: 364.191744 MB Change: Increased, 147.456 KB, 0.041 %
    Dec 17 07:08:54 - MainThread - Memory usage: Total: 364.232704 MB Change: Increased, 40.96 KB, 0.011 %
    Dec 17 07:09:05 - MainThread - Memory usage: Total: 364.208128 MB Change: Decreased, -24.576 KB, -0.007 %
    Dec 17 07:09:19 - MainThread - Memory usage: Total: 364.249088 MB Change: Increased, 40.96 KB, 0.011 %
    Dec 17 07:09:29 - MainThread - Memory usage: Total: 364.191744 MB Change: Decreased, -57.344 KB, -0.016 %
    Dec 17 07:09:44 - MainThread - Memory usage: Total: 364.158976 MB Change: Decreased, -32.768 KB, -0.009 %
    Dec 17 07:09:54 - MainThread - Memory usage: Total: 364.126208 MB Change: Decreased, -32.768 KB, -0.009 %
    Dec 17 07:10:10 - MainThread - Memory usage: Total: 364.101632 MB Change: Decreased, -24.576 KB, -0.007 %
    ....
    Dec 17 07:33:08 - MainThread - Memory usage: Total: 372.379648 MB Change: Increased, 49.152 KB, 0.013 %
    Dec 17 07:33:23 - MainThread - Memory usage: Total: 372.477952 MB Change: Increased, 98.304 KB, 0.026 %
    Dec 17 07:33:30 - MainThread - Memory usage: Total: 372.46976 MB Change: Decreased, -8.192 KB, -0.002 %
    Dec 17 07:33:36 - MainThread - Memory usage: Total: 372.453376 MB Change: Decreased, -16.384 KB, -0.004 %
    Dec 17 07:33:51 - MainThread - Memory usage: Total: 372.330496 MB Change: Decreased, -122.88 KB, -0.033 %
    Dec 17 07:34:07 - MainThread - Memory usage: Total: 372.30592 MB Change: Decreased, -24.576 KB, -0.007 %
    Dec 17 07:34:22 - MainThread - Memory usage: Total: 372.256768 MB Change: Decreased, -49.152 KB, -0.013 %
    Dec 17 07:34:37 - MainThread - Memory usage: Total: 372.215808 MB Change: Decreased, -40.96 KB, -0.011 %
    Dec 17 07:34:47 - MainThread - Memory usage: Total: 372.269056 MB Change: Increased, 53.248 KB, 0.014 %
    Dec 17 07:34:59 - MainThread - Memory usage: Total: 372.310016 MB Change: Increased, 40.96 KB, 0.011 %
    ....
    Dec 17 07:56:53 - MainThread - Memory usage: Total: 372.55168 MB Change: Decreased, -8.192 KB, -0.002 %
    Dec 17 07:57:03 - MainThread - Memory usage: Total: 372.617216 MB Change: Increased, 65.536 KB, 0.018 %
    Dec 17 07:57:13 - MainThread - Memory usage: Total: 372.453376 MB Change: Decreased, -163.84 KB, -0.044 %
    Dec 17 07:57:21 - MainThread - Memory usage: Total: 372.59264 MB Change: Increased, 139.264 KB, 0.037 %
    Dec 17 07:57:28 - MainThread - Memory usage: Total: 372.617216 MB Change: Increased, 24.576 KB, 0.007 %
    Dec 17 07:57:44 - MainThread - Memory usage: Total: 372.584448 MB Change: Decreased, -32.768 KB, -0.009 %
    Dec 17 07:57:54 - MainThread - Memory usage: Total: 372.46976 MB Change: Decreased, -114.688 KB, -0.031 %
    Dec 17 07:58:00 - MainThread - Memory usage: Total: 372.461568 MB Change: Decreased, -8.192 KB, -0.002 %
    Dec 17 07:58:07 - MainThread - Memory usage: Total: 372.424704 MB Change: Decreased, -36.864 KB, -0.010 %
    Dec 17 07:58:22 - MainThread - Memory usage: Total: 372.359168 MB Change: Decreased, -65.536 KB, -0.018 %
    ....
    Dec 17 08:21:03 - MainThread - Memory usage: Total: 372.699136 MB Change: Decreased, -8.192 KB, -0.002 %
    Dec 17 08:21:14 - MainThread - Memory usage: Total: 372.764672 MB Change: Increased, 65.536 KB, 0.018 %
    Dec 17 08:21:25 - MainThread - Memory usage: Total: 372.690944 MB Change: Decreased, -73.728 KB, -0.020 %
    Dec 17 08:21:35 - MainThread - Memory usage: Total: 372.994048 MB Change: Increased, 303.104 KB, 0.081 %
    Dec 17 08:21:50 - MainThread - Memory usage: Total: 372.87936 MB Change: Decreased, -114.688 KB, -0.031 %
    Dec 17 08:22:00 - MainThread - Memory usage: Total: 372.805632 MB Change: Decreased, -73.728 KB, -0.020 %
    Dec 17 08:22:15 - MainThread - Memory usage: Total: 372.79744 MB Change: Decreased, -8.192 KB, -0.002 %
    Dec 17 08:22:29 - MainThread - Memory usage: Total: 372.764672 MB Change: Decreased, -32.768 KB, -0.009 %
    Dec 17 08:22:37 - MainThread - Memory usage: Total: 372.79744 MB Change: Increased, 32.768 KB, 0.009 %
    Dec 17 08:22:45 - MainThread - Memory usage: Total: 372.690944 MB Change: Decreased, -106.496 KB, -0.029 %
    ....
    Dec 17 08:44:46 - MainThread - Memory usage: Total: 381.915136 MB Change: Increased, 40.96 KB, 0.011 %
    Dec 17 08:44:58 - MainThread - Memory usage: Total: 387.9936 MB Change: Increased, 6078.464 KB, 1.592 %
    Dec 17 08:45:09 - MainThread - Memory usage: Total: 387.981312 MB Change: Decreased, -12.288 KB, -0.003 %
    Dec 17 08:45:25 - MainThread - Memory usage: Total: 387.964928 MB Change: Decreased, -16.384 KB, -0.004 %
    Dec 17 08:45:40 - MainThread - Memory usage: Total: 388.284416 MB Change: Increased, 319.488 KB, 0.082 %
    Dec 17 08:45:55 - MainThread - Memory usage: Total: 388.440064 MB Change: Increased, 155.648 KB, 0.040 %
    Dec 17 08:46:06 - MainThread - Memory usage: Total: 388.407296 MB Change: Decreased, -32.768 KB, -0.008 %
    Dec 17 08:46:14 - MainThread - Memory usage: Total: 388.358144 MB Change: Decreased, -49.152 KB, -0.013 %
    Dec 17 08:46:24 - MainThread - Memory usage: Total: 388.325376 MB Change: Decreased, -32.768 KB, -0.008 %
    Dec 17 08:46:39 - MainThread - Memory usage: Total: 388.3008 MB Change: Decreased, -24.576 KB, -0.006 %
    ....
    Dec 17 09:08:33 - MainThread - Memory usage: Total: 405.762048 MB Change: Decreased, -8.192 KB, -0.002 %
    Dec 17 09:08:41 - MainThread - Memory usage: Total: 405.753856 MB Change: Decreased, -8.192 KB, -0.002 %
    Dec 17 09:08:48 - MainThread - Memory usage: Total: 405.938176 MB Change: Increased, 184.32 KB, 0.045 %
    Dec 17 09:09:03 - MainThread - Memory usage: Total: 405.880832 MB Change: Decreased, -57.344 KB, -0.014 %
    Dec 17 09:09:09 - MainThread - Memory usage: Total: 406.011904 MB Change: Increased, 131.072 KB, 0.032 %
    Dec 17 09:09:15 - MainThread - Memory usage: Total: 405.970944 MB Change: Decreased, -40.96 KB, -0.010 %
    Dec 17 09:09:27 - MainThread - Memory usage: Total: 408.100864 MB Change: Increased, 2129.92 KB, 0.525 %
    Dec 17 09:09:38 - MainThread - Memory usage: Total: 408.010752 MB Change: Decreased, -90.112 KB, -0.022 %
    Dec 17 09:09:53 - MainThread - Memory usage: Total: 408.223744 MB Change: Increased, 212.992 KB, 0.052 %
    Dec 17 09:10:08 - MainThread - Memory usage: Total: 408.109056 MB Change: Decreased, -114.688 KB, -0.028 %
    ....
    Dec 17 09:31:34 - MainThread - Memory usage: Total: 426.8032 MB Change: Increased, 114.688 KB, 0.027 %
    Dec 17 09:31:50 - MainThread - Memory usage: Total: 426.76224 MB Change: Decreased, -40.96 KB, -0.010 %
    Dec 17 09:31:59 - MainThread - Memory usage: Total: 426.778624 MB Change: Increased, 16.384 KB, 0.004 %
    

    Please have a look.

    Thanks

    opened by mmohsinkhan 11
  • Websocket support

    Websocket support

    Prior to creating an issue, please review the troubleshooting documentation: http://pycurl.io/docs/dev/troubleshooting.html

    What did you try to do?

    When will websockets be supported?

    opened by KimChow 3
  • Assertion failed: self->handle != NULL, file src/threadsupport.c, line 29

    Assertion failed: self->handle != NULL, file src/threadsupport.c, line 29

    Hi,

    I have upgraded pycurl from 7.44.0 to 7.45.1 and am seeing the above assertion fail when running the testsuite for a large python application that uses pycurl. I am still investigating and trying to write a small reproducer, and I'll attach one once I can, but I'm opening this in case it's immediately obvious to the maintainers or if anyone else is seeing it since upgrading.

    What happened?

    When running the testsuite with pycurl.verbose, this is what I see:

    ,---------------------------------------------------------------------
    | $   /usr/bin/python3 /tmp/ips.test.12726/fakeroot/pkg -R /tmp/ips.test.12726/0/image0 -D plandesc_validate=1 -D manifest_validate=Always -D smf_cmds_dir=/tmp/ips.test.12726/0/smf_cmds search -o action.name -a '<example_path>'
    | *   Trying 127.0.0.1:12001...
    | * Connected to localhost (127.0.0.1) port 12001 (#0)
    | > GET /versions/0/ HTTP/1.1
    | Host: localhost:12001
    | User-Agent: pkg/1a6ee32f8 (sunos i86pc; 5.11 omnios-master-57a305f45c; full; pkg)
    | Accept: */*
    | X-IPkg-UUID: 089741e2-a468-11ec-9b51-820820101cb6
    | X-IPkg-Variant: global,full
    |
    | * Mark bundle as not supporting multiuse
    | < HTTP/1.1 200 OK
    | < Content-Type: text/plain;charset=utf-8
    | < Server: CherryPy/18.6.1
    | < Date: Tue, 15 Mar 2022 13:58:57 GMT
    | < Cache-Control: must-revalidate, no-transform, max-age=300
    | < Expires: Tue, 15 Mar 2022 14:03:57 GMT
    | < Content-Length: 171
    | <
    | * Connection #0 to host localhost left intact
    | * Found bundle for host localhost: 0x4f1fa0 [serially]
    | * Re-using existing connection! (#0) with host localhost
    | * Connected to localhost (127.0.0.1) port 12001 (#0)
    | > GET /test/search/1/False_2_None_None_p%3C%3A%3A%3Aexample_path%3E HTTP/1.1
    | Host: localhost:12001
    | User-Agent: pkg/1a6ee32f8 (sunos i86pc; 5.11 omnios-master-57a305f45c; full; pkg)
    | Accept: */*
    | X-IPkg-UUID: 089741e2-a468-11ec-9b51-820820101cb6
    | X-IPkg-Variant: global,full
    |
    | * Mark bundle as not supporting multiuse
    | < HTTP/1.1 200 OK
    | < Content-Type: text/plain;charset=utf-8
    | < Server: CherryPy/18.6.1
    | < Date: Tue, 15 Mar 2022 13:58:58 GMT
    | < Cache-Control: must-revalidate, no-transform, max-age=14400
    | < Expires: Tue, 15 Mar 2022 17:58:58 GMT
    | < Transfer-Encoding: chunked
    | <
    | Assertion failed: self->handle != NULL, file src/threadsupport.c, line 29, function pycurl_get_thread_state
    

    The stack trace from the core file is:

    status: process terminated by SIGABRT (Abort), pid=12754 uid=0 code=-1
    libc panic message: Assertion failed: self->handle != NULL, file src/threadsupport.c, line 29, function pycurl_get_thread_state
    
    fffffc7fffdf3790 libc.so.1`abort+0x58()
    fffffc7fffdf3a00 0xfffffc7feee15382()
    fffffc7fffdf3a30 pycurl.cpython-310.so`pycurl_get_thread_state+0x187()
    fffffc7fffdf3a50 pycurl.cpython-310.so`pycurl_acquire_thread+0x11()
    fffffc7fffdf3ab0 pycurl.cpython-310.so`progress_callback+0x46()
    fffffc7fffdf3ba0 libcurl.so.4.7.0`Curl_pgrsUpdate+0x3c4()
    fffffc7fffdf3bc0 libcurl.so.4.7.0`Curl_pgrsDone+0x1a()
    fffffc7fffdf3d10 libcurl.so.4.7.0`multi_done+0x318()
    fffffc7fffdf3d40 libcurl.so.4.7.0`curl_multi_remove_handle+0xb1()
    fffffc7fffdf3d80 pycurl.cpython-310.so`util_curl_xdecref+0x87()
    fffffc7fffdf3db0 pycurl.cpython-310.so`util_curl_close+0x7c()
    fffffc7fffdf3dd0 pycurl.cpython-310.so`do_curl_dealloc+0x48()
    fffffc7fffdf3e00 libpython3.10.so.1.0`free_keys_object+0xa5()
    fffffc7fffdf3e50 libpython3.10.so.1.0`dict_dealloc+0x6f()
    fffffc7fffdf3e70 pycurl.cpython-310.so`do_multi_clear+0x9d()
    fffffc7fffdf3fd0 libpython3.10.so.1.0`gc_collect_main+0x4ef()
    fffffc7fffdf3ff0 libpython3.10.so.1.0`_PyGC_CollectNoFail+0x35()
    fffffc7fffdf4080 libpython3.10.so.1.0`finalize_modules+0x29f()
    fffffc7fffdf40c0 libpython3.10.so.1.0`Py_FinalizeEx+0x85()
    fffffc7fffdf40e0 libpython3.10.so.1.0`Py_Exit+0xd()
    fffffc7fffdf4110 libpython3.10.so.1.0`_PyErr_PrintEx.part.0.cold()
    fffffc7fffdf4130 libpython3.10.so.1.0`PyErr_PrintEx+0x1e()
    fffffc7fffdf41a0 libpython3.10.so.1.0`_PyRun_SimpleFileObject+0x3bd()
    fffffc7fffdf41e0 libpython3.10.so.1.0`_PyRun_AnyFileObject+0x8b()
    fffffc7fffdf42d0 libpython3.10.so.1.0`Py_RunMain+0x3d6()
    fffffc7fffdf4320 libpython3.10.so.1.0`Py_BytesMain+0x3c()
    fffffc7fffdf4350 _start_crt+0x87()
    fffffc7fffdf4360 _start+0x18()
    

    so it seems to be being triggered by garbage collection.

    What is the PycURL version?

    'PycURL/7.45.1 libcurl/7.82.0 OpenSSL/3.0.1 zlib/1.2.11 brotli/1.0.9 zstd/1.5.2 nghttp2/1.47.0'

    What is your Python version?

    Python 3.10.2

    What is your operating system and its version?

    OmniOS v11 r151041 SunOS bloody 5.11 omnios-master-57a305f45c i86pc i386 i86pc

    bug 
    opened by citrus-it 9
  • Build wheel on windows (with vcpkg handling dependencies)

    Build wheel on windows (with vcpkg handling dependencies)

    As per @p suggestion, copy/pasting from a previous comment:

    I've recently had to build pycurl on windows and while fixing winbuild.py is beyond me, if you're willing to delegate the dependency building to vcpkg, the build process is more straightforward.

    The following build steps will build a statically linked 64 bit wheel:

    1. Install Visual Studio (Windows SDK, MSBuild, C++/CLI support, C++ build tools, MSVC v140)
    2. Install Windows 8.1 SDK (separate download)
    3. Install vcpkg
    4. Install the required python version + pip install wheel
    5. Create the following file: <vcpkg directory>\triplets\x64-windows-python.cmake:
        set(VCPKG_TARGET_ARCHITECTURE x64)
        set(VCPKG_CRT_LINKAGE dynamic)
        set(VCPKG_LIBRARY_LINKAGE static)
        set(VCPKG_PLATFORM_TOOLSET v140)
    
    (Note: this is for x64, for 32 bit change the architecture and file name)
    
    1. Find and run “x64 Native Tools Command Prompt for VS", apply all following commands via this command prompt
    2. From the vcpkg directory, execute: .\vcpkg.exe install curl[core,openssl,http2,c-ares,winidn,ssh]:x64-windows-python
    3. Checkout pycurl and apply the following patch:
    diff --git a/setup.py b/setup.py
    index e0083e3..3663d8d 100644
    --- a/setup.py
    +++ b/setup.py
    @@ -416,17 +416,38 @@ ignore this message.''')
             return ssl_lib_detected
     
         def configure_windows(self):
    -        # Windows users have to pass --curl-dir parameter to specify path
    -        # to libcurl, because there is no curl-config on windows at all.
    -        curl_dir = scan_argv(self.argv, "--curl-dir=")
    -        if curl_dir is None:
    -            fail("Please specify --curl-dir=/path/to/built/libcurl")
    -        if not os.path.exists(curl_dir):
    -            fail("Curl directory does not exist: %s" % curl_dir)
    -        if not os.path.isdir(curl_dir):
    -            fail("Curl directory is not a directory: %s" % curl_dir)
    -        print("Using curl directory: %s" % curl_dir)
    +        # modified to compile against vcpkg install
    +        vcpkg_dir = scan_argv(self.argv, "--vcpkg-dir=")
    +        if vcpkg_dir is None:
    +            fail("Please specify --vcpkg_dir=/path/to/built/libcurl")
    +        
    +        # vcpkg package name extension
    +        vcpkg_ext = scan_argv(self.argv, "--vcpkg-ext=")
    +        if vcpkg_ext is None:
    +            fail("Please specify --vcpkg_ext=package name extension")
    +
    +        if not os.path.exists(vcpkg_dir):
    +            fail("Vcpkg directory does not exist: %s" % vcpkg_dir)
    +        if not os.path.isdir(vcpkg_dir):
    +            fail("Vcpkg directory is not a directory: %s" % vcpkg_dir)
    +
    +        print("Using vcpkg directory: %s" % vcpkg_dir)
    +        curl_dir = os.path.join(vcpkg_dir, "packages/curl_%s" % vcpkg_ext)
    +        openssl_dir = os.path.join(vcpkg_dir, "packages/openssl_%s" % vcpkg_ext)
    +
    +        zlib_dir = os.path.join(vcpkg_dir, "packages/zlib_%s" % vcpkg_ext)
    +        nghttp2_dir = os.path.join(vcpkg_dir, "packages/nghttp2_%s" % vcpkg_ext)
    +        ssh2_dir = os.path.join(vcpkg_dir, "packages/libssh2_%s" % vcpkg_ext)
    +        cares_dir = os.path.join(vcpkg_dir, "packages/c-ares_%s" % vcpkg_ext)
    +
             self.include_dirs.append(os.path.join(curl_dir, "include"))
    +        self.include_dirs.append(os.path.join(openssl_dir, "include"))
    +
    +        self.library_dirs.append(os.path.join(openssl_dir, "lib"))
    +        self.library_dirs.append(os.path.join(zlib_dir, "lib"))
    +        self.library_dirs.append(os.path.join(nghttp2_dir, "lib"))
    +        self.library_dirs.append(os.path.join(ssh2_dir, "lib"))
    +        self.library_dirs.append(os.path.join(cares_dir, "lib"))
     
             # libcurl windows documentation states that for linking against libcurl
             # dll, the import library name is libcurl_imp.lib.
    @@ -538,9 +559,12 @@ ignore this message.''')
         def using_openssl(self):
             self.define_macros.append(('HAVE_CURL_OPENSSL', 1))
             if sys.platform == "win32":
    -            # CRYPTO_num_locks is defined in libeay32.lib
    -            # for openssl < 1.1.0; it is a noop for openssl >= 1.1.0
    -            self.extra_link_args.append(self.openssl_lib_name)
    +            # Hard coded for >= openssl 1.1.0, include required windows api libraries (assuming static openssl linkage)
    +            self.extra_link_args.append("libssl.lib")
    +            self.extra_link_args.append("libcrypto.lib")
    +            self.extra_link_args.append("crypt32.lib")      # windows api used by openssl 
    +            self.extra_link_args.append("advapi32.lib")     # windows api used by openssl 
    +            self.extra_link_args.append("user32.lib")       # windows api used by openssl 
             else:
                 # we also need ssl for the certificate functions
                 # (SSL_CTX_get_cert_store)
    
    1. Build wheel: python setup.py --vcpkg-dir=<vcpkg directory> --vcpkg-ext=x64-windows-python --with-openssl --link-arg=zlib.lib --link-arg=nghttp2.lib --link-arg=cares.lib --link-arg=libssh2.lib --link-arg=normaliz.lib bdist_wheel
    opened by avivbrg 3
  • MultiCallbackTest.test_easy_pause_unpause fails on macOS

    MultiCallbackTest.test_easy_pause_unpause fails on macOS

    MultiCallbackTest.test_easy_pause_unpause fails on macOS. It's unclear whether this is a bug with the test or with the pause/unpause code itself. This is on macOS 12.1 with Secure Transport backend.

    CC: @fsbs

    __________________ MultiCallbackTest.test_easy_pause_unpause ___________________
    
    self = <tests.multi_callback_test.MultiCallbackTest testMethod=test_easy_pause_unpause>
    
        def test_easy_pause_unpause(self):
            self.multi.add_handle(self.easy)
            while self.multi.socket_action(*self.socket_action)[1]:
                if self.socket_result:
                    # libcurl informed us about new sockets
                    break
                # Without real event loop we just use blocking select call instead
                self.multi.select(0.1)
            self.socket_result = None
            # libcurl will now inform us that we should remove those sockets
            self.easy.pause(pycurl.PAUSE_ALL)
    >       assert self.socket_result is not None
    E       AssertionError: assert None is not None
    E        +  where None = <tests.multi_callback_test.MultiCallbackTest testMethod=test_easy_pause_unpause>.socket_result
    
    tests/multi_callback_test.py:87: AssertionError
    
    opened by swt2c 11
  • Cross-compile issue (build on MacOS for Linux target)

    Cross-compile issue (build on MacOS for Linux target)

    What did you try to do?

    I tried to compile python-pycurl on macos for Linux target (with GCC compiler)

    What happened?

    build failed due to setup.py detects Darwin and adds macos/clang sepecific flags unsupported by GCC (and not required for cross-compile build)

    These lines: #L350-L352:

            # Add extra compile flag for MacOS X
            if sys.platform.startswith('darwin'):
                self.extra_link_args.append("-flat_namespace")
    

    If I delete these lines, then cross-compile works fine

    What did you expect to happen?

    cross-compile build should not fail on MacOS for Linux target

    To detect target OS and avoid this issue it is possible to use something like $CC -dumpmachine, it will return something like 'aarch64-openwrt-linux-musl' if target build is Linux and it will return smth like 'arm64-apple-darwin20.6.0' if target build is MacOS, then just search for 'darwin' to detect if target build is darwin

    Could you please fix this issue? I can try to make this change by myself but I'm not sure how to do this not to look like an ugly workaround

    What is the PycURL version?

    7.44.0

    What is your Python version?

    3.10.1

    What is your operating system and its version?

    build host = MacOS target host = Linux

    Other versions

    doesn't matter

    Is this the most recent PycURL release?

    yes

    Did you check libcurl behavior?

    N/A

    opened by svlobanov 6
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
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
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
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
A modern/fast python SOAP client based on lxml / requests

Zeep: Python SOAP client A fast and modern Python SOAP client Highlights: Compatible with Python 3.6, 3.7, 3.8 and PyPy Build on top of lxml and reque

Michael van Tellingen 1.7k Jan 1, 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
Python Simple SOAP Library

PySimpleSOAP / soap2py Python simple and lightweight SOAP library for client and server webservices interfaces, aimed to be as small and easy as possi

PySimpleSOAP 369 Jan 2, 2023
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
Aiosonic - lightweight Python asyncio http client

aiosonic - lightweight Python asyncio http client Very fast, lightweight Python asyncio http client Here is some documentation. There is a performance

Johanderson Mogollon 93 Jan 6, 2023
Python package for caching HTTP response based on etag

Etag cache implementation for HTTP requests, to save request bandwidth for a non-modified response. Returns high-speed accessed dictionary data as cache.

Rakesh R 2 Apr 27, 2022
r - a small subset of Python Requests

r a small subset of Python Requests a few years ago, when I was first learning Python and looking for http functionality, i found the batteries-includ

Gabriel Sroka 4 Dec 15, 2022
ROS-UGV-Control-Interface - Control interface which can be used in any UGV

ROS-UGV-Control-Interface Cam Closed: Cam Opened:

Ahmet Fatih Akcan 1 Nov 4, 2022