[CalendarServer-changes] [3326] CalendarServer/trunk/twistedcaldav
source_changes at macosforge.org
source_changes at macosforge.org
Wed Nov 5 18:58:01 PST 2008
Revision: 3326
http://trac.macosforge.org/projects/calendarserver/changeset/3326
Author: cdaboo at apple.com
Date: 2008-11-05 18:58:00 -0800 (Wed, 05 Nov 2008)
Log Message:
-----------
Optionally log 503 errors in the access log.
Modified Paths:
--------------
CalendarServer/trunk/twistedcaldav/__init__.py
CalendarServer/trunk/twistedcaldav/accesslog.py
CalendarServer/trunk/twistedcaldav/tap.py
Added Paths:
-----------
CalendarServer/trunk/twistedcaldav/httpfactory.py
Modified: CalendarServer/trunk/twistedcaldav/__init__.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/__init__.py 2008-11-06 01:45:12 UTC (rev 3325)
+++ CalendarServer/trunk/twistedcaldav/__init__.py 2008-11-06 02:58:00 UTC (rev 3326)
@@ -35,6 +35,7 @@
"extensions",
"fileops",
"freebusyurl",
+ "httpfactory",
"ical",
"icaldav",
"index",
Modified: CalendarServer/trunk/twistedcaldav/accesslog.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/accesslog.py 2008-11-06 01:45:12 UTC (rev 3325)
+++ CalendarServer/trunk/twistedcaldav/accesslog.py 2008-11-06 02:58:00 UTC (rev 3326)
@@ -58,69 +58,83 @@
"""
def emit(self, eventDict):
- if eventDict.get('interface') is not iweb.IRequest:
- return
- request = eventDict['request']
- response = eventDict['response']
- loginfo = eventDict['loginfo']
- firstLine = '%s %s HTTP/%s' %(
- request.method,
- request.uri,
- '.'.join([str(x) for x in request.clientproto]))
+ if eventDict.get('interface') is iweb.IRequest:
- # Try to determine authentication and authorization identifiers
- uid = "-"
- if hasattr(request, "authnUser"):
- if isinstance(request.authnUser.children[0], davxml.HRef):
- uidn = str(request.authnUser.children[0])
- uidz = None
- if hasattr(request, "authzUser") and str(request.authzUser.children[0]) != uidn:
- uidz = str(request.authzUser.children[0])
-
- def convertUIDtoShortName(uid):
- uid = uid.rstrip("/")
- uid = uid[uid.rfind("/") + 1:]
- record = request.site.resource.getDirectory().recordWithUID(uid)
- if record:
- if record.recordType == DirectoryService.recordType_users:
- return record.shortName
+ request = eventDict['request']
+ response = eventDict['response']
+ loginfo = eventDict['loginfo']
+ firstLine = '%s %s HTTP/%s' %(
+ request.method,
+ request.uri,
+ '.'.join([str(x) for x in request.clientproto]))
+
+ # Try to determine authentication and authorization identifiers
+ uid = "-"
+ if hasattr(request, "authnUser"):
+ if isinstance(request.authnUser.children[0], davxml.HRef):
+ uidn = str(request.authnUser.children[0])
+ uidz = None
+ if hasattr(request, "authzUser") and str(request.authzUser.children[0]) != uidn:
+ uidz = str(request.authzUser.children[0])
+
+ def convertUIDtoShortName(uid):
+ uid = uid.rstrip("/")
+ uid = uid[uid.rfind("/") + 1:]
+ record = request.site.resource.getDirectory().recordWithUID(uid)
+ if record:
+ if record.recordType == DirectoryService.recordType_users:
+ return record.shortName
+ else:
+ return "(%s)%s" % (record.recordType, record.shortName,)
else:
- return "(%s)%s" % (record.recordType, record.shortName,)
+ return uid
+
+ uidn = convertUIDtoShortName(uidn)
+ if uidz:
+ uidz = convertUIDtoShortName(uidz)
+
+ if uidn and uidz:
+ uid = '"%s as %s"' % (uidn, uidz,)
else:
- return uid
-
- uidn = convertUIDtoShortName(uidn)
- if uidz:
- uidz = convertUIDtoShortName(uidz)
-
- if uidn and uidz:
- uid = '"%s as %s"' % (uidn, uidz,)
- else:
- uid = uidn
+ uid = uidn
+
+ format_str = '%s - %s [%s] "%s" %s %d "%s" "%s" [%.1f ms]'
+ format_data = (
+ request.remoteAddr.host,
+ uid,
+ self.logDateString(
+ response.headers.getHeader('date', 0)),
+ firstLine,
+ response.code,
+ loginfo.bytesSent,
+ request.headers.getHeader('referer', '-'),
+ request.headers.getHeader('user-agent', '-'),
+ (time.time() - request.initTime) * 1000,
+ )
+ if config.MoreAccessLogData:
+ format_str += ' [%d %d]'
+ format_data += (
+ request.chanRequest.transport.server.port,
+ request.chanRequest.channel.factory.outstandingRequests,
+ )
+ self.logMessage(format_str % format_data)
- format_str = '%s - %s [%s] "%s" %s %d "%s" "%s" [%.1f ms]'
- format_data = (
- request.remoteAddr.host,
- uid,
- self.logDateString(
- response.headers.getHeader('date', 0)),
- firstLine,
- response.code,
- loginfo.bytesSent,
- request.headers.getHeader('referer', '-'),
- request.headers.getHeader('user-agent', '-'),
- (time.time() - request.initTime) * 1000,
- )
- if config.MoreAccessLogData:
- format_str += ' [%d %d]'
- format_data += (
- request.chanRequest.transport.server.port,
- request.chanRequest.channel.factory.outstandingRequests,
+ elif "overloaded" in eventDict:
+ overloaded = eventDict.get("overloaded")
+ format_str = '%s - - [%s] "???" 503 0 "-" "-" [0.0 ms]'
+ format_data = (
+ overloaded.transport.hostname,
+ self.logDateString(time.time()),
)
- self.logMessage(format_str % format_data)
+ if config.MoreAccessLogData:
+ format_str += ' [%d %d]'
+ format_data += (
+ overloaded.transport.server.port,
+ overloaded.outstandingRequests,
+ )
+ self.logMessage(format_str % format_data)
-
class RotatingFileAccessLoggingObserver(CommonAccessLoggingObserverExtensions):
"""
Class to do 'apache' style access logging to a rotating log file. The log
Added: CalendarServer/trunk/twistedcaldav/httpfactory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/httpfactory.py (rev 0)
+++ CalendarServer/trunk/twistedcaldav/httpfactory.py 2008-11-06 02:58:00 UTC (rev 3326)
@@ -0,0 +1,56 @@
+##
+# Copyright (c) 2008 Apple Inc. All rights reserved.
+#
+# Licensed 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.
+##
+
+from twisted.internet import protocol
+from twisted.python import log
+from twisted.web2.channel.http import HTTPFactory
+
+from twistedcaldav.config import config
+
+__all__ = ['HTTP503LoggingFactory', ]
+
+class OverloadedLoggingServerProtocol(protocol.Protocol):
+
+ def __init__(self, outstandingRequests):
+ self.outstandingRequests = outstandingRequests
+
+ def connectionMade(self):
+ if config.MoreAccessLogData:
+ log.msg(overloaded=self)
+ self.transport.write("HTTP/1.0 503 Service Unavailable\r\n"
+ "Content-Type: text/html\r\n"
+ "Connection: close\r\n\r\n"
+ "<html><head><title>503 Service Unavailable</title></head>"
+ "<body><h1>Service Unavailable</h1>"
+ "The server is currently overloaded, "
+ "please try again later.</body></html>")
+ self.transport.loseConnection()
+
+class HTTP503LoggingFactory(HTTPFactory):
+ """Factory for HTTP server."""
+
+ def __init__(self, requestFactory, maxRequests=600, **kwargs):
+ HTTPFactory.__init__(self, requestFactory, maxRequests, **kwargs)
+
+ def buildProtocol(self, addr):
+ if self.outstandingRequests >= self.maxRequests:
+ return OverloadedLoggingServerProtocol(self.outstandingRequests)
+
+ p = protocol.ServerFactory.buildProtocol(self, addr)
+
+ for arg,value in self.protocolArgs.iteritems():
+ setattr(p, arg, value)
+ return p
Modified: CalendarServer/trunk/twistedcaldav/tap.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/tap.py 2008-11-06 01:45:12 UTC (rev 3325)
+++ CalendarServer/trunk/twistedcaldav/tap.py 2008-11-06 02:58:00 UTC (rev 3326)
@@ -35,7 +35,6 @@
from twisted.cred.portal import Portal
from twisted.web2.dav import auth
from twisted.web2.auth.basic import BasicCredentialFactory
-from twisted.web2.channel import http
from twisted.web2.server import Site
from twistedcaldav.log import Logger, logLevelForNamespace, setLogLevelForNamespace
@@ -51,6 +50,7 @@
from twistedcaldav.directory.aggregate import AggregateDirectoryService
from twistedcaldav.directory.sudo import SudoDirectoryService
from twistedcaldav.directory.wiki import WikiDirectoryService
+from twistedcaldav.httpfactory import HTTP503LoggingFactory
from twistedcaldav.static import CalendarHomeProvisioningFile
from twistedcaldav.static import IScheduleInboxFile
from twistedcaldav.static import TimezoneServiceFile
@@ -627,7 +627,7 @@
site = Site(realRoot)
- channel = http.HTTPFactory(
+ channel = HTTP503LoggingFactory(
site,
maxRequests=config.MaxRequests,
betweenRequestsTimeOut=config.IdleConnectionTimeOut,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20081105/983f4798/attachment-0001.html>
More information about the calendarserver-changes
mailing list