# Path: exactonline/http.py
# FALLBACK_CACERT_FILE = '/etc/ssl/certs/ca-certificates.crt'
#     _PROPERTIES = ('protocols', 'verify_cert', 'cacert_file', 'headers')
# def binquote(value):
#     def __init__(self, url, code, msg, hdrs, response, reqmethod, reqdata):
#     def clean_and_trim(value):
#     def get_content_type(self):
#     def format_req(self):
#     def format_resp(self):
#     def __str__(self):
#     def __or__(self, other):
#     def __init__(self, method=None, *args, **kwargs):
#     def get_method(self):
#     def __init__(self, *args, **kwargs):
#     def connect(self):
#     def __init__(self, cacert_file):
#     def https_open(self, req):
# def http_req(method, url, data=None, opt=opt_default, limiter=None):
# def _marshalled(data):
# def _update_ratelimiter_with_exactonline_headers(limiter, headers):
# def _http_request(url, method=None, data=None, opt=None, limiter=None):
# class BadProtocol(ValueError):
# class HTTPError(request.HTTPError):
# class Options(object):
# class Request(request.Request):
# class ValidHTTPSConnection(HTTPConnection):
# class ValidHTTPSHandler(request.HTTPSHandler):
#             class CustomValidHTTPSConnection(ValidHTTPSConnection):


import json
import logging
import os
import sys
from time import sleep, time
from .http import HTTPError, Options, opt_secure, http_req, binquote, urljoin
                    amount_left = self._reset_times[key][1]

        if wait_until is not None and amount_left < 1:
            return max((wait_until - now), 0)

        return 0

    def __repr__(self):
        return '<RateLimiter({}, {!r})>'.format(
            int(time()), self._reset_times)


class ExactRawApi(object):
    def __init__(self, storage, **kwargs):
        super(ExactRawApi, self).__init__(**kwargs)
        self.storage = storage
        self.limiter = self.get_ratelimiter()

    def get_ratelimiter(self):
        """
        Create a RateLimiter instance. Override this if you want non-default
        rate limiting behaviour.

        TODO: Consider moving the default RateLimiter to a separate Mixin?
        """
        return RateLimiter()

    def create_auth_request_url(self):
        # Build the URLs manually so we get consistent order.
        auth_params = {

# Path: exactonline/http.py
# FALLBACK_CACERT_FILE = '/etc/ssl/certs/ca-certificates.crt'
#     _PROPERTIES = ('protocols', 'verify_cert', 'cacert_file', 'headers')
# def binquote(value):
#     def __init__(self, url, code, msg, hdrs, response, reqmethod, reqdata):
#     def clean_and_trim(value):
#     def get_content_type(self):
#     def format_req(self):
#     def format_resp(self):
#     def __str__(self):
#     def __or__(self, other):
#     def __init__(self, method=None, *args, **kwargs):
#     def get_method(self):
#     def __init__(self, *args, **kwargs):
#     def connect(self):
#     def __init__(self, cacert_file):
#     def https_open(self, req):
# def http_req(method, url, data=None, opt=opt_default, limiter=None):
# def _marshalled(data):
# def _update_ratelimiter_with_exactonline_headers(limiter, headers):
# def _http_request(url, method=None, data=None, opt=None, limiter=None):
# class BadProtocol(ValueError):
# class HTTPError(request.HTTPError):
# class Options(object):
# class Request(request.Request):
# class ValidHTTPSConnection(HTTPConnection):
# class ValidHTTPSHandler(request.HTTPSHandler):
#             class CustomValidHTTPSConnection(ValidHTTPSConnection):


# Path: exactonline/rawapi.py
import json
import logging
import os
import sys
from time import sleep, time
from .http import HTTPError, Options, opt_secure, http_req, binquote, urljoin

                    amount_left = self._reset_times[key][1]

        if wait_until is not None and amount_left < 1:
            return max((wait_until - now), 0)

        return 0

    def __repr__(self):
        return '<RateLimiter({}, {!r})>'.format(
            int(time()), self._reset_times)


class ExactRawApi(object):
    def __init__(self, storage, **kwargs):
        super(ExactRawApi, self).__init__(**kwargs)
        self.storage = storage
        self.limiter = self.get_ratelimiter()

    def get_ratelimiter(self):
        """
        Create a RateLimiter instance. Override this if you want non-default
        rate limiting behaviour.

        TODO: Consider moving the default RateLimiter to a separate Mixin?
        """
        return RateLimiter()

    def create_auth_request_url(self):
        # Build the URLs manually so we get consistent order.
        auth_params = {

            'client_id': binquote(self.storage.get_client_id()),