152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#!/usr/bin/env python
252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#
452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# Copyright 2007, The Android Open Source Project
552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#
652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# Licensed under the Apache License, Version 2.0 (the "License");
752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# you may not use this file except in compliance with the License.
852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# You may obtain a copy of the License at
952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#
1052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#     http://www.apache.org/licenses/LICENSE-2.0
1152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#
1252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# Unless required by applicable law or agreed to in writing, software
1352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# distributed under the License is distributed on an "AS IS" BASIS,
1452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# See the License for the specific language governing permissions and
1652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# limitations under the License.
1752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#
1852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
1952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project"""
2052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project  axl.py: HTTP Client torture tester
2152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
2252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project"""
2352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
2452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport sys, time
2552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
2652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectfrom twisted.internet import protocol, reactor, defer
2752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectfrom twisted.internet.protocol import ServerFactory, Protocol
2852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
2952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport singletonmixin, log
3052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
3152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass BaseProtocol(Protocol):
3252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def __init__(self):
3352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.log = log.Log.getInstance()
3452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
3552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def write(self, data):
3652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.log("BaseProtocol.write()", len(data), data)
3752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        return self.transport.write(data)
3852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
3952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
4052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.log("BaseProtocol.dataReceived()", len(data), data)
4152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
4252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def connectionMade(self):
4352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.log("BaseProtocol.connectionMade()")
4452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.transport.setTcpNoDelay(1)	# send immediately
4552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
4652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def connectionLost(self, reason):
4752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.log("BaseProtocol.connectionLost():", reason)
4852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
4952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def sendResponse(self, response):
5052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("HTTP/1.1 200 OK\r\n")
5152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("Content-Length: %d\r\n\r\n" % len(response))
5252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        if len(response) > 0:
5352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            self.write(response)
5452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
5552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
5652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# Tests
5752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# 8000: test driven by resource request
5852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
5952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass Drop(BaseProtocol):
6052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Drops connection immediately after connect"""
6152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8001
6252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def connectionMade(self):
6352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.connectionMade(self)
6452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.transport.loseConnection()
6552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
6652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass ReadAndDrop(BaseProtocol):
6752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Read 1st line of request, then drop connection"""
6852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8002
6952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
7052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
7152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.transport.loseConnection()
7252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
7352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass GarbageStatus(BaseProtocol):
7452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Send garbage statusline"""
7552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8003
7652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
7752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
7852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("welcome to the jungle baby\r\n")
7952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
8052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass BadHeader(BaseProtocol):
8152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Drop connection after a header is half-sent"""
8252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8004
8352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
8452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
8552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("HTTP/1.1 200 OK\r\n")
8652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("Cache-Contr")
8752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        time.sleep(1)
8852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.transport.loseConnection()
8952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
9052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass PauseHeader(BaseProtocol):
9152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Pause for a second in middle of a header"""
9252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8005
9352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
9452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
9552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("HTTP/1.1 200 OK\r\n")
9652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("Cache-Contr")
9752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        time.sleep(1)
9852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("ol: private\r\n\r\nwe've got fun and games")
9952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        time.sleep(1)
10052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.transport.loseConnection()
10152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
10252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass Redirect(BaseProtocol):
10352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8006
10452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
10552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
10652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("HTTP/1.1 302 Moved Temporarily\r\n")
10752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("Content-Length: 0\r\n")
10852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("Location: http://shopping.yahoo.com/p:Canon PowerShot SD630 Digital Camera:1993588104;_ylc=X3oDMTFhZXNmcjFjBF9TAzI3MTYxNDkEc2VjA2ZwLXB1bHNlBHNsawNyc3NfcHVsc2U0LmluYw--\r\n\r\n")
10952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.transport.loseConnection()
11052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
11152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass DataDrop(BaseProtocol):
11252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Drop connection in body"""
11352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8007
11452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
11552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        if data.find("favico") >= 0:
11652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            self.write("HTTP/1.1 404 Not Found\r\n\r\n")
11752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            self.transport.loseConnection()
11852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            return
11952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
12052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
12152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("HTTP/1.1 200 OK\r\n")
12252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#        self.write("Content-Length: 100\r\n\r\n")
12352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("\r\n")
12452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#        self.write("Data cuts off < 100 here!")
12552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#        time.sleep(4)
12652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.transport.loseConnection()
12752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
12852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass DropOnce(BaseProtocol):
12952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Drop every other connection"""
13052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8008
13152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    COUNT = 0
13252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
13352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
13452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("HTTP/1.1 200 OK\r\n")
13552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("Content-Length: 5\r\n\r\n")
13652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
13752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        if (not(DropOnce.COUNT & 1)):
13852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            self.write("HE")
13952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        else:
14052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            self.write("HELLO")
14152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.transport.loseConnection()
14252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
14352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        DropOnce.COUNT += 1
14452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
14552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass NoCR(BaseProtocol):
14652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Send headers without carriage returns"""
14752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8009
14852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
14952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
15052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("HTTP/1.1 200 OK\n")
15152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("Content-Length: 5\n\n")
15252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
15352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("HELLO")
15452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.transport.loseConnection()
15552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
15652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass PipeDrop(BaseProtocol):
15752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8010
15852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    COUNT = 0
15952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
16052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
16152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        if not PipeDrop.COUNT % 3:
16252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            self.write("HTTP/1.1 200 OK\n")
16352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            self.write("Content-Length: 943\n\n")
16452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
16552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            self.write(open("./stfu.jpg").read())
16652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            PipeDrop.COUNT += 1
16752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
16852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        else:
16952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            self.transport.loseConnection()
17052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            PipeDrop.COUNT += 1
17152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
17252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass RedirectLoop(BaseProtocol):
17352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Redirect back to same resource"""
17452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8011
17552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
17652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
17752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("HTTP/1.1 302 Moved Temporarily\r\n")
17852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("Content-Length: 0\r\n")
17952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("Location: http://localhost:8011/\r\n")
18052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("\r\n")
18152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.transport.loseConnection()
18252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
18352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass ReadAll(BaseProtocol):
18452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Read entire request"""
18552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8012
18652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
18752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def connectionMade(self):
18852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.count = 0
18952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
19052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
19152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
19252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.count += len(data)
19352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        if self.count == 190890:
19452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            self.transport.loseConnection()
19552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
19652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass Timeout(BaseProtocol):
19752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Timout sending body"""
19852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8013
19952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
20052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def connectionMade(self):
20152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.count = 0
20252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
20352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
20452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
20552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        if self.count == 0: self.write("HTTP/1.1 200 OK\r\n\r\n")
20652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.count += 1
20752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
20852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass SlowResponse(BaseProtocol):
20952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    """Ensure client does not time out on slow writes"""
21052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    PORT = 8014
21152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
21252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def connectionMade(self):
21352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.count = 0
21452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
21552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def dataReceived(self, data):
21652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        BaseProtocol.dataReceived(self, data)
21752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        if self.count == 0: self.write("HTTP/1.1 200 OK\r\n\r\n")
21852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.sendPack(0)
21952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
22052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    def sendPack(self, count):
22152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        if count > 10:
22252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            self.transport.loseConnection()
22352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
22452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        self.write("all work and no play makes jack a dull boy %s\n" % count)
22552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        d = defer.Deferred()
22652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        d.addCallback(self.sendPack)
22752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        reactor.callLater(15, d.callback, count + 1)
22852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
22952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
23052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# HTTP/1.1 200 OK
23152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# Cache-Control: private
23252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# Content-Type: text/html
23352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# Set-Cookie: PREF=ID=10644de62c423aa5:TM=1155044293:LM=1155044293:S=0lHtymefQRs2j7nD; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
23452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# Server: GWS/2.1
23552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# Transfer-Encoding: chunked
23652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project# Date: Tue, 08 Aug 2006 13:38:13 GMT
23752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
23852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectdef main():
23952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    # Initialize log
24052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    log.Log.getInstance(sys.stdout)
24152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
24252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    for protocol in Drop, ReadAndDrop, GarbageStatus, BadHeader, PauseHeader, \
24352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            Redirect, DataDrop, DropOnce, NoCR, PipeDrop, RedirectLoop, ReadAll, \
24452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            Timeout, SlowResponse:
24552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        factory = ServerFactory()
24652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        factory.protocol = protocol
24752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        reactor.listenTCP(protocol.PORT, factory)
24852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
24952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
25052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    reactor.run()
25152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
25252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectif __name__ == '__main__':
25352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    main()
254