Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 8 additions & 12 deletions pyrax/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,12 @@
import logging
import json
import requests
import threading

import pyrax
import pyrax.exceptions as exc


req_methods = {
"HEAD": requests.head,
"GET": requests.get,
"POST": requests.post,
"PUT": requests.put,
"DELETE": requests.delete,
"PATCH": requests.patch,
}
tls = threading.local()

# NOTE: FIX THIS!!!
verify_ssl = False
Expand All @@ -46,7 +39,6 @@ def request(method, uri, *args, **kwargs):
Formats the request into a dict representing the headers
and body that will be used to make the API call.
"""
req_method = req_methods[method.upper()]
raise_exception = kwargs.pop("raise_exception", True)
raw_content = kwargs.pop("raw_content", False)
kwargs["headers"] = kwargs.get("headers", {})
Expand All @@ -59,10 +51,14 @@ def request(method, uri, *args, **kwargs):
if "Content-Type" not in kwargs["headers"]:
kwargs["headers"]["Content-Type"] = "application/json"
data = json.dumps(kwargs.pop("body"))
session = getattr(tls, 'pyrax_http_session', None)
if session is None:
session = requests.Session()
tls.pyrax_http_session = session
if data:
resp = req_method(uri, data=data, **kwargs)
resp = session.request(method, uri, data=data, **kwargs)
else:
resp = req_method(uri, **kwargs)
resp = session.request(method, uri, **kwargs)
if raw_content:
body = resp.content
else:
Expand Down
57 changes: 23 additions & 34 deletions tests/unit/test_http.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@
from pyrax import client

from pyrax import fakes

from requests import Session as req_session


class HttpTest(unittest.TestCase):
def __init__(self, *args, **kwargs):
super(HttpTest, self).__init__(*args, **kwargs)
self.http = pyrax.http
self.http_method_choices = ("HEAD", "GET", "POST", "PUT", "DELETE", "PATCH")

def setUp(self):
pass
Expand All @@ -29,77 +30,65 @@ def tearDown(self):
pass

def test_request(self):
mthd = random.choice(self.http.req_methods.keys())
sav_method = self.http.req_methods[mthd]
mthd = random.choice(self.http_method_choices)
resp = fakes.FakeResponse()
self.http.req_methods[mthd] = Mock(return_value=resp)
uri = utils.random_unicode()
hk = utils.random_unicode()
hv = utils.random_unicode()
headers = {hk: hv}
self.http.request(mthd, uri, headers=headers)
self.http.req_methods[mthd].assert_called_once_with(uri,
headers=headers)
self.http.req_methods[mthd] = sav_method
with patch.object(req_session, 'request', return_value=resp) as mocked:
self.http.request(mthd, uri, headers=headers)
mocked.assert_called_once_with(mthd, uri, headers=headers)

def test_request_no_json(self):
mthd = random.choice(self.http.req_methods.keys())
sav_method = self.http.req_methods[mthd]
mthd = random.choice(self.http_method_choices)
resp = fakes.FakeResponse()
resp.json = Mock(side_effect=ValueError(""))
self.http.req_methods[mthd] = Mock(return_value=resp)
uri = utils.random_unicode()
hk = utils.random_unicode()
hv = utils.random_unicode()
headers = {hk: hv}
self.http.request(mthd, uri, headers=headers)
self.http.req_methods[mthd].assert_called_once_with(uri,
headers=headers)
self.http.req_methods[mthd] = sav_method
with patch.object(req_session, 'request', return_value=resp) as mocked:
self.http.request(mthd, uri, headers=headers)
mocked.assert_called_once_with(mthd, uri, headers=headers)

def test_request_exception(self):
mthd = random.choice(self.http.req_methods.keys())
sav_method = self.http.req_methods[mthd]
mthd = random.choice(self.http_method_choices)
resp = fakes.FakeResponse()
resp.status_code = 404
self.http.req_methods[mthd] = Mock(return_value=resp)
uri = utils.random_unicode()
hk = utils.random_unicode()
hv = utils.random_unicode()
headers = {hk: hv}
self.assertRaises(exc.NotFound, self.http.request, mthd, uri,
headers=headers)
with patch.object(req_session, 'request', return_value=resp) as mocked:
self.assertRaises(exc.NotFound, self.http.request, mthd, uri,
headers=headers)
mocked.assert_called_once_with(mthd, uri, headers=headers)

def test_request_data(self):
mthd = random.choice(self.http.req_methods.keys())
sav_method = self.http.req_methods[mthd]
mthd = random.choice(self.http_method_choices)
resp = fakes.FakeResponse()
self.http.req_methods[mthd] = Mock(return_value=resp)
uri = utils.random_unicode()
hk = utils.random_unicode()
hv = utils.random_unicode()
headers = {hk: hv}
data = utils.random_unicode()
self.http.request(mthd, uri, headers=headers, data=data)
self.http.req_methods[mthd].assert_called_once_with(uri,
headers=headers, data=data)
self.http.req_methods[mthd] = sav_method
with patch.object(req_session, 'request', return_value=resp) as mocked:
self.http.request(mthd, uri, headers=headers, data=data)
mocked.assert_called_once_with(mthd, uri, headers=headers, data=data)

def test_request_body(self):
mthd = random.choice(self.http.req_methods.keys())
sav_method = self.http.req_methods[mthd]
mthd = random.choice(self.http_method_choices)
resp = fakes.FakeResponse()
self.http.req_methods[mthd] = Mock(return_value=resp)
uri = utils.random_unicode()
hk = utils.random_unicode()
hv = utils.random_unicode()
headers = {hk: hv}
body = utils.random_unicode()
jbody = json.dumps(body)
self.http.request(mthd, uri, headers=headers, body=body)
self.http.req_methods[mthd].assert_called_once_with(uri,
headers=headers, data=jbody)
self.http.req_methods[mthd] = sav_method
with patch.object(req_session, 'request', return_value=resp) as mocked:
self.http.request(mthd, uri, headers=headers, body=body)
mocked.assert_called_once_with(mthd, uri, headers=headers, data=jbody)

def test_http_log_req(self):
args = ("a", "b")
Expand Down