- check response header briefly
- fix setup.py
This commit is contained in:
		
							
								
								
									
										1
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								setup.py
									
									
									
									
									
								
							| @@ -20,4 +20,5 @@ setup( | ||||
|         "Topic :: Software Development :: Libraries :: Python Modules", | ||||
|         "Intended Audience :: Developers", | ||||
|     ], | ||||
|     py_modules=["websocket"], | ||||
| ) | ||||
|   | ||||
							
								
								
									
										60
									
								
								websocket.py
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								websocket.py
									
									
									
									
									
								
							| @@ -3,7 +3,10 @@ from urlparse import urlparse | ||||
| import random | ||||
|  | ||||
|  | ||||
| class ConnectionClosedException(Exception): | ||||
| class WebSocketException(Exception): | ||||
|     pass | ||||
|  | ||||
| class ConnectionClosedException(WebSocketException): | ||||
|     pass | ||||
|  | ||||
| default_timeout = None | ||||
| @@ -34,6 +37,8 @@ def _parse_url(url): | ||||
|             port = parsed.port | ||||
|         else: | ||||
|             port = 80 | ||||
|     elif parsed.scheme == "wss": | ||||
|         raise ValueError("scheme wss is not supported") | ||||
|     else: | ||||
|         raise ValueError("scheme %s is invalid" % parsed.scheme) | ||||
|      | ||||
| @@ -53,14 +58,10 @@ def create_connection(url, timeout=None): | ||||
|     Passing optional timeout parameter will set the timeout on the socket. | ||||
|     If no timeout is supplied, the global default timeout setting returned by getdefauttimeout() is used. | ||||
|     """ | ||||
|     try: | ||||
|         websock = WebSocket() | ||||
|         websock.settimeout(timeout != None and timeout or default_timeout) | ||||
|         websock.connect(url) | ||||
|         return websock | ||||
|     except Exception, e: | ||||
|         #websock.close() | ||||
|         raise e | ||||
|     websock = WebSocket() | ||||
|     websock.settimeout(timeout != None and timeout or default_timeout) | ||||
|     websock.connect(url) | ||||
|     return websock | ||||
|  | ||||
| _MAX_INTEGER = (1 << 32) -1 | ||||
| _AVAILABLE_KEY_CHARS = range(0x21, 0x2f + 1) + range(0x3a, 0x7e + 1) | ||||
| @@ -88,6 +89,11 @@ def _create_sec_websocket_key(): | ||||
| def _create_key3(): | ||||
|     return "".join([chr(random.randint(0, _MAX_CHAR_BYTE)) for i in range(8)]) | ||||
|  | ||||
| HEADERS_TO_CHECK = { | ||||
|     "Upgrade": "websocket", | ||||
|     "Connection": "upgrade", | ||||
|     } | ||||
|      | ||||
|  | ||||
| class WebSocket(object): | ||||
|     def __init__(self): | ||||
| @@ -130,22 +136,50 @@ class WebSocket(object): | ||||
|         headers.append("Host: %s" % hostport) | ||||
|         headers.append("Origin: %s" % hostport) | ||||
|          | ||||
|         number_1, key_1 = _create_sec_websocket_key() | ||||
|         # number_1, key_1 = _create_sec_websocket_key() | ||||
|         # headers.append("Sec-WebSocket-Key1: %s" % key_1) | ||||
|         number_2, key_2 = _create_sec_websocket_key() | ||||
|         # number_2, key_2 = _create_sec_websocket_key() | ||||
|         # headers.append("Sec-WebSocket-Key2: %s" % key_2) | ||||
|          | ||||
|         header_str = "\r\n".join(headers) | ||||
|         sock.send(header_str) | ||||
|         sock.send("\r\n\r\n") | ||||
|         key3 = _create_key3() | ||||
|         # key3 = _create_key3() | ||||
|         #sock.send(key3) | ||||
|  | ||||
|         status, resp_headers = self._read_headers() | ||||
|         if status != 101: | ||||
|             self.sock.close() | ||||
|             raise WebSocketException("Handshake Status %d" % status) | ||||
|         if not self._validate_header(resp_headers): | ||||
|             self.sock.close() | ||||
|             raise WebSocketException("Invalid WebSocket Header") | ||||
|  | ||||
|     def _validate_header(self, headers): | ||||
|         #TODO: check other headers | ||||
|         for key, value in HEADERS_TO_CHECK.iteritems(): | ||||
|             v = headers[key] | ||||
|             if value != v: | ||||
|                 return False | ||||
|         return True | ||||
|              | ||||
|  | ||||
|     def _read_headers(self): | ||||
|         status = None | ||||
|         headers = {} | ||||
|         while True: | ||||
|             line = self._recv_line() | ||||
|             # TODO: check handshake response | ||||
|             if line == "\r\n": | ||||
|                 break | ||||
|             line = line.strip() | ||||
|             if not status: | ||||
|                 status_info = line.split(" ", 2) | ||||
|                 status = int(status_info[1]) | ||||
|             else: | ||||
|                 key, value = line.split(":", 1) | ||||
|                 headers[key] = value.strip().lower() | ||||
|          | ||||
|         return status, headers     | ||||
|      | ||||
|     def send(self, payload): | ||||
|         """ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 liris
					liris