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