Example #1
0
 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)
Example #2
0
 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)
Example #3
0
 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))
Example #4
0
 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)
Example #5
0
 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')
Example #6
0
 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)
Example #7
0
 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')
Example #8
0
 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)
Example #9
0
 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)
Example #10
0
 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)
Example #11
0
 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)
Example #12
0
 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)
Example #13
0
 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))
Example #14
0
 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')
Example #15
0
 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')
Example #16
0
 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 = ''
Example #17
0
 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)
Example #18
0
 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 = ''
Example #19
0
 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)
Example #20
0
 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)
Example #21
0
 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)
Example #22
0
 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)
Example #23
0
    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()
Example #24
0
  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()