Skip to content

Commit

Permalink
Merge pull request #122 from MasoniteFramework/change-request-variables
Browse files Browse the repository at this point in the history
Change request variables
  • Loading branch information
aisola committed May 23, 2018
2 parents 0763aa3 + 4c28004 commit 9db9b89
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 42 deletions.
77 changes: 44 additions & 33 deletions masonite/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class Request(Extendable):
"""
Handles many different aspects of a single request.
This is the object passed through to the controllers
as a request paramter
as a request parameter
"""

def __init__(self, environ=None):
Expand All @@ -40,31 +40,13 @@ def __init__(self, environ=None):
self.encryption_key = False
self.container = None

def input(self, param):
def input(self, name):
"""
Returns either the FORM_PARAMS during a POST request
or QUERY_STRING during a GET request
"""

# Special Request Methods
if self.is_not_get_request():
if isinstance(self.params, str):
return parse_qs(self.params)[param][0]

if isinstance(self.params, dict):
return self.params[param]

if not self.params[param].filename:
return self.params[param].value

if self.params[param].filename:
return self.params[param]

# GET Request Input
if self.has(param):
return parse_qs(self.params)[param][0]

return False
return self.request_variables.get(name, False)

def is_post(self):
if self.environ['REQUEST_METHOD'] == 'POST':
Expand Down Expand Up @@ -95,41 +77,71 @@ def key(self, key):

def all(self):
"""
Returns all the params
Returns all the request variables
"""

if isinstance(self.params, str):
return parse_qs(self.params)
return self.request_variables

return self.params
def only(self, *names):
"""
Returns the specified request variables in a dictionary
"""
only_vars = {}

for name in names:
only_vars[name] = self.request_variables.get(name)

return only_vars

def load_app(self, app):
self.container = app
return self

def load_environ(self, environ):
self.environ = environ
self.params = environ['QUERY_STRING']
self.method = environ['REQUEST_METHOD']
self.path = environ['PATH_INFO']
self.request_variables = {}

self._set_standardized_request_variables(environ['QUERY_STRING'])

if self.has('request_method'):
self.__set_request_method()

return self

def _set_standardized_request_variables(self, variables):
if isinstance(variables, str):
variables = parse_qs(variables)

for name in variables.keys():
value = self._get_standardized_value(variables[name])
self.request_variables[name] = value

def _get_standardized_value(self, value):
if isinstance(value, list):
return value[0]

if isinstance(value, dict):
return value

if not value.filename:
return value.value

if value.filename:
return value

return False

def app(self):
return self.container

def has(self, param):
def has(self, name):
"""
Check if a param exists
Check if a request variable exists
"""

if param in self.params:
return True

return False
return name in self.request_variables

def status(self, status):
self._status = status
Expand All @@ -139,7 +151,6 @@ def get_status_code(self):
return self._status

def header(self, key, value=None, http_prefix=True):

# Get Headers
if value is None:
if 'HTTP_{0}'.format(key) in self.environ:
Expand Down
7 changes: 4 additions & 3 deletions tests/test_extends.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,10 @@ def test_request_can_extend(self):

def test_gets_input_with_all_request_methods(self):
app = App()
app.bind('Request', self.request)
wsgi_request['QUERY_STRING'] = 'hey=test'
request_class = Request(wsgi_request)
app.bind('Request', request_class)
request = app.make('Request').load_app(app)
request.params = 'hey=test'

request.environ['REQUEST_METHOD'] = 'GET'
assert request.input('hey') == 'test'
Expand Down Expand Up @@ -108,5 +109,5 @@ def test_get_json_input(self):
Route(json_wsgi)
request_obj = Request(json_wsgi)

assert isinstance(request_obj.params, dict)
assert isinstance(request_obj.request_variables, dict)
assert request_obj.input('payload') == {'id': 1}
13 changes: 7 additions & 6 deletions tests/test_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def test_request_input_should_return_input_on_get_request(self):
assert self.request.input('application') == 'Masonite'

def test_request_all_should_return_params(self):
assert self.request.all() == {'application': ['Masonite']}
assert self.request.all() == {'application': 'Masonite'}


def test_request_has_should_return_bool(self):
Expand Down Expand Up @@ -140,7 +140,7 @@ def test_request_gets_input_from_container(self):
container.resolve(locate(provider)().load_app(container).boot)

assert container.make('Request').input('application') == 'Masonite'
assert container.make('Request').all() == {'application': ['Masonite']}
assert container.make('Request').all() == {'application': 'Masonite'}
container.make('Request').environ['REQUEST_METHOD'] = 'POST'
assert container.make('Request').environ['REQUEST_METHOD'] == 'POST'
assert container.make('Request').input('application') == 'Masonite'
Expand Down Expand Up @@ -179,7 +179,11 @@ def test_request_has_subdomain_returns_bool(self):

request.environ['HTTP_HOST'] = 'test.localhost.com'

assert request.has_subdomain() is True
request.header('TEST', 'set_this')
assert request.header('HTTP_TEST') == 'set_this'

request.header('TEST', 'set_this', http_prefix = None)
assert request.header('TEST') == 'set_this'


def test_redirect_compiles_url(self):
Expand Down Expand Up @@ -246,8 +250,6 @@ def test_redirect_compiles_url_with_multiple_parameters(self):
'test': 'user',
}

assert request.compile_route_to_url(route, params) == '/test/1/user'


def test_redirect_compiles_url_with_http(self):
app = App()
Expand Down Expand Up @@ -289,7 +291,6 @@ def test_request_gets_all_headers(self):
request.header('TEST2', 'set_this_item', http_prefix = None)
assert request.get_headers() == [('HTTP_TEST1', 'set_this_item'), ('TEST2', 'set_this_item')]


def test_request_sets_status_code(self):
app = App()
app.bind('Request', self.request)
Expand Down

0 comments on commit 9db9b89

Please sign in to comment.