Module src.onionrutils.basicrequests

Onionr - Private P2P Communication

Do HTTP GET or POST requests through a proxy

Expand source code
'''
    Onionr - Private P2P Communication

    Do HTTP GET or POST requests through a proxy
'''
'''
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
'''
import requests, streamedrequests
import logger, onionrexceptions
from etc import onionrvalues
from . import localcommand
def do_post_request(url, data={}, port=0, proxyType='tor', max_size=10000, content_type: str = ''):
    '''
    Do a POST request through a local tor or i2p instance
    '''
    if proxyType == 'tor':
        if port == 0:
            port = localcommand.local_command('/gettorsocks')
        proxies = {'http': 'socks4a://127.0.0.1:' + str(port), 'https': 'socks4a://127.0.0.1:' + str(port)}
    elif proxyType == 'i2p':
        proxies = {'http': 'http://127.0.0.1:4444'}
    else:
        return
    headers = {'User-Agent': 'PyOnionr', 'Connection':'close'}
    if len(content_type) > 0:
        headers['Content-Type'] = content_type
    try:
        proxies = {'http': 'socks4a://127.0.0.1:' + str(port), 'https': 'socks4a://127.0.0.1:' + str(port)}
        #r = requests.post(url, data=data, headers=headers, proxies=proxies, allow_redirects=False, timeout=(15, 30))
        r = streamedrequests.post(url, post_data=data, request_headers=headers, proxy=proxies, connect_timeout=15, stream_timeout=30, max_size=max_size, allow_redirects=False)
        retData = r[1]
    except KeyboardInterrupt:
        raise KeyboardInterrupt
    except requests.exceptions.RequestException as e:
        logger.debug('Error: %s' % str(e))
        retData = False
    return retData

def do_get_request(url, port=0, proxyType='tor', ignoreAPI=False, returnHeaders=False, max_size=5242880):
    '''
    Do a get request through a local tor or i2p instance
    '''
    API_VERSION = onionrvalues.API_VERSION
    retData = False
    if proxyType == 'tor':
        if port == 0:
            raise onionrexceptions.MissingPort('Socks port required for Tor HTTP get request')
        proxies = {'http': 'socks4a://127.0.0.1:' + str(port), 'https': 'socks4a://127.0.0.1:' + str(port)}
    elif proxyType == 'i2p':
        proxies = {'http': 'http://127.0.0.1:4444'}
    else:
        return
    headers = {'User-Agent': 'PyOnionr', 'Connection':'close'}
    response_headers = dict()
    try:
        proxies = {'http': 'socks4a://127.0.0.1:' + str(port), 'https': 'socks4a://127.0.0.1:' + str(port)}
        r = streamedrequests.get(url, request_headers=headers, allow_redirects=False, proxy=proxies, connect_timeout=15, stream_timeout=120, max_size=max_size)
        # Check server is using same API version as us
        if not ignoreAPI:
            try:
                response_headers = r[0].headers
                if r[0].headers['X-API'] != str(API_VERSION):
                    raise onionrexceptions.InvalidAPIVersion
            except KeyError:
                raise onionrexceptions.InvalidAPIVersion
        retData = r[1]
    except KeyboardInterrupt:
        raise KeyboardInterrupt
    except ValueError as e:
        pass
    except onionrexceptions.InvalidAPIVersion:
        if 'X-API' in response_headers:
            logger.debug('Using API version %s. Cannot communicate with node\'s API version of %s.' % (API_VERSION, response_headers['X-API']))
        else:
            logger.debug('Using API version %s. API version was not sent with the request.' % API_VERSION)
    except requests.exceptions.RequestException as e:
        if not 'ConnectTimeoutError' in str(e) and not 'Request rejected or failed' in str(e):
            logger.debug('Error: %s' % str(e))
        retData = False
    if returnHeaders:
        return (retData, response_headers)
    else:
        return retData

Functions

def do_get_request(url, port=0, proxyType='tor', ignoreAPI=False, returnHeaders=False, max_size=5242880)

Do a get request through a local tor or i2p instance

Expand source code
def do_get_request(url, port=0, proxyType='tor', ignoreAPI=False, returnHeaders=False, max_size=5242880):
    '''
    Do a get request through a local tor or i2p instance
    '''
    API_VERSION = onionrvalues.API_VERSION
    retData = False
    if proxyType == 'tor':
        if port == 0:
            raise onionrexceptions.MissingPort('Socks port required for Tor HTTP get request')
        proxies = {'http': 'socks4a://127.0.0.1:' + str(port), 'https': 'socks4a://127.0.0.1:' + str(port)}
    elif proxyType == 'i2p':
        proxies = {'http': 'http://127.0.0.1:4444'}
    else:
        return
    headers = {'User-Agent': 'PyOnionr', 'Connection':'close'}
    response_headers = dict()
    try:
        proxies = {'http': 'socks4a://127.0.0.1:' + str(port), 'https': 'socks4a://127.0.0.1:' + str(port)}
        r = streamedrequests.get(url, request_headers=headers, allow_redirects=False, proxy=proxies, connect_timeout=15, stream_timeout=120, max_size=max_size)
        # Check server is using same API version as us
        if not ignoreAPI:
            try:
                response_headers = r[0].headers
                if r[0].headers['X-API'] != str(API_VERSION):
                    raise onionrexceptions.InvalidAPIVersion
            except KeyError:
                raise onionrexceptions.InvalidAPIVersion
        retData = r[1]
    except KeyboardInterrupt:
        raise KeyboardInterrupt
    except ValueError as e:
        pass
    except onionrexceptions.InvalidAPIVersion:
        if 'X-API' in response_headers:
            logger.debug('Using API version %s. Cannot communicate with node\'s API version of %s.' % (API_VERSION, response_headers['X-API']))
        else:
            logger.debug('Using API version %s. API version was not sent with the request.' % API_VERSION)
    except requests.exceptions.RequestException as e:
        if not 'ConnectTimeoutError' in str(e) and not 'Request rejected or failed' in str(e):
            logger.debug('Error: %s' % str(e))
        retData = False
    if returnHeaders:
        return (retData, response_headers)
    else:
        return retData
def do_post_request(url, data={}, port=0, proxyType='tor', max_size=10000, content_type='')

Do a POST request through a local tor or i2p instance

Expand source code
def do_post_request(url, data={}, port=0, proxyType='tor', max_size=10000, content_type: str = ''):
    '''
    Do a POST request through a local tor or i2p instance
    '''
    if proxyType == 'tor':
        if port == 0:
            port = localcommand.local_command('/gettorsocks')
        proxies = {'http': 'socks4a://127.0.0.1:' + str(port), 'https': 'socks4a://127.0.0.1:' + str(port)}
    elif proxyType == 'i2p':
        proxies = {'http': 'http://127.0.0.1:4444'}
    else:
        return
    headers = {'User-Agent': 'PyOnionr', 'Connection':'close'}
    if len(content_type) > 0:
        headers['Content-Type'] = content_type
    try:
        proxies = {'http': 'socks4a://127.0.0.1:' + str(port), 'https': 'socks4a://127.0.0.1:' + str(port)}
        #r = requests.post(url, data=data, headers=headers, proxies=proxies, allow_redirects=False, timeout=(15, 30))
        r = streamedrequests.post(url, post_data=data, request_headers=headers, proxy=proxies, connect_timeout=15, stream_timeout=30, max_size=max_size, allow_redirects=False)
        retData = r[1]
    except KeyboardInterrupt:
        raise KeyboardInterrupt
    except requests.exceptions.RequestException as e:
        logger.debug('Error: %s' % str(e))
        retData = False
    return retData