def testFourPipelinedHTTP11PostFirstRequests(self): a, b = coio.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) b.sendall( 'POST /save HTTP/1.1\r\nContent-Length: 7\r\n\r\nfoo\nbar' 'POST /save HTTP/1.1\r\nContent-Length: 10\r\n\r\nNice!\ngood' 'GET /answer?foo=x+y&bar= HTTP/1.0\r\n\r\n' 'GET /unreached... HTTP/1.1\r\n\r\n') CallWsgiWorker(a) responses = SplitHttpResponses(b.recv(8192)) self.assertEqual(3, len(responses)) head, body = ParseHttpResponse(responses[0]) self.assertEqual('Keep-Alive', head['Connection']) self.AssertSaveResponse(head, body, http_version='1.1') head, body = ParseHttpResponse(responses[1]) self.assertEqual('Keep-Alive', head['Connection']) self.AssertSaveResponse(head, body, http_version='1.1', msg='NICE!\n', is_new_date=True) head, body = ParseHttpResponse(responses[2]) self.assertEqual('close', head['Connection']) self.AssertAnswerResponse(head, body, http_version='1.0', is_new_date=True)
def testSinglePolicyFileRequest(self): a, b = coio.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) b.sendall('<policy-file-request/>\0foobar') b.shutdown(1) CallWsgiWorker(a) response = b.recv(8192) self.assertEqual('I hope you like our policy.', response)
def setUp(self): import socket sock1, sock2 = coio.socketpair(socket.AF_UNIX, socket.SOCK_STREAM, 0) self.sock1 = sock1 self.f = coio.nbfile(sock1.fileno(), sock2.fileno(), write_buffer_limit=0, do_close=0, close_ref=(sock1, sock2))
def testContinuableHTTP11Request(self): a, b = coio.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) b.sendall('GET /?foo=bar HTTP/1.1\r\n\r\n') b.shutdown(1) CallWsgiWorker(a) head, body = ParseHttpResponse(b.recv(8192)) self.assertEqual('Keep-Alive', head['Connection']) self.AssertHelloResponse(head, body, http_version='1.1')
def testSingleGetRequest(self): a, b = coio.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) b.sendall('GET / HTTP/1.0\r\n\r\n') b.shutdown(1) CallWsgiWorker(a) head, body = ParseHttpResponse(b.recv(8192)) self.assertEqual('close', head['Connection']) self.AssertHelloResponse(head, body)
def testTimeout(self): self.sock1.settimeout(0.0) self.assertRaisesErrno(socket.error, errno.EAGAIN, self.sock1.recv, 1) self.sock1.settimeout(0.000002) self.assertRaisesStr(socket.timeout, 'timed out', self.sock1.recv, 1) sock1, sock2 = coio.socketpair(socket.AF_UNIX, socket.SOCK_STREAM, 0) self.DoTestTimeout(sock1, sock1.makefile) self.DoTestTimeout(sock1, sock1.makefile_samefd)
def testSinglePostRequest(self): a, b = coio.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) b.sendall('POST /save HTTP/1.0\r\nContent-Length: 7\r\n' 'X-1: Z\r\n\r\nfoo\nbar') b.shutdown(1) CallWsgiWorker(a) head, body = ParseHttpResponse(b.recv(8192)) self.assertEqual('close', head['Connection']) self.AssertSaveResponse(head, body)
def testTwoSequentialHTTP11PostFirstRequests(self): a, b = coio.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) b.sendall('POST /save HTTP/1.1\r\nContent-Length: 7\r\n\r\nfoo\nbar') CallWsgiWorker(a, do_multirequest=False) head, body = ParseHttpResponse(b.recv(8192)) self.assertEqual('Keep-Alive', head['Connection']) self.AssertSaveResponse(head, body, http_version='1.1') b.sendall('GET /answer?foo=bar HTTP/1.1\r\n\r\n') b.shutdown(1) CallWsgiWorker(a) head, body = ParseHttpResponse(b.recv(8192)) self.assertEqual('Keep-Alive', head['Connection']) self.AssertAnswerResponse(head, body, http_version='1.1')
def testSingleTooLongRequest(self): a, b = coio.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) max_size = min(coio.max_nonblocking_pipe_write_size, 33333) request = 'GET / HTTP/1.0\r\n' request += 'Xy: Z\r\n' * ((max_size - len(request)) / 7) assert len(request) <= max_size b.sendall(request) b.shutdown(1) CallWsgiWorker(a) try: response = b.recv(8192) except IOError, e: if e.errno != errno.ECONNRESET: raise # Some Linux 2.6.32 systems raise ECONNRESET if the peer is very fast # to close the connection. The exact reasons why we get ECONNRESET # instead of just an EOF sometimes is unclear to me. response = ''
def testThreePipelinedHTTP11GetRequests(self): a, b = coio.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) b.sendall('GET / HTTP/1.1\r\n\r\n' 'GET /answer?foo=x+y&bar= HTTP/1.0\r\n\r\n' 'GET /unreached... HTTP/1.1\r\n\r\n') CallWsgiWorker(a) responses = SplitHttpResponses(b.recv(8192)) # The WsgiWorker doesn't respond to request 2 (/unreached...), because # the previous request was a HTTP/1.0 request with default Connection: # close (so keep-alive is false). self.assertEqual(2, len(responses)) head, body = ParseHttpResponse(responses[0]) self.assertEqual('Keep-Alive', head['Connection']) self.AssertHelloResponse(head, body, http_version='1.1') head, body = ParseHttpResponse(responses[1]) self.assertEqual('close', head['Connection']) self.AssertAnswerResponse(head, body, http_version='1.0', is_new_date=True)
def testFourPipelinedHTTP11PostFirstRequests(self): a, b = coio.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) b.sendall('POST /save HTTP/1.1\r\nContent-Length: 7\r\n\r\nfoo\nbar' 'POST /save HTTP/1.1\r\nContent-Length: 10\r\n\r\nNice!\ngood' 'GET /answer?foo=x+y&bar= HTTP/1.0\r\n\r\n' 'GET /unreached... HTTP/1.1\r\n\r\n') CallWsgiWorker(a) responses = SplitHttpResponses(b.recv(8192)) self.assertEqual(3, len(responses)) head, body = ParseHttpResponse(responses[0]) self.assertEqual('Keep-Alive', head['Connection']) self.AssertSaveResponse(head, body, http_version='1.1') head, body = ParseHttpResponse(responses[1]) self.assertEqual('Keep-Alive', head['Connection']) self.AssertSaveResponse(head, body, http_version='1.1', msg='NICE!\n', is_new_date=True) head, body = ParseHttpResponse(responses[2]) self.assertEqual('close', head['Connection']) self.AssertAnswerResponse(head, body, http_version='1.0', is_new_date=True)
def testWithoutPatch(self): a, b = coio.socketpair() pid = unpatched_fork() if pid: # Parent. try: a = a.dup() b = b.dup() RunWorker(b, a, self.MAX_SIZE) finally: got_pid, status = os.waitpid(pid, 0) assert got_pid == pid assert status == 0, 'child exited with status 0x%x' % status else: try: # Without coio.reinit() this the child may crash (segfault) or time # out. coio.reinit() RunWorker(a, b, self.MAX_SIZE) os._exit(0) except: sys.stderr.write(sys.exc_info()) os._exit(1)
def testWithPatch(self): patch.patch_os() assert os.fork is not unpatched_fork a, b = coio.socketpair() pid = os.fork() if pid: # Parent. try: a = a.dup() b = b.dup() RunWorker(b, a, self.MAX_SIZE) finally: got_pid, status = os.waitpid(pid, 0) assert got_pid == pid assert status == 0, 'child exited with status 0x%x' % status else: try: # No need for coio.reinit(), our patched fork does that. RunWorker(a, b, self.MAX_SIZE) os._exit(0) except: sys.stderr.write(sys.exc_info()) os._exit(1)
sys.stdout.flush() if sock_in: # Read the rest. while True: data = sock_in.recv(8192) if not data: break byte_count += len(data) line_count += data.count('\n') assert byte_count == expected_byte_count assert line_count == expected_line_count sys.stdout.write('$' + progress_str) sys.stdout.flush() if __name__ == '__main__': a, b = coio.socketpair() select_function = coio.select #a, b = socket.socketpair() #select_function = select.select #a, b = socket.socketpair() max_size = min(coio.max_nonblocking_pipe_write_size, 20000) # So we don't lose characters when writing the output to a file. EnableAppendMode(sys.stdout) EnableAppendMode(sys.stderr) pid = os.fork() # signal.alarm(10) won't help here. if pid: # Parent. try: a = a.dup() b = b.dup()
sys.stdout.write('/' + progress_str) sys.stdout.flush() if sock_in: # Read the rest. while True: data = sock_in.recv(8192) if not data: break byte_count += len(data) line_count += data.count('\n') assert byte_count == expected_byte_count assert line_count == expected_line_count sys.stdout.write('$' + progress_str) sys.stdout.flush() if __name__ == '__main__': a, b = coio.socketpair() select_function = coio.select #a, b = socket.socketpair() #select_function = select.select #a, b = socket.socketpair() max_size = min(coio.max_nonblocking_pipe_write_size, 20000) # So we don't lose characters when writing the output to a file. EnableAppendMode(sys.stdout) EnableAppendMode(sys.stderr) pid = os.fork() # signal.alarm(10) won't help here. if pid: # Parent. try: a = a.dup() b = b.dup()