def _read_request_body(self, data): """ Read a request body from the socket, parse it, and then call the request handler for the current request. """ request = self.current_request request.body = data try: content_type = request.headers.get('Content-Type', '') if request.method in ('POST', 'PUT'): if content_type.startswith( 'application/x-www-form-urlencoded'): post = request.post for key, val in parse_qsl(data, False): if key in post: if isinstance(post[key], list): post[key].append(val) else: post[key] = [post[key], val] else: post[key] = val elif content_type.startswith('multipart/form-data'): for field in content_type.split(';'): key, _, value = field.strip().partition('=') if key == 'boundary' and value: parse_multipart(request, value, data) break else: log.warning('Invalid multipart/form-data.') except BadRequest as err: log.info('Bad request from %r: %s', self.remote_address, err) request.send_response(err.message, err.code) self.close() return try: self.server.request_handler(request) except Exception: log.exception('Error handling HTTP request.') if request._started: self.close(False) else: request.send_response("500 Internal Server Error", 500) self.close()
def _read_request_body(self, data): """ Read a request body from the socket, parse it, and then call the request handler for the current request. """ request = self.current_request request.body = data try: content_type = request.headers.get('Content-Type', '') if request.method in ('POST','PUT'): if content_type.startswith('application/x-www-form-urlencoded'): post = request.post for key, val in parse_qsl(data, False): if key in post: if isinstance(post[key], list): post[key].append(val) else: post[key] = [post[key], val] else: post[key] = val elif content_type.startswith('multipart/form-data'): for field in content_type.split(';'): key, _, value = field.strip().partition('=') if key == 'boundary' and value: parse_multipart(request, value, data) break else: log.warning('Invalid multipart/form-data.') except BadRequest as err: log.info('Bad request from %r: %s', self.remote_address, err) request.send_response(err.message, err.code) self.close() return try: self.server.request_handler(request) except Exception: log.exception('Error handling HTTP request.') if request._started: self.close(False) else: request.send_response("500 Internal Server Error", 500) self.close()
def _read_header(self, data): """ Read the headers of an HTTP request from the socket, and the request body if necessary, into a new HTTPRequest instance. Then, assuming that the headers are valid, call the server's request handler. """ try: initial_line, _, data = data.partition(CRLF) try: method, url, protocol = WHITESPACE.split( initial_line) #.split(' ') except ValueError: raise BadRequest('Invalid HTTP request line.') if not protocol.startswith('HTTP/'): raise BadRequest('Invalid HTTP protocol version.', code='505 HTTP Version Not Supported') # Parse the headers. if data: headers = read_headers(data) else: headers = {} # If we're secure, we're HTTPs. if self.ssl_enabled: scheme = 'https' else: scheme = 'http' # Construct an HTTPRequest object. self.current_request = request = HTTPRequest( self, method, url, protocol, headers, scheme) # If we have a Content-Length header, read the request body. length = headers.get('Content-Length') if length: if not isinstance(length, int): raise BadRequest( 'Provided Content-Length (%r) is invalid.' % length) elif length > self.server.max_request: raise BadRequest( ('Provided Content-Length (%d) larger than server ' 'limit %d.') % (length, self.server.max_request), code='413 Request Entity Too Large') if headers.get('Expect', '').lower() == '100-continue': self.write("%s 100 (Continue)%s" % (protocol, DOUBLE_CRLF)) # Await a request body. self.on_read = self._read_request_body self.read_delimiter = length return except BadRequest as err: log.info('Bad request from %r: %s', self.remote_address, err) self.write('HTTP/1.1 %s%s' % (err.code, CRLF)) if err.message: self.write('Content-Type: text/html%s' % CRLF) self.write('Content-Length: %d%s' % (len(err.message), DOUBLE_CRLF)) self.write(err.message) else: self.write(CRLF) self.close() return except Exception as err: log.info('Exception handling request from %r: %s', self.remote_address, err) self.write('HTTP/1.1 500 Internal Server Error%s' % CRLF) self.write('Content-Length: 0%s' % DOUBLE_CRLF) self.close() return try: # Call the request handler. self.server.request_handler(request) except Exception: log.exception('Error handling HTTP request.') if request._started: self.close(False) else: request.send_response("500 Internal Server Error", 500) self.close()
def _read_header(self, data): """ Read the headers of an HTTP request from the socket, and the request body if necessary, into a new HTTPRequest instance. Then, assuming that the headers are valid, call the server's request handler. """ try: initial_line, _, data = data.partition(CRLF) try: method, uri, protocol = WHITESPACE.split(initial_line) #.split(' ') except ValueError: raise BadRequest('Invalid HTTP request line.') if not protocol.startswith('HTTP/'): raise BadRequest('Invalid HTTP protocol version.', code='505 HTTP Version Not Supported') # Parse the headers. if data: headers = read_headers(data) else: headers = {} # If we're secure, we're HTTPs. if self.ssl_enabled: scheme = 'https' else: scheme = 'http' # Construct an HTTPRequest object. self.current_request = request = HTTPRequest(self, method, uri, protocol, headers, scheme) # If we have a Content-Length header, read the request body. length = headers.get('Content-Length') if length: if not isinstance(length, int): raise BadRequest( 'Provided Content-Length (%r) is invalid.' % length ) elif length > self.server.max_request: raise BadRequest(( 'Provided Content-Length (%d) larger than server ' 'limit %d.' ) % (length, self.server.max_request), code='413 Request Entity Too Large') if headers.get('Expect','').lower() == '100-continue': self.write("%s 100 (Continue)%s" % ( protocol, DOUBLE_CRLF)) # Await a request body. self.on_read = self._read_request_body self.read_delimiter = length return except BadRequest as err: log.info('Bad request from %r: %s', self.remote_address, err) self.write('HTTP/1.1 %s%s' % (err.code, CRLF)) if err.message: self.write('Content-Type: text/html%s' % CRLF) self.write('Content-Length: %d%s' % (len(err.message), DOUBLE_CRLF)) self.write(err.message) else: self.write(CRLF) self.close() return except Exception as err: log.info('Exception handling request from %r: %s', self.remote_address, err) self.write('HTTP/1.1 500 Internal Server Error%s' % CRLF) self.write('Content-Length: 0%s' % DOUBLE_CRLF) self.close() return try: # Call the request handler. self.server.request_handler(request) except Exception: log.exception('Error handling HTTP request.') if request._started: self.close(False) else: request.send_response("500 Internal Server Error", 500) self.close()