11# coding: utf-8
22from __future__ import unicode_literals
33from collections import OrderedDict
4+ from coreapi import exceptions , utils
45from coreapi .compat import is_file , urlparse
56from coreapi .document import Document , Object , Link , Array , Error
6- from coreapi .exceptions import ErrorMessage
77from coreapi .transports .base import BaseTransport
8- from coreapi .utils import negotiate_decoder
98import collections
109import requests
1110import itypes
1413import uritemplate
1514
1615
17- Params = collections .namedtuple ('Params' , ['path' , 'query' , 'body' , ' data' , 'files' ])
18- empty_params = Params ({}, {}, None , {}, {})
16+ Params = collections .namedtuple ('Params' , ['path' , 'query' , 'data' , 'files' ])
17+ empty_params = Params ({}, {}, {}, {})
1918
2019
2120class ForceMultiPartDict (dict ):
@@ -35,9 +34,9 @@ def _get_method(action):
3534 return action .upper ()
3635
3736
38- def _get_params (method , fields , params = None ):
37+ def _get_params (method , encoding , fields , params = None ):
3938 """
40- Separate the params into their location types.
39+ Separate the params into the various types.
4140 """
4241 if params is None :
4342 return empty_params
@@ -46,7 +45,6 @@ def _get_params(method, fields, params=None):
4645
4746 path = {}
4847 query = {}
49- body = None
5048 data = {}
5149 files = {}
5250
@@ -58,18 +56,18 @@ def _get_params(method, fields, params=None):
5856 location = field_map [key ].location
5957
6058 if location == 'path' :
61- path [key ] = value
59+ path [key ] = utils . validate_path_param ( value , name = key )
6260 elif location == 'query' :
63- query [key ] = value
61+ query [key ] = utils . validate_query_param ( value , name = key )
6462 elif location == 'body' :
65- body = value
63+ data = utils . validate_body_param ( value , encoding = encoding , name = key )
6664 elif location == 'form' :
6765 if is_file (value ):
68- files [key ] = value
66+ files [key ] = utils . validate_form_files ( value , encoding = encoding , name = key )
6967 else :
70- data [key ] = value
68+ data [key ] = utils . validate_form_data ( value , encoding = encoding , name = key )
7169
72- return Params (path , query , body , data , files )
70+ return Params (path , query , data , files )
7371
7472
7573def _get_encoding (encoding , method ):
@@ -113,18 +111,31 @@ def _get_headers(url, decoders, credentials=None):
113111 return headers
114112
115113
116- def _get_content_type (file_obj ):
114+ def _get_upload_content_type (file_obj ):
117115 """
118116 When a raw file upload is made, determine a content-type where possible.
119117 """
120118 name = getattr (file_obj , 'name' , None )
121119 if name is not None :
122120 content_type , encoding = mimetypes .guess_type (name )
123121 else :
124- content_type = None
122+ content_type = 'application/octet-stream'
125123 return content_type
126124
127125
126+ def _get_upload_content_disposition (file_obj ):
127+ """
128+ When a raw file upload is made, determine a content-type where possible.
129+ """
130+ name = getattr (file_obj , 'name' , None )
131+ if name is not None :
132+ filename = os .path .basename (file_obj .name )
133+ content_disposition = 'attachment; filename="%s"' % filename
134+ else :
135+ content_disposition = 'attachment'
136+ return content_disposition
137+
138+
128139def _build_http_request (session , url , method , headers = None , encoding = None , params = empty_params ):
129140 """
130141 Make an HTTP request and return an HTTP response.
@@ -136,28 +147,19 @@ def _build_http_request(session, url, method, headers=None, encoding=None, param
136147 if params .query :
137148 opts ['params' ] = params .query
138149
139- if ( params . body is not None ) or params .data or params .files :
150+ if params .data or params .files :
140151 if encoding == 'application/json' :
141- if params .body is not None :
142- opts ['json' ] = params .body
143- else :
144- opts ['json' ] = params .data
152+ opts ['json' ] = params .data
145153 elif encoding == 'multipart/form-data' :
146154 opts ['data' ] = params .data
147155 opts ['files' ] = ForceMultiPartDict (params .files )
148156 elif encoding == 'application/x-www-form-urlencoded' :
149157 opts ['data' ] = params .data
150158 elif encoding == 'application/octet-stream' :
151- opts ['data' ] = params .body
152- content_type = _get_content_type (params .body )
153- if content_type :
154- opts ['headers' ]['content-type' ] = content_type
155-
156- if hasattr (params .body , 'name' ):
157- filename = os .path .basename (params .body .name )
158- content_disposition = 'attachment; filename="%s"' % filename
159- else :
160- content_disposition = 'attachment'
159+ opts ['data' ] = params .data
160+ content_type = _get_upload_content_type (params .data )
161+ content_disposition = _get_upload_content_disposition (params .data )
162+ opts ['headers' ]['content-type' ] = content_type
161163 opts ['headers' ]['content-disposition' ] = content_disposition
162164
163165 request = requests .Request (method , url , ** opts )
@@ -214,7 +216,7 @@ def _decode_result(response, decoders, force_codec=False):
214216 codec = decoders [0 ]
215217 else :
216218 content_type = response .headers .get ('content-type' )
217- codec = negotiate_decoder (decoders , content_type )
219+ codec = utils . negotiate_decoder (decoders , content_type )
218220
219221 options = {
220222 'base_url' : response .url
@@ -290,7 +292,7 @@ def transition(self, link, decoders, params=None, link_ancestors=None, force_cod
290292 session = self ._session
291293 method = _get_method (link .action )
292294 encoding = _get_encoding (link .encoding , method )
293- params = _get_params (method , link .fields , params )
295+ params = _get_params (method , encoding , link .fields , params )
294296 url = _get_url (link .url , params .path )
295297 headers = _get_headers (url , decoders , self .credentials )
296298 headers .update (self .headers )
@@ -309,6 +311,6 @@ def transition(self, link, decoders, params=None, link_ancestors=None, force_cod
309311 result = _handle_inplace_replacements (result , link , link_ancestors )
310312
311313 if isinstance (result , Error ):
312- raise ErrorMessage (result )
314+ raise exceptions . ErrorMessage (result )
313315
314316 return result
0 commit comments