Added support for INIMAGE error handling.
This commit is contained in:
parent
b8ac9b1984
commit
f862ef425f
5 changed files with 82 additions and 47 deletions
|
@ -89,8 +89,9 @@ class Handler(cgi.DebugHandler):
|
|||
eh = ExceptionHandler130(self.debug)
|
||||
else:
|
||||
eh = ExceptionHandler111(self.debug)
|
||||
req.set_header('Content-Type', eh.mimetype)
|
||||
req.write(eh.getcontent())
|
||||
response = eh.getresponse(reqparams)
|
||||
req.set_header('Content-Type', response.content_type)
|
||||
req.write(response.content)
|
||||
|
||||
def lowerparams(params):
|
||||
reqparams = {}
|
||||
|
|
|
@ -21,8 +21,13 @@
|
|||
|
||||
from exceptions import OGCException, ServerConfigurationError
|
||||
from mapnik import Map, Color, Envelope, render, rawdata, Image, Projection
|
||||
from PIL.Image import fromstring
|
||||
from PIL.Image import fromstring, new
|
||||
from PIL.ImageDraw import Draw
|
||||
from StringIO import StringIO
|
||||
from copy import deepcopy
|
||||
from traceback import print_tb
|
||||
from sys import exc_info
|
||||
from lxml import etree as ElementTree
|
||||
import re
|
||||
# from elementtree import ElementTree
|
||||
# ElementTree._namespace_map.update({'http://www.opengis.net/wms': 'wms',
|
||||
|
@ -208,7 +213,7 @@ class WMSBaseServiceHandler(BaseServiceHandler):
|
|||
try:
|
||||
layer = maplayers[layername]
|
||||
except KeyError:
|
||||
raise OGCException('Layer not defined: %s.' % layername, 'LayerNotDefined')
|
||||
raise OGCException('Layer "%s" not defined.' % layername, 'LayerNotDefined')
|
||||
for stylename in layer.styles:
|
||||
if stylename in mapstyles.keys():
|
||||
m.append_style(stylename, mapstyles[stylename])
|
||||
|
@ -222,5 +227,46 @@ class WMSBaseServiceHandler(BaseServiceHandler):
|
|||
fh = StringIO()
|
||||
im2.save(fh, PIL_TYPE_MAPPING[params['format']])
|
||||
fh.seek(0)
|
||||
response = Response(params['format'], fh.read())
|
||||
return response
|
||||
return Response(params['format'], fh.read())
|
||||
|
||||
class BaseExceptionHandler:
|
||||
|
||||
def __init__(self, debug):
|
||||
self.debug = debug
|
||||
|
||||
def getresponse(self, params):
|
||||
code = ''
|
||||
message = ''
|
||||
excinfo = exc_info()
|
||||
if self.debug:
|
||||
fh = StringIO()
|
||||
print_tb(excinfo[2], None, fh)
|
||||
fh.seek(0)
|
||||
message = '\n' + fh.read() + '\n' + str(excinfo[0]) + ': ' + ', '.join(excinfo[1].args) + '\n'
|
||||
fh.close()
|
||||
elif len(excinfo[1].args) > 0:
|
||||
message = excinfo[1].args[0]
|
||||
if isinstance(excinfo[1], OGCException) and len(excinfo[1].args) > 1:
|
||||
code = excinfo[1].args[1]
|
||||
exceptions = params.get('exceptions', None)
|
||||
if not exceptions:
|
||||
exceptions = self.defaulthandler
|
||||
return self.handlers[exceptions](self, code, message, params)
|
||||
|
||||
def xmlhandler(self, code, message, params):
|
||||
ogcexcetree = deepcopy(self.xmltemplate)
|
||||
e = ogcexcetree.find(self.xpath)
|
||||
e.text = message
|
||||
if code:
|
||||
e.set('code', code)
|
||||
return Response(self.xmlmimetype, ElementTree.tostring(ogcexcetree))
|
||||
|
||||
def inimagehandler(self, code, message, params):
|
||||
im = new('L', (int(params['width']), int(params['height'])))
|
||||
draw = Draw(im)
|
||||
for count, line in enumerate(message.strip().split('\n')):
|
||||
draw.text((12,15*(count+1)), line, fill='#FFFFFF')
|
||||
fh = StringIO()
|
||||
im.save(fh, PIL_TYPE_MAPPING[params['format']])
|
||||
fh.seek(0)
|
||||
return Response(params['format'], fh.read())
|
|
@ -19,34 +19,8 @@
|
|||
#
|
||||
# $Id$
|
||||
|
||||
from copy import deepcopy
|
||||
from lxml import etree as ElementTree
|
||||
from StringIO import StringIO
|
||||
from traceback import print_tb
|
||||
from sys import exc_info
|
||||
|
||||
class OGCException(Exception):
|
||||
pass
|
||||
|
||||
class ServerConfigurationError(Exception):
|
||||
pass
|
||||
|
||||
class BaseExceptionHandler:
|
||||
|
||||
def __init__(self, debug):
|
||||
self.debug = debug
|
||||
|
||||
def getcontent(self):
|
||||
excinfo = exc_info()
|
||||
ogcexcetree = deepcopy(self.xmltemplate)
|
||||
e = ogcexcetree.find(self.xpath)
|
||||
if self.debug:
|
||||
fh = StringIO()
|
||||
print_tb(excinfo[2], None, fh)
|
||||
fh.seek(0)
|
||||
e.text = '\n' + fh.read() + '\n' + str(excinfo[0]) + ': ' + ', '.join(excinfo[1].args) + '\n'
|
||||
elif len(excinfo[1].args) > 0:
|
||||
e.text = excinfo[1].args[0]
|
||||
if isinstance(excinfo[1], OGCException) and len(excinfo[1].args) > 1:
|
||||
e.set('code', excinfo[1].args[1])
|
||||
return ElementTree.tostring(ogcexcetree)
|
||||
pass
|
|
@ -20,8 +20,9 @@
|
|||
# $Id$
|
||||
|
||||
from common import ParameterDefinition, Response, Version, ListFactory, \
|
||||
ColorFactory, CRSFactory, WMSBaseServiceHandler, CRS
|
||||
from exceptions import OGCException, ServerConfigurationError, BaseExceptionHandler
|
||||
ColorFactory, CRSFactory, WMSBaseServiceHandler, CRS, \
|
||||
BaseExceptionHandler
|
||||
from exceptions import OGCException, ServerConfigurationError
|
||||
from lxml import etree as ElementTree
|
||||
|
||||
class ServiceHandler(WMSBaseServiceHandler):
|
||||
|
@ -38,10 +39,10 @@ class ServiceHandler(WMSBaseServiceHandler):
|
|||
'bbox': ParameterDefinition(True, ListFactory(float)),
|
||||
'width': ParameterDefinition(True, int),
|
||||
'height': ParameterDefinition(True, int),
|
||||
'format': ParameterDefinition(True, str, allowedvalues=('image/png','image/jpeg','image/gif')),
|
||||
'transparent': ParameterDefinition(False, str, 'FALSE', ('TRUE','FALSE')),
|
||||
'format': ParameterDefinition(True, str, allowedvalues=('image/png', 'image/jpeg', 'image/gif')),
|
||||
'transparent': ParameterDefinition(False, str, 'FALSE', ('TRUE', 'FALSE')),
|
||||
'bgcolor': ParameterDefinition(False, ColorFactory, ColorFactory('0xFFFFFF')),
|
||||
'exceptions': ParameterDefinition(False, str, 'application/vnd.ogc.se_xml', ('application/vnd.ogc.se_xml',))
|
||||
'exceptions': ParameterDefinition(False, str, 'application/vnd.ogc.se_xml', ('application/vnd.ogc.se_xml', 'application/vnd.ogc.se_inimage'))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -92,6 +93,7 @@ class ServiceHandler(WMSBaseServiceHandler):
|
|||
</Request>
|
||||
<Exception>
|
||||
<Format>application/vnd.ogc.se_xml</Format>
|
||||
<Format>application/vnd.ogc.se_inimage</Format>
|
||||
</Exception>
|
||||
<Layer>
|
||||
<Title>A Mapnik WMS Server</Title>
|
||||
|
@ -179,7 +181,7 @@ class ServiceHandler(WMSBaseServiceHandler):
|
|||
|
||||
class ExceptionHandler(BaseExceptionHandler):
|
||||
|
||||
mimetype = "application/vnd.ogc.se_xml"
|
||||
xmlmimetype = "application/vnd.ogc.se_xml"
|
||||
|
||||
xmltemplate = ElementTree.fromstring("""<?xml version='1.0' encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE ServiceExceptionReport SYSTEM "http://www.digitalearth.gov/wmt/xml/exception_1_1_1.dtd">
|
||||
|
@ -188,4 +190,9 @@ class ExceptionHandler(BaseExceptionHandler):
|
|||
</ServiceExceptionReport>
|
||||
""")
|
||||
|
||||
xpath = 'ServiceException'
|
||||
xpath = 'ServiceException'
|
||||
|
||||
handlers = {'application/vnd.ogc.se_xml': BaseExceptionHandler.xmlhandler,
|
||||
'application/vnd.ogc.se_inimage': BaseExceptionHandler.inimagehandler}
|
||||
|
||||
defaulthandler = 'application/vnd.ogc.se_xml'
|
|
@ -20,8 +20,9 @@
|
|||
# $Id$
|
||||
|
||||
from common import ParameterDefinition, Response, Version, ListFactory, \
|
||||
ColorFactory, CRSFactory, CRS, WMSBaseServiceHandler
|
||||
from exceptions import OGCException, ServerConfigurationError, BaseExceptionHandler
|
||||
ColorFactory, CRSFactory, CRS, WMSBaseServiceHandler, \
|
||||
BaseExceptionHandler
|
||||
from exceptions import OGCException, ServerConfigurationError
|
||||
from lxml import etree as ElementTree
|
||||
|
||||
class ServiceHandler(WMSBaseServiceHandler):
|
||||
|
@ -39,10 +40,10 @@ class ServiceHandler(WMSBaseServiceHandler):
|
|||
'bbox': ParameterDefinition(True, ListFactory(float)),
|
||||
'width': ParameterDefinition(True, int),
|
||||
'height': ParameterDefinition(True, int),
|
||||
'format': ParameterDefinition(True, str, allowedvalues=('image/gif','image/png','image/jpeg')),
|
||||
'transparent': ParameterDefinition(False, str, 'FALSE', ('TRUE','FALSE')),
|
||||
'format': ParameterDefinition(True, str, allowedvalues=('image/gif','image/png', 'image/jpeg')),
|
||||
'transparent': ParameterDefinition(False, str, 'FALSE', ('TRUE', 'FALSE')),
|
||||
'bgcolor': ParameterDefinition(False, ColorFactory, ColorFactory('0xFFFFFF')),
|
||||
'exceptions': ParameterDefinition(False, str, 'XML', ('XML',)),
|
||||
'exceptions': ParameterDefinition(False, str, 'XML', ('XML', 'INIMAGE')),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -98,6 +99,7 @@ class ServiceHandler(WMSBaseServiceHandler):
|
|||
</Request>
|
||||
<Exception>
|
||||
<Format>XML</Format>
|
||||
<Format>INIMAGE</Format>
|
||||
</Exception>
|
||||
<Layer>
|
||||
<Title>A Mapnik WMS Server</Title>
|
||||
|
@ -196,7 +198,7 @@ class ServiceHandler(WMSBaseServiceHandler):
|
|||
|
||||
class ExceptionHandler(BaseExceptionHandler):
|
||||
|
||||
mimetype = "text/xml"
|
||||
xmlmimetype = "text/xml"
|
||||
|
||||
xmltemplate = ElementTree.fromstring("""<?xml version='1.0' encoding="UTF-8"?>
|
||||
<ServiceExceptionReport version="1.3.0"
|
||||
|
@ -207,4 +209,9 @@ class ExceptionHandler(BaseExceptionHandler):
|
|||
</ServiceExceptionReport>
|
||||
""")
|
||||
|
||||
xpath = '{http://www.opengis.net/ogc}ServiceException'
|
||||
xpath = '{http://www.opengis.net/ogc}ServiceException'
|
||||
|
||||
handlers = {'XML': BaseExceptionHandler.xmlhandler,
|
||||
'INIMAGE': BaseExceptionHandler.inimagehandler}
|
||||
|
||||
defaulthandler = 'XML'
|
Loading…
Reference in a new issue