#!/usr/bin/env python
#
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

print '''1..1 headers
# The response isn't held up until the server starts sending content'''

from twisted.internet import error, protocol, reactor, tcp
from twisted.web import http

def callback():
  print 'not ok 1 - No response yet'

  reactor.stop()

reactor.callLater(1, callback)

class factory(http.HTTPFactory):
  class protocol(http.HTTPChannel):
    class requestFactory(http.Request):
      def requestReceived(ctx, method, target, version):

        ctx.client = None
        ctx.clientproto = version

        ctx.write('')

server = tcp.Port(0, factory())
server.startListening()

print '# Listening on {0}:{1}'.format(*server.socket.getsockname())

class factory(protocol.ClientFactory):
  def clientConnectionFailed(ctx, connector, reason):

    print 'Bail out!'
    reason.printTraceback()

    reactor.stop()

  class protocol(http.HTTPClient):
    def connectionLost(ctx, reason):
      try:
        reactor.stop()

      except error.ReactorNotRunning:
        pass

      else:
        print 'not ok 1 - Did the proxy crash?  (The client connection closed.)'

    connectionMade = lambda ctx: ctx.transport.write('GET {0}:{1} HTTP/1.1\r\n\r\n'.format(*server.socket.getsockname()))

    def handleStatus(ctx, version, status, message):
      print 'ok 1 - Got the response status'

      reactor.stop()

tcp.Connector('localhost', 8080, factory(), 30, None, reactor).connect()

reactor.run()
