+from twisted.protocols.policies import TimeoutMixin
from twisted.web import resource, server, static, http
from twisted.internet import error, reactor
import engines
return real_ip
return fake_ip
-
+
+class HTTPChannel(http.HTTPChannel):
+ def timeoutConnection(self):
+ self.transport.abortConnection()
+
class RootSite(server.Site):
- protocol = http.HTTPChannel
+ protocol = HTTPChannel
if hasattr(config, "FORWARDED_FOR_HEADER"):
requestFactory = ProxyRequest
- def __init__(self, path):
+ def __init__(self, path, *args, **kwargs):
root = RootResource()
- server.Site.__init__(self, root, timeout=5)
+ kwargs["timeout"] = config.HTTP_REQUEST_TIMEOUT
+ server.Site.__init__(self, root, *args, **kwargs)
services = {}
services["StaticEngine"] = root.primaryChild = engines.StaticEngine(path)
parser.add_option("-H", "--certificate-chain", help="Path to SSL certificate chain file.", dest="sslchain")
parser.add_option("-P", "--pidfile", help="Path to store PID file", dest="pidfile")
parser.add_option("-s", "--syslog", help="Log to syslog", action="store_true", dest="syslog", default=False)
+parser.add_option("-f", "--flash-port", help="Port to listen for flash policy connections on.", type="int", dest="flashPort")
parser.add_option("--profile", help="Run in profile mode, dumping results to this file", dest="profile")
parser.add_option("--profiler", help="Name of profiler to use", dest="profiler")
parser.add_option("--syslog-prefix", help="Syslog prefix", dest="syslog_prefix", default="qwebirc")
if options.clogfile:
args2+=["--logfile", options.clogfile]
+if options.flashPort:
+ args2+=["--flashPort", options.flashPort]
+
if options.sslcertificate and options.sslkey:
args2+=["--certificate", options.sslcertificate, "--privkey", options.sslkey, "--https", options.port]
if options.sslchain:
from twisted.protocols import basic, policies
from twisted.plugin import IPlugin
from twisted.application.service import IServiceMaker
-from twisted.application import internet, strports
+from twisted.application import internet, strports, service
from twisted.web import static, server
import urlparse
import urllib
["privkey", "k", "server.pem", "SSL certificate to use for HTTPS."],
["certificate-chain", "C", None, "Chain SSL certificate"],
["staticpath", "s", "static", "Path to static content"],
+ ["flashPort", None, None, "Port to listen on for flash policy connections."],
]
optFlags = [["notracebacks", "n", "Display tracebacks in broken web pages. " +
self.transport.write(self.factory.response_body)
self.transport.loseConnection()
return
- else:
+ elif self.factory.childProtocol:
self.setTimeout(None)
- p = self.factory.site.buildProtocol(self.transport.client)
+ p = self.factory.childProtocol.buildProtocol(self.transport.client)
p.transport = self.transport
self.transport.protocol = p
p.connectionMade()
p.dataReceived(data)
+ else:
+ self.transport.loseConnection()
class FlashPolicyFactory(protocol.ServerFactory):
protocol = FlashPolicyProtocol
- def __init__(self, site):
+ def __init__(self, childProtocol=None):
import config
base_url = urlparse.urlparse(config.BASE_URL)
port = base_url.port
else:
raise Exception("Unknown scheme: " + base_url.scheme)
- self.site = site
+ self.childProtocol = childProtocol
self.response_body = """<cross-domain-policy>
<allow-access-from domain="%s" to-ports="%d" />
</cross-domain-policy>""" % (urllib.quote(base_url.hostname), port) + '\0'
site = RootSite(config['staticpath'], logPath=config['logfile'])
else:
site = RootSite(config['staticpath'])
-
+
+ s = service.MultiService()
site.displayTracebacks = not config["notracebacks"]
if config['https']:
ssl_factory = get_ssl_factory_factory()
- i = internet.SSLServer(int(config['https']), FlashPolicyFactory(site), ssl_factory(config['privkey'], config['certificate'], certificateChainFile=config["certificate-chain"]), interface=config['ip'])
+ i = internet.SSLServer(int(config['https']), site, ssl_factory(config['privkey'], config['certificate'], certificateChainFile=config["certificate-chain"]), interface=config['ip'])
else:
i = internet.TCPServer(int(config['port']), FlashPolicyFactory(site), interface=config['ip'])
-
- return i
+
+ i.setServiceParent(s)
+ if config["flashPort"]:
+ f = internet.TCPServer(int(config['flashPort']), FlashPolicyFactory(), interface=config['ip'])
+ f.setServiceParent(s)
+
+ return s
def get_ssl_factory_factory():
from twisted.internet.ssl import DefaultOpenSSLContextFactory