def process(self): """ TODO: parsing request 0. Traslate params to canonic form 1. Is it a WMS? (SERVICE=WMS, VERSION=1.x) 2. Check type (REQUEST=GetMap etc) 3. Create an appropriate handler. 4. Handler gets data from database and remote servers. """ try: parsed = urlparse.urlparse(self.uri) qs = Wms.wmsParseQuery(parsed[4]) layerset = qs['SET'] # TODO: parse URL instead if self.ensureWms(qs): reqtype = qs['REQUEST'].upper() if reqtype == 'GETCAPABILITIES': return self.handleGetCapabilities(qs) elif reqtype == 'GETMAP': return self.handleGetMap(qs) elif reqtype == 'GETFEATUREINFO': return self.handleGetFeatureInfo(qs) else: self.reportWmsError("Sorry, not implemented yet.", "NotImplemented") else: self.reportWmsError("Invalid WMS request", "InvalidRequest") except Exception as ex: self.reportWmsError("Internal error: %s %s" % (type(ex), ex), "InternalError")
def connectionMade(self): # s.f.remote is either path or full url if it is proxy connection parsed = urlparse.urlparse(self.factory.remote) self._params = self.factory.params.copy() del self._params['SET'] host = parsed.netloc # hostname:port login = self.factory.login password = self.factory.password parsed_list = list(parsed) # TODO: this should be handled carefully: we have to merge remote's # params, not overwrite parsed_list[4] = Wms.wmsBuildQuery(self._params) self.sendCommand('GET', urlparse.urlunparse(parsed_list)) self.sendHeader('Host', host) self.sendHeader('User-Agent', SERVER_AGENT) if login and password: b64str = base64.encodestring(login+':'+password)[:-1] self.sendHeader('Authorization', 'Basic ' + b64str) self.endHeaders() self.factory.connectionMade()
def reportWmsError(self, errorMessage, code): xml = Wms.wmsErrorXmlString(errorMessage, code) self.setHeader('Content-type', 'application/vnd.ogc.se_xml') self.setHeader('Length', str(len(xml))) self.write(xml) self.finish()