You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					52 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					52 lines
				
				1.3 KiB
			| 
								 
											8 years ago
										 
									 | 
							
								# -*- coding: utf-8 -
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# This file is part of gunicorn released under the MIT license.
							 | 
						||
| 
								 | 
							
								# See the NOTICE for more information.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from gunicorn.http.message import Request
							 | 
						||
| 
								 | 
							
								from gunicorn.http.unreader import SocketUnreader, IterUnreader
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Parser(object):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mesg_class = None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(self, cfg, source):
							 | 
						||
| 
								 | 
							
								        self.cfg = cfg
							 | 
						||
| 
								 | 
							
								        if hasattr(source, "recv"):
							 | 
						||
| 
								 | 
							
								            self.unreader = SocketUnreader(source)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            self.unreader = IterUnreader(source)
							 | 
						||
| 
								 | 
							
								        self.mesg = None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # request counter (for keepalive connetions)
							 | 
						||
| 
								 | 
							
								        self.req_count = 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __iter__(self):
							 | 
						||
| 
								 | 
							
								        return self
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __next__(self):
							 | 
						||
| 
								 | 
							
								        # Stop if HTTP dictates a stop.
							 | 
						||
| 
								 | 
							
								        if self.mesg and self.mesg.should_close():
							 | 
						||
| 
								 | 
							
								            raise StopIteration()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Discard any unread body of the previous message
							 | 
						||
| 
								 | 
							
								        if self.mesg:
							 | 
						||
| 
								 | 
							
								            data = self.mesg.body.read(8192)
							 | 
						||
| 
								 | 
							
								            while data:
							 | 
						||
| 
								 | 
							
								                data = self.mesg.body.read(8192)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Parse the next request
							 | 
						||
| 
								 | 
							
								        self.req_count += 1
							 | 
						||
| 
								 | 
							
								        self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
							 | 
						||
| 
								 | 
							
								        if not self.mesg:
							 | 
						||
| 
								 | 
							
								            raise StopIteration()
							 | 
						||
| 
								 | 
							
								        return self.mesg
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    next = __next__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class RequestParser(Parser):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mesg_class = Request
							 |