コード例 #1
0
ファイル: mapnik.py プロジェクト: LKajan/mapproxy
    def _render_mapfile(self, mapfile, query):
        start_time = time.time()

        m = self.map_obj(mapfile)
        m.resize(query.size[0], query.size[1])
        m.srs = '+init=%s' % str(query.srs.srs_code.lower())
        envelope = mapnik.Box2d(*query.bbox)
        m.zoom_to_box(envelope)
        data = None

        try:
            if self.layers:
                i = 0
                for layer in m.layers[:]:
                    if layer.name != 'Unkown' and layer.name not in self.layers:
                        del m.layers[i]
                    else:
                        i += 1

            img = mapnik.Image(query.size[0], query.size[1])
            if self.scale_factor:
                mapnik.render(m, img, self.scale_factor)
            else:
                mapnik.render(m, img)
            data = img.tostring(str(query.format))
        finally:
            size = None
            if data:
                size = len(data)
            log_request('%s:%s:%s:%s' % (mapfile, query.bbox, query.srs.srs_code, query.size),
                status='200' if data else '500', size=size, method='API', duration=time.time()-start_time)

        return ImageSource(BytesIO(data), size=query.size,
            image_opts=ImageOptions(format=query.format))
コード例 #2
0
    def _render_mapfile(self, mapfile, query):
        start_time = time.time()

        m = self.map_obj(mapfile)
        m.resize(query.size[0], query.size[1])
        m.srs = '+init=%s' % str(query.srs.srs_code.lower())
        envelope = mapnik.Box2d(*query.bbox)
        m.zoom_to_box(envelope)
        data = None

        try:
            if self.layers:
                i = 0
                for layer in m.layers[:]:
                    if layer.name != 'Unkown' and layer.name not in self.layers:
                        del m.layers[i]
                    else:
                        i += 1

            img = mapnik.Image(query.size[0], query.size[1])
            mapnik.render(m, img)
            data = img.tostring(str(query.format))
        finally:
            size = None
            if data:
                size = len(data)
            log_request('%s:%s:%s:%s' % (mapfile, query.bbox, query.srs.srs_code, query.size),
                status='200' if data else '500', size=size, method='API', duration=time.time()-start_time)

        return ImageSource(BytesIO(data), size=query.size,
            image_opts=ImageOptions(transparent=self.transparent, format=query.format))
コード例 #3
0
ファイル: mapnik.py プロジェクト: ChrisRenton/mapproxy
    def _render_mapfile(self, mapfile, query):
        start_time = time.time()
        data = None
        try:
            m = self.mapnik.Map(query.size[0], query.size[1])
            self.mapnik.load_map(m, str(mapfile))
            m.srs = '+init=%s' % str(query.srs.srs_code.lower())
            envelope = self.mapnik.Envelope(*query.bbox)
            m.zoom_to_box(envelope)

            if self.layers:
                i = 0
                for layer in m.layers[:]:
                    if layer.name != 'Unkown' and layer.name not in self.layers:
                        del m.layers[i]
                    else:
                        i += 1

            img = self.mapnik.Image(query.size[0], query.size[1])
            self.mapnik.render(m, img)
            data = img.tostring(str(query.format))
        finally:
            size = None
            if data:
                size = len(data)
            log_request('%s:%s:%s:%s' % (mapfile, query.bbox, query.srs.srs_code, query.size),
                status='200' if data else '500', size=size, method='API', duration=time.time()-start_time)

        return ImageSource(StringIO(data), size=query.size,
            image_opts=ImageOptions(transparent=self.transparent, format=query.format))
コード例 #4
0
ファイル: cgi.py プロジェクト: mo-tucker/mapproxy
    def open(self, url, data=None):
        assert data is None, 'POST requests not supported by CGIClient'

        parsed_url = urlparse.urlparse(url)
        environ = os.environ.copy()
        environ.update({
            'QUERY_STRING': parsed_url.query,
            'REQUEST_METHOD': 'GET',
            'GATEWAY_INTERFACE': 'CGI/1.1',
            'SERVER_ADDR': '127.0.0.1',
            'SERVER_NAME': 'localhost',
            'SERVER_PROTOCOL': 'HTTP/1.0',
            'SERVER_SOFTWARE': 'MapProxy',
        })

        start_time = time.time()
        try:
            p = subprocess.Popen([self.script],
                                 env=environ,
                                 stdout=subprocess.PIPE,
                                 cwd=self.working_directory
                                 or os.path.dirname(self.script))
        except OSError as ex:
            if ex.errno == errno.ENOENT:
                raise SourceError('CGI script not found (%s)' %
                                  (self.script, ))
            elif ex.errno == errno.EACCES:
                raise SourceError('No permission for CGI script (%s)' %
                                  (self.script, ))
            else:
                raise

        stdout = p.communicate()[0]
        ret = p.wait()
        if ret != 0:
            raise HTTPClientError('Error during CGI call (exit code: %d)' %
                                  (ret, ))

        if self.no_headers:
            content = stdout
            headers = dict()
        else:
            headers, content = split_cgi_response(stdout)

        status_match = re.match('(\d\d\d) ', headers.get('Status', ''))
        if status_match:
            status_code = status_match.group(1)
        else:
            status_code = '-'
        size = len(content)
        content = IOwithHeaders(BytesIO(content), headers)

        log_request('%s:%s' % (self.script, parsed_url.query),
                    status_code,
                    size=size,
                    method='CGI',
                    duration=time.time() - start_time)
        return content
