1 import org.python.core.*;
3 public class SocketServer extends java.lang.Object {
4 static String[] jpy$mainProperties = new String[] {"python.modules.builtin", "exceptions:org.python.core.exceptions"};
5 static String[] jpy$proxyProperties = new String[] {"python.modules.builtin", "exceptions:org.python.core.exceptions", "python.options.showJavaExceptions", "true"};
6 static String[] jpy$packages = new String[] {"java.net", null, "java.lang", null, "org.python.core", null, "java.io", null, "java.util.zip", null};
8 public static class _PyInner extends PyFunctionTable implements PyRunnable {
9 private static PyObject s$0;
10 private static PyObject s$1;
11 private static PyObject s$2;
12 private static PyObject s$3;
13 private static PyObject s$4;
14 private static PyObject s$5;
15 private static PyObject s$6;
16 private static PyObject s$7;
17 private static PyObject s$8;
18 private static PyObject s$9;
19 private static PyObject s$10;
20 private static PyObject s$11;
21 private static PyObject s$12;
22 private static PyObject s$13;
23 private static PyObject s$14;
24 private static PyObject s$15;
25 private static PyObject s$16;
26 private static PyObject s$17;
27 private static PyObject s$18;
28 private static PyObject s$19;
29 private static PyObject s$20;
30 private static PyObject s$21;
31 private static PyObject i$22;
32 private static PyObject s$23;
33 private static PyObject s$24;
34 private static PyObject s$25;
35 private static PyObject s$26;
36 private static PyObject s$27;
37 private static PyObject s$28;
38 private static PyObject s$29;
39 private static PyObject s$30;
40 private static PyObject i$31;
41 private static PyObject s$32;
42 private static PyObject s$33;
43 private static PyObject i$34;
44 private static PyObject i$35;
45 private static PyObject s$36;
46 private static PyObject s$37;
47 private static PyObject s$38;
48 private static PyObject s$39;
49 private static PyObject i$40;
50 private static PyObject s$41;
51 private static PyObject s$42;
52 private static PyObject s$43;
53 private static PyObject s$44;
54 private static PyObject s$45;
55 private static PyObject s$46;
56 private static PyObject s$47;
57 private static PyObject s$48;
58 private static PyObject s$49;
59 private static PyObject s$50;
60 private static PyObject s$51;
61 private static PyFunctionTable funcTable;
62 private static PyCode c$0___init__;
63 private static PyCode c$1_server_activate;
64 private static PyCode c$2_serve_forever;
65 private static PyCode c$3_handle_request;
66 private static PyCode c$4_verify_request;
67 private static PyCode c$5_process_request;
68 private static PyCode c$6_server_close;
69 private static PyCode c$7_finish_request;
70 private static PyCode c$8_close_request;
71 private static PyCode c$9_handle_error;
72 private static PyCode c$10_BaseServer;
73 private static PyCode c$11___init__;
74 private static PyCode c$12_server_bind;
75 private static PyCode c$13_server_activate;
76 private static PyCode c$14_server_close;
77 private static PyCode c$15_fileno;
78 private static PyCode c$16_get_request;
79 private static PyCode c$17_close_request;
80 private static PyCode c$18_TCPServer;
81 private static PyCode c$19_get_request;
82 private static PyCode c$20_server_activate;
83 private static PyCode c$21_close_request;
84 private static PyCode c$22_UDPServer;
85 private static PyCode c$23_collect_children;
86 private static PyCode c$24_process_request;
87 private static PyCode c$25_ForkingMixIn;
88 private static PyCode c$26_process_request;
89 private static PyCode c$27_ThreadingMixIn;
90 private static PyCode c$28_ForkingUDPServer;
91 private static PyCode c$29_ForkingTCPServer;
92 private static PyCode c$30_ThreadingUDPServer;
93 private static PyCode c$31_ThreadingTCPServer;
94 private static PyCode c$32_UnixStreamServer;
95 private static PyCode c$33_UnixDatagramServer;
96 private static PyCode c$34_ThreadingUnixStreamServer;
97 private static PyCode c$35_ThreadingUnixDatagramServer;
98 private static PyCode c$36___init__;
99 private static PyCode c$37_setup;
100 private static PyCode c$38___del__;
101 private static PyCode c$39_handle;
102 private static PyCode c$40_finish;
103 private static PyCode c$41_BaseRequestHandler;
104 private static PyCode c$42_setup;
105 private static PyCode c$43_finish;
106 private static PyCode c$44_StreamRequestHandler;
107 private static PyCode c$45_setup;
108 private static PyCode c$46_finish;
109 private static PyCode c$47_DatagramRequestHandler;
110 private static PyCode c$48_main;
111 private static void initConstants() {
112 s$0 = Py.newString("Generic socket server classes.\012\012This module tries to capture the various aspects of defining a server:\012\012For socket-based servers:\012\012- address family:\012 - AF_INET: IP (Internet Protocol) sockets (default)\012 - AF_UNIX: Unix domain sockets\012 - others, e.g. AF_DECNET are conceivable (see <socket.h>\012- socket type:\012 - SOCK_STREAM (reliable stream, e.g. TCP)\012 - SOCK_DGRAM (datagrams, e.g. UDP)\012\012For request-based servers (including socket-based):\012\012- client address verification before further looking at the request\012 (This is actually a hook for any processing that needs to look\012 at the request before anything else, e.g. logging)\012- how to handle multiple requests:\012 - synchronous (one request is handled at a time)\012 - forking (each request is handled by a new process)\012 - threading (each request is handled by a new thread)\012\012The classes in this module favor the server type that is simplest to\012write: a synchronous TCP/IP server. This is bad class design, but\012save some typing. (There's also the issue that a deep class hierarchy\012slows down method lookups.)\012\012There are five classes in an inheritance diagram, four of which represent\012synchronous servers of four types:\012\012 +------------+\012 | BaseServer |\012 +------------+\012 |\012 v\012 +-----------+ +------------------+\012 | TCPServer |------->| UnixStreamServer |\012 +-----------+ +------------------+\012 |\012 v\012 +-----------+ +--------------------+\012 | UDPServer |------->| UnixDatagramServer |\012 +-----------+ +--------------------+\012\012Note that UnixDatagramServer derives from UDPServer, not from\012UnixStreamServer -- the only difference between an IP and a Unix\012stream server is the address family, which is simply repeated in both\012unix server classes.\012\012Forking and threading versions of each type of server can be created\012using the ForkingServer and ThreadingServer mix-in classes. For\012instance, a threading UDP server class is created as follows:\012\012 class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass\012\012The Mix-in class must come first, since it overrides a method defined\012in UDPServer!\012\012To implement a service, you must derive a class from\012BaseRequestHandler and redefine its handle() method. You can then run\012various versions of the service by combining one of the server classes\012with your request handler class.\012\012The request handler class must be different for datagram or stream\012services. This can be hidden by using the mix-in request handler\012classes StreamRequestHandler or DatagramRequestHandler.\012\012Of course, you still have to use your head!\012\012For instance, it makes no sense to use a forking server if the service\012contains state in memory that can be modified by requests (since the\012modifications in the child process would never reach the initial state\012kept in the parent process and passed to each child). In this case,\012you can use a threading server, but you will probably have to use\012locks to avoid two requests that come in nearly simultaneous to apply\012conflicting changes to the server state.\012\012On the other hand, if you are building e.g. an HTTP server, where all\012data is stored externally (e.g. in the file system), a synchronous\012class will essentially render the service \"deaf\" while one request is\012being handled -- which may be for a very long time if a client is slow\012to reqd all the data it has requested. Here a threading or forking\012server is appropriate.\012\012In some cases, it may be appropriate to process part of a request\012synchronously, but to finish processing in a forked child depending on\012the request data. This can be implemented by using a synchronous\012server and doing an explicit fork in the request handler class\012handle() method.\012\012Another approach to handling multiple simultaneous requests in an\012environment that supports neither threads nor fork (or where these are\012too expensive or inappropriate for the service) is to maintain an\012explicit table of partially finished requests and to use select() to\012decide which request to work on next (or whether to handle a new\012incoming request). This is particularly important for stream services\012where each client can potentially be connected for a long time (if\012threads or subprocesses cannot be used).\012\012Future work:\012- Standard classes for Sun RPC (which uses either UDP or TCP)\012- Standard mix-in classes to implement various authentication\012 and encryption schemes\012- Standard framework for select-based multiplexing\012\012XXX Open problems:\012- What to do with out-of-band data?\012\012BaseServer:\012- split generic \"request\" functionality out into BaseServer class.\012 Copyright (C) 2000 Luke Kenneth Casson Leighton <lkcl@samba.org>\012\012 example: read entries from a SQL database (requires overriding\012 get_request() to return a table entry from the database).\012 entry is processed by a RequestHandlerClass.\012\012");
113 s$1 = Py.newString("0.4");
114 s$2 = Py.newString("TCPServer");
115 s$3 = Py.newString("UDPServer");
116 s$4 = Py.newString("ForkingUDPServer");
117 s$5 = Py.newString("ForkingTCPServer");
118 s$6 = Py.newString("ThreadingUDPServer");
119 s$7 = Py.newString("ThreadingTCPServer");
120 s$8 = Py.newString("BaseRequestHandler");
121 s$9 = Py.newString("StreamRequestHandler");
122 s$10 = Py.newString("DatagramRequestHandler");
123 s$11 = Py.newString("ThreadingMixIn");
124 s$12 = Py.newString("ForkingMixIn");
125 s$13 = Py.newString("AF_UNIX");
126 s$14 = Py.newString("UnixStreamServer");
127 s$15 = Py.newString("UnixDatagramServer");
128 s$16 = Py.newString("ThreadingUnixStreamServer");
129 s$17 = Py.newString("ThreadingUnixDatagramServer");
130 s$18 = Py.newString("Base class for server classes.\012\012 Methods for the caller:\012\012 - __init__(server_address, RequestHandlerClass)\012 - serve_forever()\012 - handle_request() # if you do not use serve_forever()\012 - fileno() -> int # for select()\012\012 Methods that may be overridden:\012\012 - server_bind()\012 - server_activate()\012 - get_request() -> request, client_address\012 - verify_request(request, client_address)\012 - server_close()\012 - process_request(request, client_address)\012 - close_request(request)\012 - handle_error()\012\012 Methods for derived classes:\012\012 - finish_request(request, client_address)\012\012 Class variables that may be overridden by derived classes or\012 instances:\012\012 - address_family\012 - socket_type\012 - reuse_address\012\012 Instance variables:\012\012 - RequestHandlerClass\012 - socket\012\012 ");
131 s$19 = Py.newString("Constructor. May be extended, do not override.");
132 s$20 = Py.newString("Called by constructor to activate the server.\012\012 May be overridden.\012\012 ");
133 s$21 = Py.newString("Handle one request at a time until doomsday.");
134 i$22 = Py.newInteger(1);
135 s$23 = Py.newString("Handle one request, possibly blocking.");
136 s$24 = Py.newString("Verify the request. May be overridden.\012\012 Return true if we should proceed with this request.\012\012 ");
137 s$25 = Py.newString("Call finish_request.\012\012 Overridden by ForkingMixIn and ThreadingMixIn.\012\012 ");
138 s$26 = Py.newString("Called to clean-up the server.\012\012 May be overridden.\012\012 ");
139 s$27 = Py.newString("Finish one request by instantiating RequestHandlerClass.");
140 s$28 = Py.newString("Called to clean up an individual request.");
141 s$29 = Py.newString("Handle an error gracefully. May be overridden.\012\012 The default is to print a traceback and continue.\012\012 ");
142 s$30 = Py.newString("-");
143 i$31 = Py.newInteger(40);
144 s$32 = Py.newString("Exception happened during processing of request from");
145 s$33 = Py.newString("Base class for various socket-based server classes.\012\012 Defaults to synchronous IP stream (i.e., TCP).\012\012 Methods for the caller:\012\012 - __init__(server_address, RequestHandlerClass)\012 - serve_forever()\012 - handle_request() # if you don't use serve_forever()\012 - fileno() -> int # for select()\012\012 Methods that may be overridden:\012\012 - server_bind()\012 - server_activate()\012 - get_request() -> request, client_address\012 - verify_request(request, client_address)\012 - process_request(request, client_address)\012 - close_request(request)\012 - handle_error()\012\012 Methods for derived classes:\012\012 - finish_request(request, client_address)\012\012 Class variables that may be overridden by derived classes or\012 instances:\012\012 - address_family\012 - socket_type\012 - request_queue_size (only for stream sockets)\012 - reuse_address\012\012 Instance variables:\012\012 - server_address\012 - RequestHandlerClass\012 - socket\012\012 ");
146 i$34 = Py.newInteger(5);
147 i$35 = Py.newInteger(0);
148 s$36 = Py.newString("Called by constructor to bind the socket.\012\012 May be overridden.\012\012 ");
149 s$37 = Py.newString("Return socket file number.\012\012 Interface required by select().\012\012 ");
150 s$38 = Py.newString("Get the request and client address from the socket.\012\012 May be overridden.\012\012 ");
151 s$39 = Py.newString("UDP server class.");
152 i$40 = Py.newInteger(8192);
153 s$41 = Py.newString("Mix-in class to handle each request in a new process.");
154 s$42 = Py.newString("Internal routine to wait for died children.");
155 s$43 = Py.newString("Fork a new subprocess to process the request.");
156 s$44 = Py.newString("Mix-in class to handle each request in a new thread.");
157 s$45 = Py.newString("Start a new thread to process the request.");
158 s$46 = Py.newString("Base class for request handler classes.\012\012 This class is instantiated for each request to be handled. The\012 constructor sets the instance variables request, client_address\012 and server, and then calls the handle() method. To implement a\012 specific service, all you need to do is to derive a class which\012 defines a handle() method.\012\012 The handle() method can find the request as self.request, the\012 client address as self.client_address, and the server (in case it\012 needs access to per-server information) as self.server. Since a\012 separate instance is created for each request, the handle() method\012 can define arbitrary other instance variariables.\012\012 ");
159 s$47 = Py.newString("Define self.rfile and self.wfile for stream sockets.");
160 s$48 = Py.newString("rb");
161 s$49 = Py.newString("wb");
162 s$50 = Py.newString("Define self.rfile and self.wfile for datagram sockets.");
163 s$51 = Py.newString("/usr/share/jython/Lib-cpython/SocketServer.py");
164 funcTable = new _PyInner();
165 c$0___init__ = Py.newCode(3, new String[] {"self", "server_address", "RequestHandlerClass"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "__init__", false, false, funcTable, 0, null, null, 0, 1);
166 c$1_server_activate = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "server_activate", false, false, funcTable, 1, null, null, 0, 1);
167 c$2_serve_forever = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "serve_forever", false, false, funcTable, 2, null, null, 0, 1);
168 c$3_handle_request = Py.newCode(1, new String[] {"self", "client_address", "request"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "handle_request", false, false, funcTable, 3, null, null, 0, 1);
169 c$4_verify_request = Py.newCode(3, new String[] {"self", "request", "client_address"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "verify_request", false, false, funcTable, 4, null, null, 0, 1);
170 c$5_process_request = Py.newCode(3, new String[] {"self", "request", "client_address"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "process_request", false, false, funcTable, 5, null, null, 0, 1);
171 c$6_server_close = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "server_close", false, false, funcTable, 6, null, null, 0, 1);
172 c$7_finish_request = Py.newCode(3, new String[] {"self", "request", "client_address"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "finish_request", false, false, funcTable, 7, null, null, 0, 1);
173 c$8_close_request = Py.newCode(2, new String[] {"self", "request"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "close_request", false, false, funcTable, 8, null, null, 0, 1);
174 c$9_handle_error = Py.newCode(3, new String[] {"self", "request", "client_address", "traceback"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "handle_error", false, false, funcTable, 9, null, null, 0, 1);
175 c$10_BaseServer = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "BaseServer", false, false, funcTable, 10, null, null, 0, 0);
176 c$11___init__ = Py.newCode(3, new String[] {"self", "server_address", "RequestHandlerClass"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "__init__", false, false, funcTable, 11, null, null, 0, 1);
177 c$12_server_bind = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "server_bind", false, false, funcTable, 12, null, null, 0, 1);
178 c$13_server_activate = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "server_activate", false, false, funcTable, 13, null, null, 0, 1);
179 c$14_server_close = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "server_close", false, false, funcTable, 14, null, null, 0, 1);
180 c$15_fileno = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "fileno", false, false, funcTable, 15, null, null, 0, 1);
181 c$16_get_request = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "get_request", false, false, funcTable, 16, null, null, 0, 1);
182 c$17_close_request = Py.newCode(2, new String[] {"self", "request"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "close_request", false, false, funcTable, 17, null, null, 0, 1);
183 c$18_TCPServer = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "TCPServer", false, false, funcTable, 18, null, null, 0, 0);
184 c$19_get_request = Py.newCode(1, new String[] {"self", "client_addr", "data"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "get_request", false, false, funcTable, 19, null, null, 0, 1);
185 c$20_server_activate = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "server_activate", false, false, funcTable, 20, null, null, 0, 1);
186 c$21_close_request = Py.newCode(2, new String[] {"self", "request"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "close_request", false, false, funcTable, 21, null, null, 0, 1);
187 c$22_UDPServer = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "UDPServer", false, false, funcTable, 22, null, null, 0, 0);
188 c$23_collect_children = Py.newCode(1, new String[] {"self", "status", "pid", "options"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "collect_children", false, false, funcTable, 23, null, null, 0, 1);
189 c$24_process_request = Py.newCode(3, new String[] {"self", "request", "client_address", "pid"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "process_request", false, false, funcTable, 24, null, null, 0, 1);
190 c$25_ForkingMixIn = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "ForkingMixIn", false, false, funcTable, 25, null, null, 0, 0);
191 c$26_process_request = Py.newCode(3, new String[] {"self", "request", "client_address", "t", "threading"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "process_request", false, false, funcTable, 26, null, null, 0, 1);
192 c$27_ThreadingMixIn = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "ThreadingMixIn", false, false, funcTable, 27, null, null, 0, 0);
193 c$28_ForkingUDPServer = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "ForkingUDPServer", false, false, funcTable, 28, null, null, 0, 0);
194 c$29_ForkingTCPServer = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "ForkingTCPServer", false, false, funcTable, 29, null, null, 0, 0);
195 c$30_ThreadingUDPServer = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "ThreadingUDPServer", false, false, funcTable, 30, null, null, 0, 0);
196 c$31_ThreadingTCPServer = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "ThreadingTCPServer", false, false, funcTable, 31, null, null, 0, 0);
197 c$32_UnixStreamServer = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "UnixStreamServer", false, false, funcTable, 32, null, null, 0, 0);
198 c$33_UnixDatagramServer = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "UnixDatagramServer", false, false, funcTable, 33, null, null, 0, 0);
199 c$34_ThreadingUnixStreamServer = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "ThreadingUnixStreamServer", false, false, funcTable, 34, null, null, 0, 0);
200 c$35_ThreadingUnixDatagramServer = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "ThreadingUnixDatagramServer", false, false, funcTable, 35, null, null, 0, 0);
201 c$36___init__ = Py.newCode(4, new String[] {"self", "request", "client_address", "server"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "__init__", false, false, funcTable, 36, null, null, 0, 1);
202 c$37_setup = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "setup", false, false, funcTable, 37, null, null, 0, 1);
203 c$38___del__ = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "__del__", false, false, funcTable, 38, null, null, 0, 1);
204 c$39_handle = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "handle", false, false, funcTable, 39, null, null, 0, 1);
205 c$40_finish = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "finish", false, false, funcTable, 40, null, null, 0, 1);
206 c$41_BaseRequestHandler = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "BaseRequestHandler", false, false, funcTable, 41, null, null, 0, 0);
207 c$42_setup = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "setup", false, false, funcTable, 42, null, null, 0, 1);
208 c$43_finish = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "finish", false, false, funcTable, 43, null, null, 0, 1);
209 c$44_StreamRequestHandler = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "StreamRequestHandler", false, false, funcTable, 44, null, null, 0, 0);
210 c$45_setup = Py.newCode(1, new String[] {"self", "StringIO"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "setup", false, false, funcTable, 45, null, null, 0, 1);
211 c$46_finish = Py.newCode(1, new String[] {"self"}, "/usr/share/jython/Lib-cpython/SocketServer.py", "finish", false, false, funcTable, 46, null, null, 0, 1);
212 c$47_DatagramRequestHandler = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "DatagramRequestHandler", false, false, funcTable, 47, null, null, 0, 0);
213 c$48_main = Py.newCode(0, new String[] {}, "/usr/share/jython/Lib-cpython/SocketServer.py", "main", false, false, funcTable, 48, null, null, 0, 0);
217 public PyCode getMain() {
218 if (c$48_main == null) _PyInner.initConstants();
222 public PyObject call_function(int index, PyFrame frame) {
225 return _PyInner.__init__$1(frame);
227 return _PyInner.server_activate$2(frame);
229 return _PyInner.serve_forever$3(frame);
231 return _PyInner.handle_request$4(frame);
233 return _PyInner.verify_request$5(frame);
235 return _PyInner.process_request$6(frame);
237 return _PyInner.server_close$7(frame);
239 return _PyInner.finish_request$8(frame);
241 return _PyInner.close_request$9(frame);
243 return _PyInner.handle_error$10(frame);
245 return _PyInner.BaseServer$11(frame);
247 return _PyInner.__init__$12(frame);
249 return _PyInner.server_bind$13(frame);
251 return _PyInner.server_activate$14(frame);
253 return _PyInner.server_close$15(frame);
255 return _PyInner.fileno$16(frame);
257 return _PyInner.get_request$17(frame);
259 return _PyInner.close_request$18(frame);
261 return _PyInner.TCPServer$19(frame);
263 return _PyInner.get_request$20(frame);
265 return _PyInner.server_activate$21(frame);
267 return _PyInner.close_request$22(frame);
269 return _PyInner.UDPServer$23(frame);
271 return _PyInner.collect_children$24(frame);
273 return _PyInner.process_request$25(frame);
275 return _PyInner.ForkingMixIn$26(frame);
277 return _PyInner.process_request$27(frame);
279 return _PyInner.ThreadingMixIn$28(frame);
281 return _PyInner.ForkingUDPServer$29(frame);
283 return _PyInner.ForkingTCPServer$30(frame);
285 return _PyInner.ThreadingUDPServer$31(frame);
287 return _PyInner.ThreadingTCPServer$32(frame);
289 return _PyInner.UnixStreamServer$33(frame);
291 return _PyInner.UnixDatagramServer$34(frame);
293 return _PyInner.ThreadingUnixStreamServer$35(frame);
295 return _PyInner.ThreadingUnixDatagramServer$36(frame);
297 return _PyInner.__init__$37(frame);
299 return _PyInner.setup$38(frame);
301 return _PyInner.__del__$39(frame);
303 return _PyInner.handle$40(frame);
305 return _PyInner.finish$41(frame);
307 return _PyInner.BaseRequestHandler$42(frame);
309 return _PyInner.setup$43(frame);
311 return _PyInner.finish$44(frame);
313 return _PyInner.StreamRequestHandler$45(frame);
315 return _PyInner.setup$46(frame);
317 return _PyInner.finish$47(frame);
319 return _PyInner.DatagramRequestHandler$48(frame);
321 return _PyInner.main$49(frame);
327 private static PyObject __init__$1(PyFrame frame) {
328 /* Constructor. May be extended, do not override. */
329 frame.getlocal(0).__setattr__("server_address", frame.getlocal(1));
330 frame.getlocal(0).__setattr__("RequestHandlerClass", frame.getlocal(2));
334 private static PyObject server_activate$2(PyFrame frame) {
335 /* Called by constructor to activate the server.
344 private static PyObject serve_forever$3(PyFrame frame) {
345 /* Handle one request at a time until doomsday. */
346 while (i$22.__nonzero__()) {
347 frame.getlocal(0).invoke("handle_request");
352 private static PyObject handle_request$4(PyFrame frame) {
353 // Temporary Variables
354 PyObject[] t$0$PyObject__;
355 PyException t$0$PyException;
358 /* Handle one request, possibly blocking. */
360 t$0$PyObject__ = org.python.core.Py.unpackSequence(frame.getlocal(0).invoke("get_request"), 2);
361 frame.setlocal(2, t$0$PyObject__[0]);
362 frame.setlocal(1, t$0$PyObject__[1]);
364 catch (Throwable x$0) {
365 t$0$PyException = Py.setException(x$0, frame);
366 if (Py.matchException(t$0$PyException, frame.getglobal("socket").__getattr__("error"))) {
369 else throw t$0$PyException;
371 if (frame.getlocal(0).invoke("verify_request", frame.getlocal(2), frame.getlocal(1)).__nonzero__()) {
373 frame.getlocal(0).invoke("process_request", frame.getlocal(2), frame.getlocal(1));
375 catch (Throwable x$1) {
376 t$0$PyException = Py.setException(x$1, frame);
377 frame.getlocal(0).invoke("handle_error", frame.getlocal(2), frame.getlocal(1));
378 frame.getlocal(0).invoke("close_request", frame.getlocal(2));
384 private static PyObject verify_request$5(PyFrame frame) {
385 /* Verify the request. May be overridden.
387 Return true if we should proceed with this request.
393 private static PyObject process_request$6(PyFrame frame) {
394 /* Call finish_request.
396 Overridden by ForkingMixIn and ThreadingMixIn.
399 frame.getlocal(0).invoke("finish_request", frame.getlocal(1), frame.getlocal(2));
400 frame.getlocal(0).invoke("close_request", frame.getlocal(1));
404 private static PyObject server_close$7(PyFrame frame) {
405 /* Called to clean-up the server.
414 private static PyObject finish_request$8(PyFrame frame) {
415 /* Finish one request by instantiating RequestHandlerClass. */
416 frame.getlocal(0).invoke("RequestHandlerClass", new PyObject[] {frame.getlocal(1), frame.getlocal(2), frame.getlocal(0)});
420 private static PyObject close_request$9(PyFrame frame) {
421 /* Called to clean up an individual request. */
426 private static PyObject handle_error$10(PyFrame frame) {
427 /* Handle an error gracefully. May be overridden.
429 The default is to print a traceback and continue.
432 Py.println(s$30._mul(i$31));
434 Py.println(frame.getlocal(2));
435 frame.setlocal(3, org.python.core.imp.importOne("traceback", frame));
436 frame.getlocal(3).__getattr__("print_exc").__call__();
437 Py.println(s$30._mul(i$31));
441 private static PyObject BaseServer$11(PyFrame frame) {
442 /* Base class for server classes.
444 Methods for the caller:
446 - __init__(server_address, RequestHandlerClass)
448 - handle_request() # if you do not use serve_forever()
449 - fileno() -> int # for select()
451 Methods that may be overridden:
455 - get_request() -> request, client_address
456 - verify_request(request, client_address)
458 - process_request(request, client_address)
459 - close_request(request)
462 Methods for derived classes:
464 - finish_request(request, client_address)
466 Class variables that may be overridden by derived classes or
475 - RequestHandlerClass
479 frame.setlocal("__init__", new PyFunction(frame.f_globals, new PyObject[] {}, c$0___init__));
480 frame.setlocal("server_activate", new PyFunction(frame.f_globals, new PyObject[] {}, c$1_server_activate));
481 frame.setlocal("serve_forever", new PyFunction(frame.f_globals, new PyObject[] {}, c$2_serve_forever));
482 frame.setlocal("handle_request", new PyFunction(frame.f_globals, new PyObject[] {}, c$3_handle_request));
483 frame.setlocal("verify_request", new PyFunction(frame.f_globals, new PyObject[] {}, c$4_verify_request));
484 frame.setlocal("process_request", new PyFunction(frame.f_globals, new PyObject[] {}, c$5_process_request));
485 frame.setlocal("server_close", new PyFunction(frame.f_globals, new PyObject[] {}, c$6_server_close));
486 frame.setlocal("finish_request", new PyFunction(frame.f_globals, new PyObject[] {}, c$7_finish_request));
487 frame.setlocal("close_request", new PyFunction(frame.f_globals, new PyObject[] {}, c$8_close_request));
488 frame.setlocal("handle_error", new PyFunction(frame.f_globals, new PyObject[] {}, c$9_handle_error));
489 return frame.getf_locals();
492 private static PyObject __init__$12(PyFrame frame) {
493 /* Constructor. May be extended, do not override. */
494 frame.getglobal("BaseServer").invoke("__init__", new PyObject[] {frame.getlocal(0), frame.getlocal(1), frame.getlocal(2)});
495 frame.getlocal(0).__setattr__("socket", frame.getglobal("socket").__getattr__("socket").__call__(frame.getlocal(0).__getattr__("address_family"), frame.getlocal(0).__getattr__("socket_type")));
496 frame.getlocal(0).invoke("server_bind");
497 frame.getlocal(0).invoke("server_activate");
501 private static PyObject server_bind$13(PyFrame frame) {
502 /* Called by constructor to bind the socket.
507 if (frame.getlocal(0).__getattr__("allow_reuse_address").__nonzero__()) {
508 frame.getlocal(0).__getattr__("socket").invoke("setsockopt", new PyObject[] {frame.getglobal("socket").__getattr__("SOL_SOCKET"), frame.getglobal("socket").__getattr__("SO_REUSEADDR"), i$22});
510 frame.getlocal(0).__getattr__("socket").invoke("bind", frame.getlocal(0).__getattr__("server_address"));
514 private static PyObject server_activate$14(PyFrame frame) {
515 /* Called by constructor to activate the server.
520 frame.getlocal(0).__getattr__("socket").invoke("listen", frame.getlocal(0).__getattr__("request_queue_size"));
524 private static PyObject server_close$15(PyFrame frame) {
525 /* Called to clean-up the server.
530 frame.getlocal(0).__getattr__("socket").invoke("close");
534 private static PyObject fileno$16(PyFrame frame) {
535 /* Return socket file number.
537 Interface required by select().
540 return frame.getlocal(0).__getattr__("socket").invoke("fileno");
543 private static PyObject get_request$17(PyFrame frame) {
544 /* Get the request and client address from the socket.
549 return frame.getlocal(0).__getattr__("socket").invoke("accept");
552 private static PyObject close_request$18(PyFrame frame) {
553 /* Called to clean up an individual request. */
554 frame.getlocal(1).invoke("close");
558 private static PyObject TCPServer$19(PyFrame frame) {
559 /* Base class for various socket-based server classes.
561 Defaults to synchronous IP stream (i.e., TCP).
563 Methods for the caller:
565 - __init__(server_address, RequestHandlerClass)
567 - handle_request() # if you don't use serve_forever()
568 - fileno() -> int # for select()
570 Methods that may be overridden:
574 - get_request() -> request, client_address
575 - verify_request(request, client_address)
576 - process_request(request, client_address)
577 - close_request(request)
580 Methods for derived classes:
582 - finish_request(request, client_address)
584 Class variables that may be overridden by derived classes or
589 - request_queue_size (only for stream sockets)
595 - RequestHandlerClass
599 frame.setlocal("address_family", frame.getname("socket").__getattr__("AF_INET"));
600 frame.setlocal("socket_type", frame.getname("socket").__getattr__("SOCK_STREAM"));
601 frame.setlocal("request_queue_size", i$34);
602 frame.setlocal("allow_reuse_address", i$35);
603 frame.setlocal("__init__", new PyFunction(frame.f_globals, new PyObject[] {}, c$11___init__));
604 frame.setlocal("server_bind", new PyFunction(frame.f_globals, new PyObject[] {}, c$12_server_bind));
605 frame.setlocal("server_activate", new PyFunction(frame.f_globals, new PyObject[] {}, c$13_server_activate));
606 frame.setlocal("server_close", new PyFunction(frame.f_globals, new PyObject[] {}, c$14_server_close));
607 frame.setlocal("fileno", new PyFunction(frame.f_globals, new PyObject[] {}, c$15_fileno));
608 frame.setlocal("get_request", new PyFunction(frame.f_globals, new PyObject[] {}, c$16_get_request));
609 frame.setlocal("close_request", new PyFunction(frame.f_globals, new PyObject[] {}, c$17_close_request));
610 return frame.getf_locals();
613 private static PyObject get_request$20(PyFrame frame) {
614 // Temporary Variables
615 PyObject[] t$0$PyObject__;
618 t$0$PyObject__ = org.python.core.Py.unpackSequence(frame.getlocal(0).__getattr__("socket").invoke("recvfrom", frame.getlocal(0).__getattr__("max_packet_size")), 2);
619 frame.setlocal(2, t$0$PyObject__[0]);
620 frame.setlocal(1, t$0$PyObject__[1]);
621 return new PyTuple(new PyObject[] {new PyTuple(new PyObject[] {frame.getlocal(2), frame.getlocal(0).__getattr__("socket")}), frame.getlocal(1)});
624 private static PyObject server_activate$21(PyFrame frame) {
629 private static PyObject close_request$22(PyFrame frame) {
634 private static PyObject UDPServer$23(PyFrame frame) {
635 /* UDP server class. */
636 frame.setlocal("allow_reuse_address", i$35);
637 frame.setlocal("socket_type", frame.getname("socket").__getattr__("SOCK_DGRAM"));
638 frame.setlocal("max_packet_size", i$40);
639 frame.setlocal("get_request", new PyFunction(frame.f_globals, new PyObject[] {}, c$19_get_request));
640 frame.setlocal("server_activate", new PyFunction(frame.f_globals, new PyObject[] {}, c$20_server_activate));
641 frame.setlocal("close_request", new PyFunction(frame.f_globals, new PyObject[] {}, c$21_close_request));
642 return frame.getf_locals();
645 private static PyObject collect_children$24(PyFrame frame) {
646 // Temporary Variables
647 PyObject[] t$0$PyObject__;
648 PyException t$0$PyException;
651 /* Internal routine to wait for died children. */
652 while (frame.getlocal(0).__getattr__("active_children").__nonzero__()) {
653 if (frame.getglobal("len").__call__(frame.getlocal(0).__getattr__("active_children"))._lt(frame.getlocal(0).__getattr__("max_children")).__nonzero__()) {
654 frame.setlocal(3, frame.getglobal("os").__getattr__("WNOHANG"));
657 frame.setlocal(3, i$35);
660 t$0$PyObject__ = org.python.core.Py.unpackSequence(frame.getglobal("os").__getattr__("waitpid").__call__(i$35, frame.getlocal(3)), 2);
661 frame.setlocal(2, t$0$PyObject__[0]);
662 frame.setlocal(1, t$0$PyObject__[1]);
664 catch (Throwable x$0) {
665 t$0$PyException = Py.setException(x$0, frame);
666 if (Py.matchException(t$0$PyException, frame.getglobal("os").__getattr__("error"))) {
667 frame.setlocal(2, frame.getglobal("None"));
669 else throw t$0$PyException;
671 if (frame.getlocal(2).__not__().__nonzero__()) {
674 frame.getlocal(0).__getattr__("active_children").invoke("remove", frame.getlocal(2));
679 private static PyObject process_request$25(PyFrame frame) {
680 // Temporary Variables
681 PyException t$0$PyException;
684 /* Fork a new subprocess to process the request. */
685 frame.getlocal(0).invoke("collect_children");
686 frame.setlocal(3, frame.getglobal("os").__getattr__("fork").__call__());
687 if (frame.getlocal(3).__nonzero__()) {
688 if (frame.getlocal(0).__getattr__("active_children")._is(frame.getglobal("None")).__nonzero__()) {
689 frame.getlocal(0).__setattr__("active_children", new PyList(new PyObject[] {}));
691 frame.getlocal(0).__getattr__("active_children").invoke("append", frame.getlocal(3));
692 frame.getlocal(0).invoke("close_request", frame.getlocal(1));
697 frame.getlocal(0).invoke("finish_request", frame.getlocal(1), frame.getlocal(2));
698 frame.getglobal("os").__getattr__("_exit").__call__(i$35);
700 catch (Throwable x$0) {
701 t$0$PyException = Py.setException(x$0, frame);
703 frame.getlocal(0).invoke("handle_error", frame.getlocal(1), frame.getlocal(2));
706 frame.getglobal("os").__getattr__("_exit").__call__(i$22);
713 private static PyObject ForkingMixIn$26(PyFrame frame) {
714 /* Mix-in class to handle each request in a new process. */
715 frame.setlocal("active_children", frame.getname("None"));
716 frame.setlocal("max_children", i$31);
717 frame.setlocal("collect_children", new PyFunction(frame.f_globals, new PyObject[] {}, c$23_collect_children));
718 frame.setlocal("process_request", new PyFunction(frame.f_globals, new PyObject[] {}, c$24_process_request));
719 return frame.getf_locals();
722 private static PyObject process_request$27(PyFrame frame) {
723 /* Start a new thread to process the request. */
724 frame.setlocal(4, org.python.core.imp.importOne("threading", frame));
725 frame.setlocal(3, frame.getlocal(4).__getattr__("Thread").__call__(new PyObject[] {frame.getlocal(0).__getattr__("finish_request"), new PyTuple(new PyObject[] {frame.getlocal(1), frame.getlocal(2)})}, new String[] {"target", "args"}));
726 frame.getlocal(3).invoke("start");
730 private static PyObject ThreadingMixIn$28(PyFrame frame) {
731 /* Mix-in class to handle each request in a new thread. */
732 frame.setlocal("process_request", new PyFunction(frame.f_globals, new PyObject[] {}, c$26_process_request));
733 return frame.getf_locals();
736 private static PyObject ForkingUDPServer$29(PyFrame frame) {
738 return frame.getf_locals();
741 private static PyObject ForkingTCPServer$30(PyFrame frame) {
743 return frame.getf_locals();
746 private static PyObject ThreadingUDPServer$31(PyFrame frame) {
748 return frame.getf_locals();
751 private static PyObject ThreadingTCPServer$32(PyFrame frame) {
753 return frame.getf_locals();
756 private static PyObject UnixStreamServer$33(PyFrame frame) {
757 frame.setlocal("address_family", frame.getname("socket").__getattr__("AF_UNIX"));
758 return frame.getf_locals();
761 private static PyObject UnixDatagramServer$34(PyFrame frame) {
762 frame.setlocal("address_family", frame.getname("socket").__getattr__("AF_UNIX"));
763 return frame.getf_locals();
766 private static PyObject ThreadingUnixStreamServer$35(PyFrame frame) {
768 return frame.getf_locals();
771 private static PyObject ThreadingUnixDatagramServer$36(PyFrame frame) {
773 return frame.getf_locals();
776 private static PyObject __init__$37(PyFrame frame) {
777 frame.getlocal(0).__setattr__("request", frame.getlocal(1));
778 frame.getlocal(0).__setattr__("client_address", frame.getlocal(2));
779 frame.getlocal(0).__setattr__("server", frame.getlocal(3));
781 frame.getlocal(0).invoke("setup");
782 frame.getlocal(0).invoke("handle");
783 frame.getlocal(0).invoke("finish");
786 frame.getglobal("sys").__setattr__("exc_traceback", frame.getglobal("None"));
791 private static PyObject setup$38(PyFrame frame) {
796 private static PyObject __del__$39(PyFrame frame) {
801 private static PyObject handle$40(PyFrame frame) {
806 private static PyObject finish$41(PyFrame frame) {
811 private static PyObject BaseRequestHandler$42(PyFrame frame) {
812 /* Base class for request handler classes.
814 This class is instantiated for each request to be handled. The
815 constructor sets the instance variables request, client_address
816 and server, and then calls the handle() method. To implement a
817 specific service, all you need to do is to derive a class which
818 defines a handle() method.
820 The handle() method can find the request as self.request, the
821 client address as self.client_address, and the server (in case it
822 needs access to per-server information) as self.server. Since a
823 separate instance is created for each request, the handle() method
824 can define arbitrary other instance variariables.
827 frame.setlocal("__init__", new PyFunction(frame.f_globals, new PyObject[] {}, c$36___init__));
828 frame.setlocal("setup", new PyFunction(frame.f_globals, new PyObject[] {}, c$37_setup));
829 frame.setlocal("__del__", new PyFunction(frame.f_globals, new PyObject[] {}, c$38___del__));
830 frame.setlocal("handle", new PyFunction(frame.f_globals, new PyObject[] {}, c$39_handle));
831 frame.setlocal("finish", new PyFunction(frame.f_globals, new PyObject[] {}, c$40_finish));
832 return frame.getf_locals();
835 private static PyObject setup$43(PyFrame frame) {
836 frame.getlocal(0).__setattr__("connection", frame.getlocal(0).__getattr__("request"));
837 frame.getlocal(0).__setattr__("rfile", frame.getlocal(0).__getattr__("connection").invoke("makefile", s$48, frame.getlocal(0).__getattr__("rbufsize")));
838 frame.getlocal(0).__setattr__("wfile", frame.getlocal(0).__getattr__("connection").invoke("makefile", s$49, frame.getlocal(0).__getattr__("wbufsize")));
842 private static PyObject finish$44(PyFrame frame) {
843 frame.getlocal(0).__getattr__("wfile").invoke("flush");
844 frame.getlocal(0).__getattr__("wfile").invoke("close");
845 frame.getlocal(0).__getattr__("rfile").invoke("close");
849 private static PyObject StreamRequestHandler$45(PyFrame frame) {
850 /* Define self.rfile and self.wfile for stream sockets. */
851 frame.setlocal("rbufsize", i$22.__neg__());
852 frame.setlocal("wbufsize", i$35);
853 frame.setlocal("setup", new PyFunction(frame.f_globals, new PyObject[] {}, c$42_setup));
854 frame.setlocal("finish", new PyFunction(frame.f_globals, new PyObject[] {}, c$43_finish));
855 return frame.getf_locals();
858 private static PyObject setup$46(PyFrame frame) {
859 // Temporary Variables
860 PyObject[] t$0$PyObject__;
863 frame.setlocal(1, org.python.core.imp.importOne("StringIO", frame));
864 t$0$PyObject__ = org.python.core.Py.unpackSequence(frame.getlocal(0).__getattr__("request"), 2);
865 frame.getlocal(0).__setattr__("packet", t$0$PyObject__[0]);
866 frame.getlocal(0).__setattr__("socket", t$0$PyObject__[1]);
867 frame.getlocal(0).__setattr__("rfile", frame.getlocal(1).__getattr__("StringIO").__call__(frame.getlocal(0).__getattr__("packet")));
868 frame.getlocal(0).__setattr__("wfile", frame.getlocal(1).__getattr__("StringIO").__call__());
872 private static PyObject finish$47(PyFrame frame) {
873 frame.getlocal(0).__getattr__("socket").invoke("sendto", frame.getlocal(0).__getattr__("wfile").invoke("getvalue"), frame.getlocal(0).__getattr__("client_address"));
877 private static PyObject DatagramRequestHandler$48(PyFrame frame) {
878 /* Define self.rfile and self.wfile for datagram sockets. */
879 frame.setlocal("setup", new PyFunction(frame.f_globals, new PyObject[] {}, c$45_setup));
880 frame.setlocal("finish", new PyFunction(frame.f_globals, new PyObject[] {}, c$46_finish));
881 return frame.getf_locals();
884 private static PyObject main$49(PyFrame frame) {
885 frame.setglobal("__file__", s$51);
887 /* Generic socket server classes.
889 This module tries to capture the various aspects of defining a server:
891 For socket-based servers:
894 - AF_INET: IP (Internet Protocol) sockets (default)
895 - AF_UNIX: Unix domain sockets
896 - others, e.g. AF_DECNET are conceivable (see <socket.h>
898 - SOCK_STREAM (reliable stream, e.g. TCP)
899 - SOCK_DGRAM (datagrams, e.g. UDP)
901 For request-based servers (including socket-based):
903 - client address verification before further looking at the request
904 (This is actually a hook for any processing that needs to look
905 at the request before anything else, e.g. logging)
906 - how to handle multiple requests:
907 - synchronous (one request is handled at a time)
908 - forking (each request is handled by a new process)
909 - threading (each request is handled by a new thread)
911 The classes in this module favor the server type that is simplest to
912 write: a synchronous TCP/IP server. This is bad class design, but
913 save some typing. (There's also the issue that a deep class hierarchy
914 slows down method lookups.)
916 There are five classes in an inheritance diagram, four of which represent
917 synchronous servers of four types:
924 +-----------+ +------------------+
925 | TCPServer |------->| UnixStreamServer |
926 +-----------+ +------------------+
929 +-----------+ +--------------------+
930 | UDPServer |------->| UnixDatagramServer |
931 +-----------+ +--------------------+
933 Note that UnixDatagramServer derives from UDPServer, not from
934 UnixStreamServer -- the only difference between an IP and a Unix
935 stream server is the address family, which is simply repeated in both
938 Forking and threading versions of each type of server can be created
939 using the ForkingServer and ThreadingServer mix-in classes. For
940 instance, a threading UDP server class is created as follows:
942 class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
944 The Mix-in class must come first, since it overrides a method defined
947 To implement a service, you must derive a class from
948 BaseRequestHandler and redefine its handle() method. You can then run
949 various versions of the service by combining one of the server classes
950 with your request handler class.
952 The request handler class must be different for datagram or stream
953 services. This can be hidden by using the mix-in request handler
954 classes StreamRequestHandler or DatagramRequestHandler.
956 Of course, you still have to use your head!
958 For instance, it makes no sense to use a forking server if the service
959 contains state in memory that can be modified by requests (since the
960 modifications in the child process would never reach the initial state
961 kept in the parent process and passed to each child). In this case,
962 you can use a threading server, but you will probably have to use
963 locks to avoid two requests that come in nearly simultaneous to apply
964 conflicting changes to the server state.
966 On the other hand, if you are building e.g. an HTTP server, where all
967 data is stored externally (e.g. in the file system), a synchronous
968 class will essentially render the service "deaf" while one request is
969 being handled -- which may be for a very long time if a client is slow
970 to reqd all the data it has requested. Here a threading or forking
971 server is appropriate.
973 In some cases, it may be appropriate to process part of a request
974 synchronously, but to finish processing in a forked child depending on
975 the request data. This can be implemented by using a synchronous
976 server and doing an explicit fork in the request handler class
979 Another approach to handling multiple simultaneous requests in an
980 environment that supports neither threads nor fork (or where these are
981 too expensive or inappropriate for the service) is to maintain an
982 explicit table of partially finished requests and to use select() to
983 decide which request to work on next (or whether to handle a new
984 incoming request). This is particularly important for stream services
985 where each client can potentially be connected for a long time (if
986 threads or subprocesses cannot be used).
989 - Standard classes for Sun RPC (which uses either UDP or TCP)
990 - Standard mix-in classes to implement various authentication
991 and encryption schemes
992 - Standard framework for select-based multiplexing
995 - What to do with out-of-band data?
998 - split generic "request" functionality out into BaseServer class.
999 Copyright (C) 2000 Luke Kenneth Casson Leighton <lkcl@samba.org>
1001 example: read entries from a SQL database (requires overriding
1002 get_request() to return a table entry from the database).
1003 entry is processed by a RequestHandlerClass.
1006 frame.setlocal("__version__", s$1);
1007 frame.setlocal("socket", org.python.core.imp.importOne("socket", frame));
1008 frame.setlocal("sys", org.python.core.imp.importOne("sys", frame));
1009 frame.setlocal("os", org.python.core.imp.importOne("os", frame));
1010 frame.setlocal("__all__", new PyList(new PyObject[] {s$2, s$3, s$4, s$5, s$6, s$7, s$8, s$9, s$10, s$11, s$12}));
1011 if (frame.getname("hasattr").__call__(frame.getname("socket"), s$13).__nonzero__()) {
1012 frame.getname("__all__").invoke("extend", new PyList(new PyObject[] {s$14, s$15, s$16, s$17}));
1014 frame.setlocal("BaseServer", Py.makeClass("BaseServer", new PyObject[] {}, c$10_BaseServer, null));
1015 frame.setlocal("TCPServer", Py.makeClass("TCPServer", new PyObject[] {frame.getname("BaseServer")}, c$18_TCPServer, null));
1016 frame.setlocal("UDPServer", Py.makeClass("UDPServer", new PyObject[] {frame.getname("TCPServer")}, c$22_UDPServer, null));
1017 frame.setlocal("ForkingMixIn", Py.makeClass("ForkingMixIn", new PyObject[] {}, c$25_ForkingMixIn, null));
1018 frame.setlocal("ThreadingMixIn", Py.makeClass("ThreadingMixIn", new PyObject[] {}, c$27_ThreadingMixIn, null));
1019 frame.setlocal("ForkingUDPServer", Py.makeClass("ForkingUDPServer", new PyObject[] {frame.getname("ForkingMixIn"), frame.getname("UDPServer")}, c$28_ForkingUDPServer, null));
1020 frame.setlocal("ForkingTCPServer", Py.makeClass("ForkingTCPServer", new PyObject[] {frame.getname("ForkingMixIn"), frame.getname("TCPServer")}, c$29_ForkingTCPServer, null));
1021 frame.setlocal("ThreadingUDPServer", Py.makeClass("ThreadingUDPServer", new PyObject[] {frame.getname("ThreadingMixIn"), frame.getname("UDPServer")}, c$30_ThreadingUDPServer, null));
1022 frame.setlocal("ThreadingTCPServer", Py.makeClass("ThreadingTCPServer", new PyObject[] {frame.getname("ThreadingMixIn"), frame.getname("TCPServer")}, c$31_ThreadingTCPServer, null));
1023 if (frame.getname("hasattr").__call__(frame.getname("socket"), s$13).__nonzero__()) {
1024 frame.setlocal("UnixStreamServer", Py.makeClass("UnixStreamServer", new PyObject[] {frame.getname("TCPServer")}, c$32_UnixStreamServer, null));
1025 frame.setlocal("UnixDatagramServer", Py.makeClass("UnixDatagramServer", new PyObject[] {frame.getname("UDPServer")}, c$33_UnixDatagramServer, null));
1026 frame.setlocal("ThreadingUnixStreamServer", Py.makeClass("ThreadingUnixStreamServer", new PyObject[] {frame.getname("ThreadingMixIn"), frame.getname("UnixStreamServer")}, c$34_ThreadingUnixStreamServer, null));
1027 frame.setlocal("ThreadingUnixDatagramServer", Py.makeClass("ThreadingUnixDatagramServer", new PyObject[] {frame.getname("ThreadingMixIn"), frame.getname("UnixDatagramServer")}, c$35_ThreadingUnixDatagramServer, null));
1029 frame.setlocal("BaseRequestHandler", Py.makeClass("BaseRequestHandler", new PyObject[] {}, c$41_BaseRequestHandler, null));
1030 frame.setlocal("StreamRequestHandler", Py.makeClass("StreamRequestHandler", new PyObject[] {frame.getname("BaseRequestHandler")}, c$44_StreamRequestHandler, null));
1031 frame.setlocal("DatagramRequestHandler", Py.makeClass("DatagramRequestHandler", new PyObject[] {frame.getname("BaseRequestHandler")}, c$47_DatagramRequestHandler, null));
1036 public static void moduleDictInit(PyObject dict) {
1037 dict.__setitem__("__name__", new PyString("SocketServer"));
1038 Py.runCode(new _PyInner().getMain(), dict, dict);
1041 public static void main(String[] args) throws java.lang.Exception {
1042 String[] newargs = new String[args.length+1];
1043 newargs[0] = "SocketServer";
1044 System.arraycopy(args, 0, newargs, 1, args.length);
1045 Py.runMain(SocketServer._PyInner.class, newargs, SocketServer.jpy$packages, SocketServer.jpy$mainProperties, "", new String[] {"string", "random", "util", "traceback", "sre_compile", "atexit", "sre", "sre_constants", "StringIO", "javaos", "socket", "yapm", "calendar", "repr", "copy_reg", "SocketServer", "server", "re", "linecache", "javapath", "UserDict", "copy", "threading", "stat", "PathVFS", "sre_parse"});