| 2844 | self.active = False |
| 2845 | |
| 2846 | class AsyncoreEchoServer(threading.Thread): |
| 2847 | |
| 2848 | # this one's based on asyncore.dispatcher |
| 2849 | |
| 2850 | class EchoServer (asyncore.dispatcher): |
| 2851 | |
| 2852 | class ConnectionHandler(asyncore.dispatcher_with_send): |
| 2853 | |
| 2854 | def __init__(self, conn, certfile): |
| 2855 | self.socket = test_wrap_socket(conn, server_side=True, |
| 2856 | certfile=certfile, |
| 2857 | do_handshake_on_connect=False) |
| 2858 | asyncore.dispatcher_with_send.__init__(self, self.socket) |
| 2859 | self._ssl_accepting = True |
| 2860 | self._do_ssl_handshake() |
| 2861 | |
| 2862 | def readable(self): |
| 2863 | if isinstance(self.socket, ssl.SSLSocket): |
| 2864 | while self.socket.pending() > 0: |
| 2865 | self.handle_read_event() |
| 2866 | return True |
| 2867 | |
| 2868 | def _do_ssl_handshake(self): |
| 2869 | try: |
| 2870 | self.socket.do_handshake() |
| 2871 | except (ssl.SSLWantReadError, ssl.SSLWantWriteError): |
| 2872 | return |
| 2873 | except ssl.SSLEOFError: |
| 2874 | return self.handle_close() |
| 2875 | except ssl.SSLError: |
| 2876 | raise |
| 2877 | except OSError as err: |
| 2878 | if err.args[0] == errno.ECONNABORTED: |
| 2879 | return self.handle_close() |
| 2880 | else: |
| 2881 | self._ssl_accepting = False |
| 2882 | |
| 2883 | def handle_read(self): |
| 2884 | if self._ssl_accepting: |
| 2885 | self._do_ssl_handshake() |
| 2886 | else: |
| 2887 | data = self.recv(1024) |
| 2888 | if support.verbose: |
| 2889 | sys.stdout.write(" server: read %s from client\n" % repr(data)) |
| 2890 | if not data: |
| 2891 | self.close() |
| 2892 | else: |
| 2893 | self.send(data.lower()) |
| 2894 | |
| 2895 | def handle_close(self): |
| 2896 | self.close() |
| 2897 | if support.verbose: |
| 2898 | sys.stdout.write(" server: closed connection %s\n" % self.socket) |
| 2899 | |
| 2900 | def handle_error(self): |
| 2901 | raise |
| 2902 | |
| 2903 | def __init__(self, certfile): |
no outgoing calls
searching dependent graphs…