diff options
author | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:16:14 +0300 |
---|---|---|
committer | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:43:30 +0300 |
commit | b8cf9e88f4c5c64d9406af533d8948deb050d695 (patch) | |
tree | 218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py3/twisted/web/tap.py | |
parent | 523f645a83a0ec97a0332dbc3863bb354c92a328 (diff) | |
download | ydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz |
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py3/twisted/web/tap.py')
-rw-r--r-- | contrib/python/Twisted/py3/twisted/web/tap.py | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py3/twisted/web/tap.py b/contrib/python/Twisted/py3/twisted/web/tap.py new file mode 100644 index 0000000000..2ed783848a --- /dev/null +++ b/contrib/python/Twisted/py3/twisted/web/tap.py @@ -0,0 +1,322 @@ +# -*- test-case-name: twisted.web.test.test_tap -*- +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. + +""" +Support for creating a service which runs a web server. +""" + + +import os +import warnings + +import incremental + +from twisted.application import service, strports +from twisted.internet import interfaces, reactor +from twisted.python import deprecate, reflect, threadpool, usage +from twisted.spread import pb +from twisted.web import demo, distrib, resource, script, server, static, twcgi, wsgi + + +class Options(usage.Options): + """ + Define the options accepted by the I{twistd web} plugin. + """ + + synopsis = "[web options]" + + optParameters = [ + ["logfile", "l", None, "Path to web CLF (Combined Log Format) log file."], + [ + "certificate", + "c", + "server.pem", + "(DEPRECATED: use --listen) " "SSL certificate to use for HTTPS. ", + ], + [ + "privkey", + "k", + "server.pem", + "(DEPRECATED: use --listen) " "SSL certificate to use for HTTPS.", + ], + ] + + optFlags = [ + [ + "notracebacks", + "n", + ( + "(DEPRECATED: Tracebacks are disabled by default. " + "See --enable-tracebacks to turn them on." + ), + ], + [ + "display-tracebacks", + "", + ( + "Show uncaught exceptions during rendering tracebacks to " + "the client. WARNING: This may be a security risk and " + "expose private data!" + ), + ], + ] + + optFlags.append( + [ + "personal", + "", + "Instead of generating a webserver, generate a " + "ResourcePublisher which listens on the port given by " + "--listen, or ~/%s " % (distrib.UserDirectory.userSocketName,) + + "if --listen is not specified.", + ] + ) + + compData = usage.Completions( + optActions={ + "logfile": usage.CompleteFiles("*.log"), + "certificate": usage.CompleteFiles("*.pem"), + "privkey": usage.CompleteFiles("*.pem"), + } + ) + + longdesc = """\ +This starts a webserver. If you specify no arguments, it will be a +demo webserver that has the Test class from twisted.web.demo in it.""" + + def __init__(self): + usage.Options.__init__(self) + self["indexes"] = [] + self["root"] = None + self["extraHeaders"] = [] + self["ports"] = [] + self["port"] = self["https"] = None + + def opt_port(self, port): + """ + (DEPRECATED: use --listen) + Strports description of port to start the server on + """ + msg = deprecate.getDeprecationWarningString( + self.opt_port, incremental.Version("Twisted", 18, 4, 0) + ) + warnings.warn(msg, category=DeprecationWarning, stacklevel=2) + self["port"] = port + + opt_p = opt_port + + def opt_https(self, port): + """ + (DEPRECATED: use --listen) + Port to listen on for Secure HTTP. + """ + msg = deprecate.getDeprecationWarningString( + self.opt_https, incremental.Version("Twisted", 18, 4, 0) + ) + warnings.warn(msg, category=DeprecationWarning, stacklevel=2) + self["https"] = port + + def opt_listen(self, port): + """ + Add an strports description of port to start the server on. + [default: tcp:8080] + """ + self["ports"].append(port) + + def opt_index(self, indexName): + """ + Add the name of a file used to check for directory indexes. + [default: index, index.html] + """ + self["indexes"].append(indexName) + + opt_i = opt_index + + def opt_user(self): + """ + Makes a server with ~/public_html and ~/.twistd-web-pb support for + users. + """ + self["root"] = distrib.UserDirectory() + + opt_u = opt_user + + def opt_path(self, path): + """ + <path> is either a specific file or a directory to be set as the root + of the web server. Use this if you have a directory full of HTML, cgi, + epy, or rpy files or any other files that you want to be served up raw. + """ + self["root"] = static.File(os.path.abspath(path)) + self["root"].processors = { + ".epy": script.PythonScript, + ".rpy": script.ResourceScript, + } + self["root"].processors[".cgi"] = twcgi.CGIScript + + def opt_processor(self, proc): + """ + `ext=class' where `class' is added as a Processor for files ending + with `ext'. + """ + if not isinstance(self["root"], static.File): + raise usage.UsageError("You can only use --processor after --path.") + ext, klass = proc.split("=", 1) + self["root"].processors[ext] = reflect.namedClass(klass) + + def opt_class(self, className): + """ + Create a Resource subclass with a zero-argument constructor. + """ + classObj = reflect.namedClass(className) + self["root"] = classObj() + + def opt_resource_script(self, name): + """ + An .rpy file to be used as the root resource of the webserver. + """ + self["root"] = script.ResourceScriptWrapper(name) + + def opt_wsgi(self, name): + """ + The FQPN of a WSGI application object to serve as the root resource of + the webserver. + """ + try: + application = reflect.namedAny(name) + except (AttributeError, ValueError): + raise usage.UsageError(f"No such WSGI application: {name!r}") + pool = threadpool.ThreadPool() + reactor.callWhenRunning(pool.start) + reactor.addSystemEventTrigger("after", "shutdown", pool.stop) + self["root"] = wsgi.WSGIResource(reactor, pool, application) + + def opt_mime_type(self, defaultType): + """ + Specify the default mime-type for static files. + """ + if not isinstance(self["root"], static.File): + raise usage.UsageError("You can only use --mime_type after --path.") + self["root"].defaultType = defaultType + + opt_m = opt_mime_type + + def opt_allow_ignore_ext(self): + """ + Specify whether or not a request for 'foo' should return 'foo.ext' + """ + if not isinstance(self["root"], static.File): + raise usage.UsageError( + "You can only use --allow_ignore_ext " "after --path." + ) + self["root"].ignoreExt("*") + + def opt_ignore_ext(self, ext): + """ + Specify an extension to ignore. These will be processed in order. + """ + if not isinstance(self["root"], static.File): + raise usage.UsageError("You can only use --ignore_ext " "after --path.") + self["root"].ignoreExt(ext) + + def opt_add_header(self, header): + """ + Specify an additional header to be included in all responses. Specified + as "HeaderName: HeaderValue". + """ + name, value = header.split(":", 1) + self["extraHeaders"].append((name.strip(), value.strip())) + + def postOptions(self): + """ + Set up conditional defaults and check for dependencies. + + If SSL is not available but an HTTPS server was configured, raise a + L{UsageError} indicating that this is not possible. + + If no server port was supplied, select a default appropriate for the + other options supplied. + """ + if self["port"] is not None: + self["ports"].append(self["port"]) + if self["https"] is not None: + try: + reflect.namedModule("OpenSSL.SSL") + except ImportError: + raise usage.UsageError("SSL support not installed") + sslStrport = "ssl:port={}:privateKey={}:certKey={}".format( + self["https"], + self["privkey"], + self["certificate"], + ) + self["ports"].append(sslStrport) + if len(self["ports"]) == 0: + if self["personal"]: + path = os.path.expanduser( + os.path.join("~", distrib.UserDirectory.userSocketName) + ) + self["ports"].append("unix:" + path) + else: + self["ports"].append("tcp:8080") + + +def makePersonalServerFactory(site): + """ + Create and return a factory which will respond to I{distrib} requests + against the given site. + + @type site: L{twisted.web.server.Site} + @rtype: L{twisted.internet.protocol.Factory} + """ + return pb.PBServerFactory(distrib.ResourcePublisher(site)) + + +class _AddHeadersResource(resource.Resource): + def __init__(self, originalResource, headers): + self._originalResource = originalResource + self._headers = headers + + def getChildWithDefault(self, name, request): + for k, v in self._headers: + request.responseHeaders.addRawHeader(k, v) + return self._originalResource.getChildWithDefault(name, request) + + +def makeService(config): + s = service.MultiService() + if config["root"]: + root = config["root"] + if config["indexes"]: + config["root"].indexNames = config["indexes"] + else: + # This really ought to be web.Admin or something + root = demo.Test() + + if isinstance(root, static.File): + root.registry.setComponent(interfaces.IServiceCollection, s) + + if config["extraHeaders"]: + root = _AddHeadersResource(root, config["extraHeaders"]) + + if config["logfile"]: + site = server.Site(root, logPath=config["logfile"]) + else: + site = server.Site(root) + + if config["display-tracebacks"]: + site.displayTracebacks = True + + # Deprecate --notracebacks/-n + if config["notracebacks"]: + msg = deprecate._getDeprecationWarningString( + "--notracebacks", incremental.Version("Twisted", 19, 7, 0) + ) + warnings.warn(msg, category=DeprecationWarning, stacklevel=2) + + if config["personal"]: + site = makePersonalServerFactory(site) + for port in config["ports"]: + svc = strports.service(port, site) + svc.setServiceParent(s) + return s |