コード例 #5
0
 def open(self, url, data=None):
     code = None
     result = None
     try:
         req = urllib2.Request(url, data=data)
     except ValueError as e:
         err = self.handle_url_exception(url, 'URL not correct', e.args[0])
         reraise_exception(err, sys.exc_info())
     for key, value in self.header_list:
         req.add_header(key, value)
     try:
         start_time = time.time()
         if self._timeout is not None:
             result = self.opener.open(req, timeout=self._timeout)
         else:
             result = self.opener.open(req)
     except HTTPError as e:
         code = e.code
         err = self.handle_url_exception(url,
                                         'HTTP Error',
                                         str(code),
                                         response_code=code)
         reraise_exception(err, sys.exc_info())
     except URLError as e:
         if isinstance(e.reason, ssl.SSLError):
             err = self.handle_url_exception(
                 url, 'Could not verify connection to URL',
                 e.reason.args[1])
             reraise_exception(err, sys.exc_info())
         try:
             reason = e.reason.args[1]
         except (AttributeError, IndexError):
             reason = e.reason
         err = self.handle_url_exception(url, 'No response from URL',
                                         reason)
         reraise_exception(err, sys.exc_info())
     except ValueError as e:
         err = self.handle_url_exception(url, 'URL not correct', e.args[0])
         reraise_exception(err, sys.exc_info())
     except Exception as e:
         err = self.handle_url_exception(url, 'Internal HTTP error',
                                         repr(e))
         reraise_exception(err, sys.exc_info())
     else:
         code = getattr(result, 'code', 200)
         if code == 204:
             raise HTTPClientError('HTTP Error "204 No Content"',
                                   response_code=204)
         return result
     finally:
         log_request(url,
                     code,
                     result,
                     duration=time.time() - start_time,
                     method=req.get_method())
コード例 #6
0
ファイル: cgi.py プロジェクト: GeoDodo/mapproxy
    def open(self, url, data=None):
        assert data is None, 'POST requests not supported by CGIClient'

        parsed_url = urlparse.urlparse(url)
        environ = os.environ.copy()
        environ.update({
            'QUERY_STRING': parsed_url.query,
            'REQUEST_METHOD': 'GET',
            'GATEWAY_INTERFACE': 'CGI/1.1',
            'SERVER_ADDR': '127.0.0.1',
            'SERVER_NAME': 'localhost',
            'SERVER_PROTOCOL': 'HTTP/1.0',
            'SERVER_SOFTWARE': 'MapProxy',
        })

        start_time = time.time()
        try:
            p = subprocess.Popen([self.script], env=environ,
                stdout=subprocess.PIPE,
                cwd=self.working_directory or os.path.dirname(self.script)
            )
        except OSError as ex:
            if ex.errno == errno.ENOENT:
                raise SourceError('CGI script not found (%s)' % (self.script,))
            elif ex.errno == errno.EACCES:
                raise SourceError('No permission for CGI script (%s)' % (self.script,))
            else:
                raise

        stdout = p.communicate()[0]
        ret = p.wait()
        if ret != 0:
            raise HTTPClientError('Error during CGI call (exit code: %d)'
                                              % (ret, ))

        if self.no_headers:
            content = stdout
            headers = dict()
        else:
            headers, content = split_cgi_response(stdout)

        status_match = re.match('(\d\d\d) ', headers.get('Status', ''))
        if status_match:
            status_code = status_match.group(1)
        else:
            status_code = '-'
        size = len(content)
        content = IOwithHeaders(BytesIO(content), headers)

        log_request('%s:%s' % (self.script, parsed_url.query),
            status_code, size=size, method='CGI', duration=time.time()-start_time)
        return content
コード例 #7
0
ファイル: renderd.py プロジェクト: Anderson0026/mapproxy
    def _create_renderd_tile(self, tile_coord):
        start_time = time.time()
        result = self._send_tile_request(self.tile_mgr.identifier, [tile_coord])
        duration = time.time()-start_time

        address = '%s:%s:%r' % (self.renderd_address,
            self.tile_mgr.identifier, tile_coord)

        if result['status'] == 'error':
            log_request(address, 500, None, duration=duration, method='RENDERD')
            raise SourceError("Error from renderd: %s" % result.get('error_message', 'unknown error from renderd'))

        log_request(address, 200, None, duration=duration, method='RENDERD')
