Source code for pyrabbit.http
import json
import os
import socket
import requests
import requests.exceptions
from requests.auth import HTTPBasicAuth
try:
from urlparse import urljoin, urlparse, urlunparse
except ImportError:
from urllib.parse import urljoin, urlparse, urlunparse
[docs]class HTTPError(Exception):
"""
An error response from the API server. This should be an
HTTP error of some kind (404, 500, etc).
"""
def __init__(self, content, status=None, reason=None, path=None, body=None):
#HTTP status code
self.status = status
# human readable HTTP status
self.reason = reason
self.path = path
self.body = body
self.detail = None
# Actual, useful reason for failure returned by RabbitMQ
self.detail=None
if content and content.get('reason'):
self.detail = content['reason']
self.output = "%s - %s (%s) (%s) (%s)" % (self.status,
self.reason,
self.detail,
self.path,
repr(self.body))
def __str__(self):
return self.output
[docs]class NetworkError(Exception):
"""Denotes a failure to communicate with the REST API
"""
pass
[docs]class HTTPClient(object):
"""
A wrapper for requests. Abstracts away
things like path building, return value parsing, etc.,
so the api module code stays clean and easy to read/use.
"""
def __init__(self, api_url, uname, passwd, timeout=5, scheme='http'):
"""
:param string api_url: The base URL for the broker API.
:param string uname: Username credential used to authenticate.
:param string passwd: Password used to authenticate w/ REST API
:param int timeout: Integer number of seconds to wait for each call.
:param string scheme: HTTP scheme used to connect
"""
self.auth = HTTPBasicAuth(uname, passwd)
self.timeout = timeout
api_url = '%s://%s' % (scheme, api_url)
self.base_url = api_url
[docs] def do_call(self, path, method, body=None, headers=None):
"""
Send an HTTP request to the REST API.
:param string path: A URL
:param string method: The HTTP method (GET, POST, etc.) to use
in the request.
:param string body: A string representing any data to be sent in the
body of the HTTP request.
:param dictionary headers:
"{header-name: header-value}" dictionary.
"""
url = urljoin(self.base_url, path)
try:
resp = requests.request(method, url, data=body, headers=headers,
auth=self.auth, timeout=self.timeout)
except requests.exceptions.Timeout as out:
raise NetworkError("Timeout while trying to connect to RabbitMQ")
except requests.exceptions.RequestException as err:
# All other requests exceptions inherit from RequestException
raise NetworkError("Error during request %s %s" % (type(err), err))
try:
content = resp.json()
except ValueError as out:
content = None
# 'success' HTTP status codes are 200-206
if resp.status_code < 200 or resp.status_code > 206:
raise HTTPError(content, resp.status_code, resp.text, path, body)
else:
if content:
return content
else:
return None