17
37
imaplib.Time2Internaldate(t)
42
class SecureTCPServer(SocketServer.TCPServer):
44
def get_request(self):
45
newsocket, fromaddr = self.socket.accept()
46
connstream = ssl.wrap_socket(newsocket,
49
return connstream, fromaddr
51
IMAP4_SSL = imaplib.IMAP4_SSL
55
class SecureTCPServer:
60
class TimeoutStreamRequestHandler(SocketServer.StreamRequestHandler):
65
self.connection = self.request
66
if self.timeout is not None:
67
self.connection.settimeout(self.timeout)
68
self.rfile = self.connection.makefile('rb', self.rbufsize)
69
self.wfile = self.connection.makefile('wb', self.wbufsize)
72
class SimpleIMAPHandler(TimeoutStreamRequestHandler):
74
def _send(self, message):
75
if verbose: print "SENT:", message.strip()
76
self.wfile.write(message)
79
# Send a welcome message.
80
self._send('* OK IMAP4rev1\r\n')
82
# Gather up input until we receive a line terminator or we timeout.
83
# Accumulate read(1) because it's simpler to handle the differences
84
# between naked sockets and SSL sockets.
88
part = self.rfile.read(1)
90
# Naked sockets return empty strings..
94
# ..but SSLSockets throw exceptions.
96
if line.endswith('\r\n'):
99
if verbose: print 'GOT:', line.strip()
100
splitline = line.split()
105
if hasattr(self, 'cmd_%s' % (cmd,)):
106
getattr(self, 'cmd_%s' % (cmd,))(tag, args)
108
self._send('%s BAD %s unknown\r\n' % (tag, cmd))
110
def cmd_CAPABILITY(self, tag, args):
111
self._send('* CAPABILITY IMAP4rev1\r\n')
112
self._send('%s OK CAPABILITY completed\r\n' % (tag,))
114
class BaseThreadedNetworkedTests(unittest.TestCase):
116
def make_server(self, addr, hdlr):
118
class MyServer(self.server_class):
119
def handle_error(self, request, client_address):
120
self.close_request(request)
124
if verbose: print "creating server"
125
server = MyServer(addr, hdlr)
126
self.assertEquals(server.server_address, server.socket.getsockname())
129
print "server created"
131
print "CLASS =", self.server_class
132
print "HDLR =", server.RequestHandlerClass
134
t = threading.Thread(
135
name='%s serving' % self.server_class,
136
target=server.serve_forever,
137
# Short poll interval to make the test finish quickly.
138
# Time between requests is short enough that we won't wake
139
# up spuriously too many times.
140
kwargs={'poll_interval':0.01})
141
t.daemon = True # In case this function raises.
143
if verbose: print "server running"
146
def reap_server(self, server, thread):
147
if verbose: print "waiting for server"
150
if verbose: print "done"
153
def reaped_server(self, hdlr):
154
server, thread = self.make_server((support.HOST, 0), hdlr)
158
self.reap_server(server, thread)
160
def test_connect(self):
161
with self.reaped_server(SimpleIMAPHandler) as server:
162
client = self.imap_class(*server.server_address)
165
def test_issue5949(self):
167
class EOFHandler(TimeoutStreamRequestHandler):
169
# EOF without sending a complete welcome message.
170
self.wfile.write('* OK')
171
# explicitly shutdown. socket.close() merely releases
172
# the socket and waits for GC to perform the actual close.
173
self.request.shutdown(socket.SHUT_WR)
175
with self.reaped_server(EOFHandler) as server:
176
self.assertRaises(imaplib.IMAP4.abort,
177
self.imap_class, *server.server_address)
179
class ThreadedNetworkedTests(BaseThreadedNetworkedTests):
181
server_class = SocketServer.TCPServer
182
imap_class = imaplib.IMAP4
185
class ThreadedNetworkedTestsSSL(BaseThreadedNetworkedTests):
187
server_class = SecureTCPServer
188
imap_class = IMAP4_SSL
21
test_support.run_unittest(TestImaplib)
192
tests = [TestImaplib]
194
if support.is_resource_enabled('network'):
197
CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir,
199
if not os.path.exists(CERTFILE):
200
raise support.TestFailed("Can't read certificate files!")
201
tests.append(ThreadedNetworkedTestsSSL)
202
tests.append(ThreadedNetworkedTests)
204
threadinfo = support.threading_setup()
206
support.run_unittest(*tests)
208
support.threading_cleanup(*threadinfo)
24
210
if __name__ == "__main__":
211
support.use_resources = ['network']