コード例 #8
0
ファイル: http.py プロジェクト: LKajan/mapproxy
 def open(self, url, data=None):
     code = None
     result = None
     try:
         req = urllib2.Request(url, data=data)
     except ValueError as e:
         reraise_exception(HTTPClientError('URL not correct "%s": %s'
                                           % (url, e.args[0])), sys.exc_info())
     for key, value in self.header_list:
         req.add_header(key, value)
     try:
         start_time = time.time()
         if self._timeout is not None:
             result = self.opener.open(req, timeout=self._timeout)
         else:
             result = self.opener.open(req)
     except HTTPError as e:
         code = e.code
         reraise_exception(HTTPClientError('HTTP Error "%s": %d'
             % (url, e.code), response_code=code), sys.exc_info())
     except URLError as e:
         if isinstance(e.reason, ssl.SSLError):
             e = HTTPClientError('Could not verify connection to URL "%s": %s'
                                  % (url, e.reason.args[1]))
             reraise_exception(e, sys.exc_info())
         try:
             reason = e.reason.args[1]
         except (AttributeError, IndexError):
             reason = e.reason
         reraise_exception(HTTPClientError('No response from URL "%s": %s'
                                           % (url, reason)), sys.exc_info())
     except ValueError as e:
         reraise_exception(HTTPClientError('URL not correct "%s": %s'
                                           % (url, e.args[0])), sys.exc_info())
     except Exception as e:
         reraise_exception(HTTPClientError('Internal HTTP error "%s": %r'
                                           % (url, e)), sys.exc_info())
     else:
         code = getattr(result, 'code', 200)
         if code == 204:
             raise HTTPClientError('HTTP Error "204 No Content"', response_code=204)
         return result
     finally:
         log_request(url, code, result, duration=time.time()-start_time, method=req.get_method())
コード例 #9
0
    def _create_renderd_tile(self, tile_coord):
        start_time = time.time()
        result = self._send_tile_request(self.tile_mgr.identifier,
                                         [tile_coord])
        duration = time.time() - start_time

        address = '%s:%s:%r' % (self.renderd_address, self.tile_mgr.identifier,
                                tile_coord)

        if result['status'] == 'error':
            log_request(address,
                        500,
                        None,
                        duration=duration,
                        method='RENDERD')
            raise SourceError(
                "Error from renderd: %s" %
                result.get('error_message', 'unknown error from renderd'))

        log_request(address, 200, None, duration=duration, method='RENDERD')
コード例 #10
0
                HTTPClientError('URL not correct "%s": %s' % (url, e.args[0])),
                sys.exc_info())
        except Exception, e:
            reraise_exception(
                HTTPClientError('Internal HTTP error "%s": %r' % (url, e)),
                sys.exc_info())
        else:
            code = getattr(result, 'code', 200)
            if code == 204:
                raise HTTPClientError('HTTP Error "204 No Content"',
                                      response_code=204)
            return result
        finally:
            log_request(url,
                        code,
                        result,
                        duration=time.time() - start_time,
                        method=req.get_method())

    def open_image(self, url, data=None):
        resp = self.open(url, data=data)
        if 'content-type' in resp.headers:
            if not resp.headers['content-type'].lower().startswith('image'):
                raise HTTPClientError('response is not an image: (%s)' %
                                      (resp.read()))
        return ImageSource(resp)


def auth_data_from_url(url):
    """
    >>> auth_data_from_url('http://localhost/bar')
コード例 #11
0
ファイル: http.py プロジェクト: Anderson0026/mapproxy
                reason = e.reason
            reraise_exception(HTTPClientError('No response from URL "%s": %s'
                                              % (url, reason)), sys.exc_info())
        except ValueError, e:
            reraise_exception(HTTPClientError('URL not correct "%s": %s'
                                              % (url, e.args[0])), sys.exc_info())
        except Exception, e:
            reraise_exception(HTTPClientError('Internal HTTP error "%s": %r'
                                              % (url, e)), sys.exc_info())
        else:
            code = getattr(result, 'code', 200)
            if code == 204:
                raise HTTPClientError('HTTP Error "204 No Content"', response_code=204)
            return result
        finally:
            log_request(url, code, result, duration=time.time()-start_time, method=req.get_method())

    def open_image(self, url, data=None):
        resp = self.open(url, data=data)
        if 'content-type' in resp.headers:
            if not resp.headers['content-type'].lower().startswith('image'):
                raise HTTPClientError('response is not an image: (%s)' % (resp.read()))
        return ImageSource(resp)

def auth_data_from_url(url):
    """
    >>> auth_data_from_url('http://localhost/bar')
    ('http://localhost/bar', (None, None))
    >>> auth_data_from_url('http://bar@localhost/bar')
    ('http://localhost/bar', ('bar', None))
    >>> auth_data_from_url('http://*****:*****@localhost/bar')