[Server 3.0] Tests reliability + new auth test

- Local server searches for a free port before binding
- Server tests now ignore attributes order
- Updated reference docs
- Renamed projects ("+" -> "_")
- Added a smoke test for auth manager and WMS/WFS providers
This commit is contained in:
Alessandro Pasotti 2016-09-29 11:47:32 +02:00
parent a50ce7d4fd
commit 49ae0206f4
12 changed files with 495 additions and 206 deletions

View File

@ -150,4 +150,5 @@ IF (WITH_SERVER)
ADD_PYTHON_TEST(PyQgsServerAccessControl test_qgsserver_accesscontrol.py)
ADD_PYTHON_TEST(PyQgsServerWFST test_qgsserver_wfst.py)
ADD_PYTHON_TEST(PyQgsOfflineEditingWFS test_offline_editing_wfs.py)
ADD_PYTHON_TEST(PyQgsAuthManagerEnpointTest test_authmanager_endpoint.py)
ENDIF (WITH_SERVER)

View File

@ -5,6 +5,13 @@ QGIS Server HTTP wrapper
This script launches a QGIS Server listening on port 8081 or on the port
specified on the environment variable QGIS_SERVER_DEFAULT_PORT
For testing purposes, HTTP Basic can be enabled by setting the following
environment variables:
* QGIS_SERVER_HTTP_BASIC_AUTH (default not set, set to anything to enable)
* QGIS_SERVER_USERNAME (default ="username")
* QGIS_SERVER_PASSWORD (default ="password")
.. note:: This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
@ -22,6 +29,8 @@ __revision__ = '$Format:%H$'
import os
import sys
import signal
import urllib.parse
from http.server import BaseHTTPRequestHandler, HTTPServer
from qgis.core import QgsApplication
@ -36,11 +45,35 @@ qgs_app = QgsApplication([], False)
qgs_server = QgsServer()
if os.environ.get('QGIS_SERVER_HTTP_BASIC_AUTH') is not None:
from qgis.server import QgsServerFilter
import base64
class HTTPBasicFilter(QgsServerFilter):
def responseComplete(self):
request = self.serverInterface().requestHandler()
if self.serverInterface().getEnv('HTTP_AUTHORIZATION'):
username, password = base64.b64decode(self.serverInterface().getEnv('HTTP_AUTHORIZATION')[6:]).split(b':')
if (username.decode('utf-8') == os.environ.get('QGIS_SERVER_USERNAME', 'username')
and password.decode('utf-8') == os.environ.get('QGIS_SERVER_PASSWORD', 'password')):
return
# No auth ...
request.clearHeaders()
request.setHeader('Status', '401 Authorization required')
request.setHeader('WWW-Authenticate', 'Basic realm="QGIS Server"')
request.clearBody()
request.appendBody(b'<h1>Authorization required</h1>')
filter = HTTPBasicFilter(qgs_server.serverInterface())
qgs_server.serverInterface().registerFilter(filter)
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
# CGI vars:
for k, v in list(self.headers.items()):
for k, v in self.headers.items():
qgs_server.putenv('HTTP_%s' % k.replace(' ', '-').replace('-', '_').replace(' ', '-').upper(), v)
qgs_server.putenv('SERVER_PORT', str(self.server.server_port))
qgs_server.putenv('SERVER_NAME', self.server.server_name)
@ -52,7 +85,7 @@ class Handler(BaseHTTPRequestHandler):
self.send_response(int(headers_dict['Status'].split(' ')[0]))
except:
self.send_response(200)
for k, v in list(headers_dict.items()):
for k, v in headers_dict.items():
self.send_header(k, v)
self.end_headers()
self.wfile.write(body)
@ -71,5 +104,12 @@ if __name__ == '__main__':
server = HTTPServer(('localhost', QGIS_SERVER_DEFAULT_PORT), Handler)
print('Starting server on localhost:%s, use <Ctrl-C> to stop' %
QGIS_SERVER_DEFAULT_PORT)
def signal_handler(signal, frame):
global qgs_app
print("\nExiting QGIS...")
qgs_app.exitQgis()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
server.serve_forever()
qgs_app.exitQgis()

View File

@ -0,0 +1,180 @@
# -*- coding: utf-8 -*-
"""
Tests for auth manager WMS/WFS using QGIS Server through HTTP Basic
enabled qgis_wrapped_server.py.
This is an integration test for QGIS Desktop Auth Manager WFS and WMS provider
and QGIS Server WFS/WMS that check if QGIS can use a stored auth manager auth
configuration to access an HTTP Basic protected endpoint.
From build dir, run: ctest -R PyQgsAuthManagerEnpointTest -V
.. note:: This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
"""
import os
import sys
import subprocess
import tempfile
import random
import string
import urllib
__author__ = 'Alessandro Pasotti'
__date__ = '18/09/2016'
__copyright__ = 'Copyright 2016, The QGIS Project'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'
from time import sleep
from urllib.parse import quote
from shutil import rmtree
from utilities import unitTestDataPath
from qgis.core import (
QgsAuthManager,
QgsAuthMethodConfig,
QgsVectorLayer,
QgsRasterLayer,
)
from qgis.testing import (
start_app,
unittest,
)
try:
QGIS_SERVER_AUTHMANAGER_DEFAULT_PORT = os.environ['QGIS_SERVER_AUTHMANAGER_DEFAULT_PORT']
except:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 0))
QGIS_SERVER_AUTHMANAGER_DEFAULT_PORT = s.getsockname()[1]
s.close()
QGIS_AUTH_DB_DIR_PATH = tempfile.mkdtemp()
os.environ['QGIS_AUTH_DB_DIR_PATH'] = QGIS_AUTH_DB_DIR_PATH
qgis_app = start_app()
class TestAuthManager(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""Run before all tests:
Creates an auth configuration"""
cls.port = QGIS_SERVER_AUTHMANAGER_DEFAULT_PORT
# Clean env just to be sure
env_vars = ['QUERY_STRING', 'QGIS_PROJECT_FILE']
for ev in env_vars:
try:
del os.environ[ev]
except KeyError:
pass
cls.testdata_path = unitTestDataPath('qgis_server') + '/'
cls.project_path = quote(cls.testdata_path + "test_project.qgs")
# Enable auth
#os.environ['QGIS_AUTH_PASSWORD_FILE'] = QGIS_AUTH_PASSWORD_FILE
authm = QgsAuthManager.instance()
assert (authm.setMasterPassword('masterpassword', True))
cls.auth_config = QgsAuthMethodConfig('Basic')
cls.auth_config.setName('test_auth_config')
cls.username = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(6))
cls.password = cls.username[::-1] # reversed
cls.auth_config.setConfig('username', cls.username)
cls.auth_config.setConfig('password', cls.password)
assert (authm.storeAuthenticationConfig(cls.auth_config)[0])
os.environ['QGIS_SERVER_HTTP_BASIC_AUTH'] = '1'
os.environ['QGIS_SERVER_USERNAME'] = cls.username
os.environ['QGIS_SERVER_PASSWORD'] = cls.password
os.environ['QGIS_SERVER_DEFAULT_PORT'] = str(cls.port)
server_path = os.path.dirname(os.path.realpath(__file__)) + \
'/qgis_wrapped_server.py'
cls.server = subprocess.Popen([sys.executable, server_path],
env=os.environ)
sleep(2)
@classmethod
def tearDownClass(cls):
"""Run after all tests"""
cls.server.terminate()
rmtree(QGIS_AUTH_DB_DIR_PATH)
del cls.server
def setUp(self):
"""Run before each test."""
pass
def tearDown(self):
"""Run after each test."""
pass
@classmethod
def _getWFSLayer(cls, type_name, layer_name=None, authcfg=None):
"""
WFS layer factory
"""
if layer_name is None:
layer_name = 'wfs_' + type_name
parms = {
'srsname': 'EPSG:4326',
'typename': type_name,
'url': 'http://127.0.0.1:%s/?map=%s' % (cls.port, cls.project_path),
'version': 'auto',
'table': '',
}
if authcfg is not None:
parms.update({'authcfg': authcfg})
uri = ' '.join([("%s='%s'" % (k, v)) for k, v in list(parms.items())])
wfs_layer = QgsVectorLayer(uri, layer_name, 'WFS')
return wfs_layer
@classmethod
def _getWMSLayer(cls, layers, layer_name=None, authcfg=None):
"""
WMS layer factory
"""
if layer_name is None:
layer_name = 'wms_' + layers.replace(',', '')
parms = {
'crs': 'EPSG:4326',
'url': 'http://127.0.0.1:%s/?map=%s' % (cls.port, cls.project_path),
'format': 'image/png',
# This is needed because of a really wierd implementation in QGIS Server, that
# replaces _ in the the real layer name with spaces
'layers': urllib.parse.quote(layers).replace('_', ' '),
'styles': '',
#'sql': '',
}
if authcfg is not None:
parms.update({'authcfg': authcfg})
uri = '&'.join([("%s=%s" % (k, v.replace('=', '%3D'))) for k, v in list(parms.items())])
wms_layer = QgsRasterLayer(uri, layer_name, 'wms')
return wms_layer
def testValidAuthAccess(self):
"""
Access the HTTP Basic protected layer with valid credentials
"""
wfs_layer = self._getWFSLayer('testlayer_èé', authcfg=self.auth_config.id())
self.assertTrue(wfs_layer.isValid())
wms_layer = self._getWMSLayer('testlayer_èé', authcfg=self.auth_config.id())
self.assertTrue(wms_layer.isValid())
def testInvalidAuthAccess(self):
"""
Access the HTTP Basic protected layer with no credentials
"""
wfs_layer = self._getWFSLayer('testlayer_èé')
self.assertFalse(wfs_layer.isValid())
wms_layer = self._getWMSLayer('testlayer_èé')
self.assertFalse(wms_layer.isValid())
if __name__ == '__main__':
unittest.main()

View File

@ -45,10 +45,15 @@ from qgis.testing import (
from offlineditingtestbase import OfflineTestBase
try:
QGIS_SERVER_WFST_DEFAULT_PORT = os.environ['QGIS_SERVER_WFST_DEFAULT_PORT']
except:
QGIS_SERVER_WFST_DEFAULT_PORT = 8081
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 0))
QGIS_SERVER_WFST_DEFAULT_PORT = s.getsockname()[1]
s.close()
qgis_app = start_app()

View File

@ -30,11 +30,37 @@ import osgeo.gdal
# Also strip all multi-attribute tags (Qt5 attr order is random)
# FIXME: this is a temporary workaround to make the test pass, a more
# robust implementation must check for attributes too
RE_STRIP_UNCHECKABLE = b'<LatLongBoundingBox [^>]*>|<sld:UserDefinedSymbolization [^>]*>|<Attribute [^>]*>|<Layer [^>]*>|MAP=[^"]+|Content-Length: \d+|<OnlineResource[^>]*>|<BoundingBox[^>]*>|<WMS_Capabilities[^>]*>|<WFS_Capabilities[^>]*>|<element[^>]*>|<schema [^>]*>|<import [^>]*>|<gml:coordinates [^>]*>'
#RE_STRIP_UNCHECKABLE = b'<LatLongBoundingBox [^>]*>|<sld:UserDefinedSymbolization [^>]*>|<Attribute [^>]*>|<Layer [^>]*>|MAP=[^"]+|Content-Length: \d+|<OnlineResource[^>]*>|<BoundingBox[^>]*>|<WMS_Capabilities[^>]*>|<WFS_Capabilities[^>]*>|<element[^>]*>|<schema [^>]*>|<import [^>]*>|<gml:coordinates [^>]*>'
RE_STRIP_UNCHECKABLE = b'MAP=[^"]+|Content-Length: \d+'
RE_ATTRIBUTES = b'[^>\s]+=[^>\s]+'
class TestQgsServer(unittest.TestCase):
def assertXMLEqual(self, response, expected, msg=''):
"""Compare XML line by line and sorted attributes"""
response_lines = response.splitlines()
expected_lines = expected.splitlines()
line_no = 1
for expected_line in expected_lines:
expected_line = expected_line.strip()
response_line = response_lines[line_no - 1].strip()
# Compare tag
try:
self.assertEqual(re.findall(b'<([^>\s]+)[ >]', expected_line)[0],
re.findall(b'<([^>\s]+)[ >]', response_line)[0], msg=msg + "\nTag mismatch on line %s: %s != %s" % (line_no, expected_line, response_line))
except IndexError:
self.assertEqual(expected_line, response_line, msg=msg + "\nTag line mismatch %s: %s != %s" % (line_no, expected_line, response_line))
#print("---->%s\t%s == %s" % (line_no, expected_line, response_line))
# Compare attributes
if re.match(RE_ATTRIBUTES, expected_line): # has attrs
expected_attrs = re.findall(RE_ATTRIBUTES, expected_line)
expected_attrs.sort()
response_attrs = re.findall(RE_ATTRIBUTES, response_line)
response_attrs.sort()
self.assertEqual(expected_attrs, response_attrs, msg=msg + "\nXML attributes differ at line {0}: {1} != {2}".format(line_no, expected_attrs, response_attrs))
line_no += 1
@classmethod
def setUpClass(cls):
cls.app = QgsApplication([], False)
@ -170,7 +196,7 @@ class TestQgsServer(unittest.TestCase):
# WMS tests
def wms_request_compare(self, request, extra=None, reference_file=None):
project = self.testdata_path + "test+project.qgs"
project = self.testdata_path + "test_project.qgs"
assert os.path.exists(project), "Project file not found: " + project
query_string = 'MAP=%s&SERVICE=WMS&VERSION=1.3&REQUEST=%s' % (urllib.parse.quote(project), request)
@ -202,7 +228,7 @@ class TestQgsServer(unittest.TestCase):
if int(osgeo.gdal.VersionInfo()[:1]) < 2:
expected = expected.replace(b'typeName="Integer64" precision="0" length="10" editType="TextEdit" type="qlonglong"', b'typeName="Integer" precision="0" length="10" editType="TextEdit" type="int"')
self.assertEqual(response, expected, msg="request %s failed.\n Query: %s\n Expected:\n%s\n\n Response:\n%s" % (query_string, request, expected.decode('utf-8'), response.decode('utf-8')))
self.assertXMLEqual(response, expected, msg="request %s failed.\n Query: %s\n Expected:\n%s\n\n Response:\n%s" % (query_string, request, expected.decode('utf-8'), response.decode('utf-8')))
def test_project_wms(self):
"""Test some WMS request"""
@ -239,7 +265,7 @@ class TestQgsServer(unittest.TestCase):
def wms_inspire_request_compare(self, request):
"""WMS INSPIRE tests"""
project = self.testdata_path + "test+project_inspire.qgs"
project = self.testdata_path + "test_project_inspire.qgs"
assert os.path.exists(project), "Project file not found: " + project
query_string = 'MAP=%s&SERVICE=WMS&VERSION=1.3.0&REQUEST=%s' % (urllib.parse.quote(project), request)
@ -259,7 +285,7 @@ class TestQgsServer(unittest.TestCase):
"""
response = re.sub(RE_STRIP_UNCHECKABLE, b'', response)
expected = re.sub(RE_STRIP_UNCHECKABLE, b'', expected)
self.assertEqual(response, expected, msg="request %s failed.\n Query: %s\n Expected:\n%s\n\n Response:\n%s" % (query_string, request, expected.decode('utf-8'), response.decode('utf-8')))
self.assertXMLEqual(response, expected, msg="request %s failed.\n Query: %s\n Expected:\n%s\n\n Response:\n%s" % (query_string, request, expected.decode('utf-8'), response.decode('utf-8')))
def test_project_wms_inspire(self):
"""Test some WMS request"""
@ -268,7 +294,7 @@ class TestQgsServer(unittest.TestCase):
# WFS tests
def wfs_request_compare(self, request):
project = self.testdata_path + "test+project_wfs.qgs"
project = self.testdata_path + "test_project_wfs.qgs"
assert os.path.exists(project), "Project file not found: " + project
query_string = 'MAP=%s&SERVICE=WFS&VERSION=1.0.0&REQUEST=%s' % (urllib.parse.quote(project), request)
@ -294,7 +320,7 @@ class TestQgsServer(unittest.TestCase):
if int(osgeo.gdal.VersionInfo()[:1]) < 2:
expected = expected.replace(b'<element type="long" name="id"/>', b'<element type="integer" name="id"/>')
self.assertEqual(response, expected, msg="request %s failed.\n Query: %s\n Expected:\n%s\n\n Response:\n%s" % (query_string, request, expected.decode('utf-8'), response.decode('utf-8')))
self.assertXMLEqual(response, expected, msg="request %s failed.\n Query: %s\n Expected:\n%s\n\n Response:\n%s" % (query_string, request, expected.decode('utf-8'), response.decode('utf-8')))
def test_project_wfs(self):
"""Test some WFS request"""
@ -302,7 +328,7 @@ class TestQgsServer(unittest.TestCase):
self.wfs_request_compare(request)
def wfs_getfeature_compare(self, requestid, request):
project = self.testdata_path + "test+project_wfs.qgs"
project = self.testdata_path + "test_project_wfs.qgs"
assert os.path.exists(project), "Project file not found: " + project
query_string = 'MAP=%s&SERVICE=WFS&VERSION=1.0.0&REQUEST=%s' % (urllib.parse.quote(project), request)
@ -333,8 +359,8 @@ class TestQgsServer(unittest.TestCase):
"""
response = re.sub(RE_STRIP_UNCHECKABLE, b'', response)
expected = re.sub(RE_STRIP_UNCHECKABLE, b'', expected)
self.assertEqual(response, expected, msg="%s\n Expected:\n%s\n\n Response:\n%s"
% (error_msg_header,
self.assertXMLEqual(response, expected, msg="%s\n Expected:\n%s\n\n Response:\n%s"
% (error_msg_header,
str(expected, errors='replace'),
str(response, errors='replace')))
@ -349,7 +375,7 @@ class TestQgsServer(unittest.TestCase):
self.wfs_getfeature_compare(id, req)
def wfs_getfeature_post_compare(self, requestid, request):
project = self.testdata_path + "test+project_wfs.qgs"
project = self.testdata_path + "test_project_wfs.qgs"
assert os.path.exists(project), "Project file not found: " + project
query_string = 'MAP={}'.format(urllib.parse.quote(project))
@ -365,7 +391,6 @@ class TestQgsServer(unittest.TestCase):
header, body,
)
@unittest.skip
def test_getfeature_post(self):
template = """<?xml version="1.0" encoding="UTF-8"?>
<wfs:GetFeature service="WFS" version="1.0.0" {} xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
@ -392,20 +417,20 @@ class TestQgsServer(unittest.TestCase):
for id, req in tests:
self.wfs_getfeature_post_compare(id, req)
@unittest.skip
def test_getLegendGraphics(self):
"""Test that does not return an exception but an image"""
parms = {
'MAP': self.testdata_path + "test%2Bproject.qgs",
'MAP': self.testdata_path + "test_project.qgs",
'SERVICE': 'WMS',
'VERSION': '1.0.0',
'VERSION': '1.3.0',
'REQUEST': 'GetLegendGraphic',
'FORMAT': 'image/png',
#'WIDTH': '20', # optional
#'HEIGHT': '20', # optional
'LAYER': 'testlayer+èé',
'LAYER': 'testlayer%20èé',
}
qs = '&'.join(["%s=%s" % (k, v) for k, v in parms.items()])
print(qs)
h, r = self.server.handleRequest(qs)
self.assertEqual(-1, h.find(b'Content-Type: text/xml; charset=utf-8'), "Header: %s\nResponse:\n%s" % (h, r))
self.assertNotEqual(-1, h.find(b'Content-Type: image/png'), "Header: %s\nResponse:\n%s" % (h, r))

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
"""
Tests for WFS-T provider using QGIS Server through qgis_wrapped_server.py.
@ -58,7 +59,11 @@ from qgis.testing import (
try:
QGIS_SERVER_WFST_DEFAULT_PORT = os.environ['QGIS_SERVER_WFST_DEFAULT_PORT']
except:
QGIS_SERVER_WFST_DEFAULT_PORT = 8081
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 0))
QGIS_SERVER_WFST_DEFAULT_PORT = s.getsockname()[1]
s.close()
qgis_app = start_app()

View File

@ -2,7 +2,7 @@ Content-Length: 5590
Content-Type: text/xml; charset=utf-8
<?xml version="1.0" encoding="utf-8"?>
<WMS_Capabilities xmlns:sld="http://www.opengis.net/sld" version="1.3" xmlns="http://www.opengis.net/wms" xmlns:qgs="http://www.qgis.org/wms" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd http://www.qgis.org/wms http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgsSERVICE=WMS&amp;REQUEST=GetSchemaExtension">
<WMS_Capabilities xmlns:sld="http://www.opengis.net/sld" version="1.3" xmlns="http://www.opengis.net/wms" xmlns:qgs="http://www.qgis.org/wms" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd http://www.qgis.org/wms http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgsSERVICE=WMS&amp;REQUEST=GetSchemaExtension">
<Service>
<Name>WMS</Name>
<Title>QGIS TestProject</Title>
@ -30,7 +30,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -45,7 +45,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -59,7 +59,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -70,7 +70,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -80,7 +80,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -90,7 +90,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -131,7 +131,7 @@ Content-Type: text/xml; charset=utf-8
<Title>default</Title>
<LegendURL>
<Format>image/png</Format>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs&amp;SERVICE=WMS&amp;VERSION=1.3&amp;REQUEST=GetLegendGraphic&amp;LAYER=testlayer èé&amp;FORMAT=image/png&amp;STYLE=default"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs&amp;SERVICE=WMS&amp;VERSION=1.3&amp;REQUEST=GetLegendGraphic&amp;LAYER=testlayer èé&amp;FORMAT=image/png&amp;STYLE=default"/>
</LegendURL>
</Style>
</Layer>

View File

@ -2,7 +2,7 @@ Content-Length: 7368
Content-Type: text/xml; charset=utf-8
<?xml version="1.0" encoding="utf-8"?>
<WMS_Capabilities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:inspire_vs="http://inspire.ec.europa.eu/schemas/inspire_vs/1.0" xmlns:inspire_common="http://inspire.ec.europa.eu/schemas/common/1.0" version="1.3.0" xmlns="http://www.opengis.net/wms" xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd http://www.qgis.org/wms http://inspire.ec.europa.eu/schemas/inspire_vs/1.0 http://inspire.ec.europa.eu/schemas/inspire_vs/1.0/inspire_vs.xsd http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test%2Bproject_inspire.qgs&amp;SERVICE=WMS&amp;REQUEST=GetSchemaExtension" xmlns:sld="http://www.opengis.net/sld" xmlns:qgs="http://www.qgis.org/wms">
<WMS_Capabilities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:inspire_vs="http://inspire.ec.europa.eu/schemas/inspire_vs/1.0" xmlns:inspire_common="http://inspire.ec.europa.eu/schemas/common/1.0" version="1.3.0" xmlns="http://www.opengis.net/wms" xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd http://www.qgis.org/wms http://inspire.ec.europa.eu/schemas/inspire_vs/1.0 http://inspire.ec.europa.eu/schemas/inspire_vs/1.0/inspire_vs.xsd http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test-project_inspire.qgs&amp;SERVICE=WMS&amp;REQUEST=GetSchemaExtension" xmlns:sld="http://www.opengis.net/sld" xmlns:qgs="http://www.qgis.org/wms">
<Service>
<Name>WMS</Name>
<Title>QGIS TestProject</Title>
@ -30,7 +30,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test%2Bproject_inspire.qgs&amp;"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test-project_inspire.qgs&amp;"/>
</Get>
</HTTP>
</DCPType>
@ -45,7 +45,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test%2Bproject_inspire.qgs&amp;"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test-project_inspire.qgs&amp;"/>
</Get>
</HTTP>
</DCPType>
@ -59,7 +59,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test%2Bproject_inspire.qgs&amp;"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test-project_inspire.qgs&amp;"/>
</Get>
</HTTP>
</DCPType>
@ -70,7 +70,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test%2Bproject_inspire.qgs&amp;"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test-project_inspire.qgs&amp;"/>
</Get>
</HTTP>
</DCPType>
@ -80,7 +80,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test%2Bproject_inspire.qgs&amp;"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test-project_inspire.qgs&amp;"/>
</Get>
</HTTP>
</DCPType>
@ -90,7 +90,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test%2Bproject_inspire.qgs&amp;"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test-project_inspire.qgs&amp;"/>
</Get>
</HTTP>
</DCPType>
@ -152,7 +152,7 @@ Content-Type: text/xml; charset=utf-8
<Title>default</Title>
<LegendURL>
<Format>image/png</Format>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test%2Bproject_inspire.qgs&amp;&amp;SERVICE=WMS&amp;VERSION=1.3.0&amp;REQUEST=GetLegendGraphic&amp;LAYER=testlayer èé&amp;FORMAT=image/png&amp;STYLE=default&amp;SLD_VERSION=1.1.0"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/dhont/3liz_dev/QGIS/qgis_rldhont/tests/testdata/qgis_server/test-project_inspire.qgs&amp;&amp;SERVICE=WMS&amp;VERSION=1.3.0&amp;REQUEST=GetLegendGraphic&amp;LAYER=testlayer èé&amp;FORMAT=image/png&amp;STYLE=default&amp;SLD_VERSION=1.1.0"/>
</LegendURL>
</Style>
</Layer>

View File

@ -2,7 +2,7 @@ Content-Length: 6685
Content-Type: text/xml; charset=utf-8
<?xml version="1.0" encoding="utf-8"?>
<WMS_Capabilities xmlns:sld="http://www.opengis.net/sld" version="1.3.0" xmlns="http://www.opengis.net/wms" xmlns:qgs="http://www.qgis.org/wms" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd http://www.qgis.org/wms http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgsSERVICE=WMS&amp;REQUEST=GetSchemaExtension">
<WMS_Capabilities xmlns:sld="http://www.opengis.net/sld" version="1.3.0" xmlns="http://www.opengis.net/wms" xmlns:qgs="http://www.qgis.org/wms" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd http://www.qgis.org/wms http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgsSERVICE=WMS&amp;REQUEST=GetSchemaExtension">
<Service>
<Name>WMS</Name>
<Title>QGIS TestProject</Title>
@ -30,7 +30,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -45,7 +45,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -59,7 +59,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -70,7 +70,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -80,7 +80,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -90,7 +90,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -102,7 +102,7 @@ Content-Type: text/xml; charset=utf-8
<DCPType>
<HTTP>
<Get>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs"/>
</Get>
</HTTP>
</DCPType>
@ -112,6 +112,9 @@ Content-Type: text/xml; charset=utf-8
<Format>text/xml</Format>
</Exception>
<sld:UserDefinedSymbolization UserStyle="1" RemoteWFS="0" SupportSLD="1" UserLayer="0" RemoteWCS="0" InlineFeature="0"/>
<WFSLayers>
<WFSLayer name="testlayer èé"/>
</WFSLayers>
<Layer queryable="1">
<Name>QGIS Test Project</Name>
<Title>QGIS Test Project</Title>
@ -145,7 +148,7 @@ Content-Type: text/xml; charset=utf-8
<Title>default</Title>
<LegendURL>
<Format>image/png</Format>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test%2Bproject.qgs&amp;SERVICE=WMS&amp;VERSION=1.3.0&amp;REQUEST=GetLegendGraphic&amp;LAYER=testlayer èé&amp;FORMAT=image/png&amp;STYLE=default&amp;SLD_VERSION=1.1.0"/>
<OnlineResource xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http:?MAP=/home/ale/dev/QGIS/tests/testdata/qgis_server/test-project.qgs&amp;SERVICE=WMS&amp;VERSION=1.3.0&amp;REQUEST=GetLegendGraphic&amp;LAYER=testlayer èé&amp;FORMAT=image/png&amp;STYLE=default&amp;SLD_VERSION=1.1.0"/>
</LegendURL>
</Style>
<TreeName>testlayer èé</TreeName>

View File

@ -1,11 +1,11 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis projectname="QGIS Test Project" version="2.99.0-Master">
<qgis projectname="QGIS Test Project" version="2.16.3">
<title>QGIS Test Project</title>
<autotransaction active="0"/>
<evaluateDefaultValues active="0"/>
<layer-tree-group name="" checked="Qt::Checked" expanded="1">
<layer-tree-group expanded="1" checked="Qt::Checked" name="">
<customproperties/>
<layer-tree-layer id="testlayer20150528120452665" name="testlayer èé" checked="Qt::Checked" expanded="1">
<layer-tree-layer expanded="1" checked="Qt::Checked" id="testlayer20150528120452665" name="testlayer èé">
<customproperties/>
</layer-tree-layer>
</layer-tree-group>
@ -13,10 +13,10 @@
<mapcanvas>
<units>degrees</units>
<extent>
<xmin>8.20315414376310059</xmin>
<ymin>44.9012858326611024</ymin>
<xmax>8.204164917965862</xmax>
<ymax>44.90154911342418131</ymax>
<xmin>8.20202108826836884</xmin>
<ymin>44.9009031607650968</ymin>
<xmax>8.20606418507941449</xmax>
<ymax>44.90195628381741244</ymax>
</extent>
<rotation>0</rotation>
<projections>1</projections>
@ -34,7 +34,7 @@
</destinationsrs>
<rendermaptile>0</rendermaptile>
<layer_coordinate_transform_info>
<layer_coordinate_transform srcDatumTransform="-1" layerid="testlayer20150528120452665" destDatumTransform="-1" srcAuthId="EPSG:4326" destAuthId="EPSG:4326"/>
<layer_coordinate_transform destAuthId="EPSG:4326" srcAuthId="EPSG:4326" srcDatumTransform="-1" destDatumTransform="-1" layerid="testlayer20150528120452665"/>
</layer_coordinate_transform_info>
</mapcanvas>
<layer-tree-canvas>
@ -43,14 +43,14 @@
</custom-order>
</layer-tree-canvas>
<legend updateDrawingOrder="true">
<legendlayer open="true" showFeatureCount="0" checked="Qt::Checked" name="testlayer èé" drawingOrder="-1">
<legendlayer drawingOrder="-1" open="true" checked="Qt::Checked" name="testlayer èé" showFeatureCount="0">
<filegroup open="true" hidden="false">
<legendlayerfile visible="1" layerid="testlayer20150528120452665" isInOverview="0"/>
<legendlayerfile isInOverview="0" layerid="testlayer20150528120452665" visible="1"/>
</filegroup>
</legendlayer>
</legend>
<projectlayers>
<maplayer simplifyMaxScale="1" simplifyDrawingHints="0" type="vector" simplifyLocal="1" minimumScale="-4.65661e-10" hasScaleBasedVisibilityFlag="0" geometry="Point" maximumScale="1e+08" simplifyAlgorithm="0" simplifyDrawingTol="1" readOnly="0">
<maplayer simplifyAlgorithm="0" minimumScale="-4.65661e-10" maximumScale="1e+08" simplifyDrawingHints="0" readOnly="0" minLabelScale="1" maxLabelScale="1e+08" simplifyDrawingTol="1" geometry="Point" simplifyMaxScale="1" type="vector" hasScaleBasedVisibilityFlag="0" simplifyLocal="1" scaleBasedLabelVisibilityFlag="0">
<id>testlayer20150528120452665</id>
<datasource>./testlayer.shp</datasource>
<title>A test vector layer</title>
@ -72,70 +72,65 @@
</spatialrefsys>
</srs>
<provider encoding="UTF-8">ogr</provider>
<previewExpression>"name"</previewExpression>
<vectorjoins/>
<layerDependencies/>
<defaults>
<default field="id" expression=""/>
<default field="name" expression=""/>
<default field="utf8nameè" expression=""/>
</defaults>
<dataDependencies/>
<expressionfields/>
<map-layer-style-manager current="">
<map-layer-style name=""/>
</map-layer-style-manager>
<edittypes>
<edittype name="id" widgetv2type="TextEdit">
<widgetv2config fieldEditable="1" constraint="" labelOnTop="0" notNull="0" constraintDescription="" IsMultiline="0" UseHtml="0"/>
<edittype widgetv2type="TextEdit" name="id">
<widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
</edittype>
<edittype name="name" widgetv2type="TextEdit">
<widgetv2config fieldEditable="1" constraint="" labelOnTop="0" notNull="0" constraintDescription="" IsMultiline="0" UseHtml="0"/>
<edittype widgetv2type="TextEdit" name="name">
<widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
</edittype>
<edittype name="utf8nameè" widgetv2type="TextEdit">
<widgetv2config fieldEditable="1" constraint="" labelOnTop="0" notNull="0" constraintDescription="" IsMultiline="0" UseHtml="0"/>
<edittype widgetv2type="TextEdit" name="utf8nameè">
<widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
</edittype>
</edittypes>
<renderer-v2 type="singleSymbol" forceraster="0" enableorderby="0" symbollevels="0">
<renderer-v2 forceraster="0" symbollevels="0" type="singleSymbol" enableorderby="0">
<symbols>
<symbol alpha="1" type="marker" name="0" clip_to_extent="1">
<layer class="SimpleMarker" pass="0" locked="0">
<prop v="0" k="angle"/>
<prop v="102,164,67,255" k="color"/>
<prop v="1" k="horizontal_anchor_point"/>
<prop v="bevel" k="joinstyle"/>
<prop v="circle" k="name"/>
<prop v="0,0" k="offset"/>
<prop v="0,0,0,0,0,0" k="offset_map_unit_scale"/>
<prop v="MM" k="offset_unit"/>
<prop v="0,0,0,255" k="outline_color"/>
<prop v="solid" k="outline_style"/>
<prop v="0" k="outline_width"/>
<prop v="0,0,0,0,0,0" k="outline_width_map_unit_scale"/>
<prop v="MM" k="outline_width_unit"/>
<prop v="area" k="scale_method"/>
<prop v="2" k="size"/>
<prop v="0,0,0,0,0,0" k="size_map_unit_scale"/>
<prop v="MM" k="size_unit"/>
<prop v="1" k="vertical_anchor_point"/>
<effect type="effectStack" enabled="0">
<symbol alpha="1" clip_to_extent="1" type="marker" name="0">
<layer pass="0" class="SimpleMarker" locked="0">
<prop k="angle" v="0"/>
<prop k="color" v="102,164,67,255"/>
<prop k="horizontal_anchor_point" v="1"/>
<prop k="joinstyle" v="bevel"/>
<prop k="name" v="circle"/>
<prop k="offset" v="0,0"/>
<prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
<prop k="offset_unit" v="MM"/>
<prop k="outline_color" v="0,0,0,255"/>
<prop k="outline_style" v="solid"/>
<prop k="outline_width" v="0"/>
<prop k="outline_width_map_unit_scale" v="0,0,0,0,0,0"/>
<prop k="outline_width_unit" v="MM"/>
<prop k="scale_method" v="area"/>
<prop k="size" v="2"/>
<prop k="size_map_unit_scale" v="0,0,0,0,0,0"/>
<prop k="size_unit" v="MM"/>
<prop k="vertical_anchor_point" v="1"/>
<effect enabled="0" type="effectStack">
<effect type="drawSource">
<prop v="0" k="blend_mode"/>
<prop v="2" k="draw_mode"/>
<prop v="1" k="enabled"/>
<prop v="0" k="transparency"/>
<prop k="blend_mode" v="0"/>
<prop k="draw_mode" v="2"/>
<prop k="enabled" v="1"/>
<prop k="transparency" v="0"/>
</effect>
</effect>
</layer>
</symbol>
</symbols>
<rotation/>
<sizescale/>
<effect type="effectStack" enabled="0">
<sizescale scalemethod="diameter"/>
<effect enabled="0" type="effectStack">
<effect type="drawSource">
<prop v="0" k="blend_mode"/>
<prop v="2" k="draw_mode"/>
<prop v="1" k="enabled"/>
<prop v="0" k="transparency"/>
<prop k="blend_mode" v="0"/>
<prop k="draw_mode" v="2"/>
<prop k="enabled" v="1"/>
<prop k="transparency" v="0"/>
</effect>
</effect>
</renderer-v2>
@ -286,51 +281,73 @@
<blendMode>0</blendMode>
<featureBlendMode>0</featureBlendMode>
<layerTransparency>0</layerTransparency>
<SingleCategoryDiagramRenderer sizeLegend="0" attributeLegend="1" diagramType="Pie">
<DiagramCategory angleOffset="1440" width="15" transparency="0" minScaleDenominator="-4.65661e-10" minimumSize="0" lineSizeType="MM" sizeScale="0,0,0,0,0,0" enabled="0" height="15" labelPlacementMethod="XHeight" lineSizeScale="0,0,0,0,0,0" maxScaleDenominator="1e+08" sizeType="MM" scaleBasedVisibility="0" scaleDependency="Area" penAlpha="255" backgroundAlpha="255" diagramOrientation="Up" penColor="#000000" penWidth="0" backgroundColor="#ffffff" barWidth="5">
<fontProperties style="" description="Ubuntu,9,-1,5,50,0,0,0,0,0"/>
<attribute color="#000000" field="" label=""/>
<displayfield>name</displayfield>
<label>0</label>
<labelattributes>
<label fieldname="" text="Etichetta"/>
<family fieldname="" name="Ubuntu"/>
<size fieldname="" units="pt" value="12"/>
<bold fieldname="" on="0"/>
<italic fieldname="" on="0"/>
<underline fieldname="" on="0"/>
<strikeout fieldname="" on="0"/>
<color fieldname="" red="0" blue="0" green="0"/>
<x fieldname=""/>
<y fieldname=""/>
<offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/>
<angle fieldname="" value="0" auto="0"/>
<alignment fieldname="" value="center"/>
<buffercolor fieldname="" red="255" blue="255" green="255"/>
<buffersize fieldname="" units="pt" value="1"/>
<bufferenabled fieldname="" on=""/>
<multilineenabled fieldname="" on=""/>
<selectedonly on=""/>
</labelattributes>
<SingleCategoryDiagramRenderer diagramType="Pie" sizeLegend="0" attributeLegend="1">
<DiagramCategory penColor="#000000" labelPlacementMethod="XHeight" penWidth="0" diagramOrientation="Up" sizeScale="0,0,0,0,0,0" minimumSize="0" barWidth="5" penAlpha="255" maxScaleDenominator="1e+08" backgroundColor="#ffffff" transparency="0" width="15" scaleDependency="Area" backgroundAlpha="255" angleOffset="1440" scaleBasedVisibility="0" enabled="0" height="15" lineSizeScale="0,0,0,0,0,0" sizeType="MM" lineSizeType="MM" minScaleDenominator="-4.65661e-10">
<fontProperties description="Ubuntu,9,-1,5,50,0,0,0,0,0" style=""/>
<attribute field="" color="#000000" label=""/>
</DiagramCategory>
<symbol alpha="1" type="marker" name="sizeSymbol" clip_to_extent="1">
<layer class="SimpleMarker" pass="0" locked="0">
<prop v="0" k="angle"/>
<prop v="255,0,0,255" k="color"/>
<prop v="1" k="horizontal_anchor_point"/>
<prop v="bevel" k="joinstyle"/>
<prop v="circle" k="name"/>
<prop v="0,0" k="offset"/>
<prop v="0,0,0,0,0,0" k="offset_map_unit_scale"/>
<prop v="MM" k="offset_unit"/>
<prop v="0,0,0,255" k="outline_color"/>
<prop v="solid" k="outline_style"/>
<prop v="0" k="outline_width"/>
<prop v="0,0,0,0,0,0" k="outline_width_map_unit_scale"/>
<prop v="MM" k="outline_width_unit"/>
<prop v="diameter" k="scale_method"/>
<prop v="2" k="size"/>
<prop v="0,0,0,0,0,0" k="size_map_unit_scale"/>
<prop v="MM" k="size_unit"/>
<prop v="1" k="vertical_anchor_point"/>
<symbol alpha="1" clip_to_extent="1" type="marker" name="sizeSymbol">
<layer pass="0" class="SimpleMarker" locked="0">
<prop k="angle" v="0"/>
<prop k="color" v="255,0,0,255"/>
<prop k="horizontal_anchor_point" v="1"/>
<prop k="joinstyle" v="bevel"/>
<prop k="name" v="circle"/>
<prop k="offset" v="0,0"/>
<prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
<prop k="offset_unit" v="MM"/>
<prop k="outline_color" v="0,0,0,255"/>
<prop k="outline_style" v="solid"/>
<prop k="outline_width" v="0"/>
<prop k="outline_width_map_unit_scale" v="0,0,0,0,0,0"/>
<prop k="outline_width_unit" v="MM"/>
<prop k="scale_method" v="diameter"/>
<prop k="size" v="2"/>
<prop k="size_map_unit_scale" v="0,0,0,0,0,0"/>
<prop k="size_unit" v="MM"/>
<prop k="vertical_anchor_point" v="1"/>
</layer>
</symbol>
</SingleCategoryDiagramRenderer>
<DiagramLayerSettings zIndex="0" dist="0" priority="0" showAll="1" placement="0" linePlacementFlags="10" yPosColumn="-1" showColumn="0" obstacle="0" xPosColumn="-1"/>
<DiagramLayerSettings yPosColumn="-1" showColumn="0" linePlacementFlags="10" placement="0" dist="0" xPosColumn="-1" priority="0" obstacle="0" zIndex="0" showAll="1"/>
<annotationform>.</annotationform>
<aliases>
<alias index="0" name="" field="id"/>
<alias index="1" name="" field="name"/>
<alias index="2" name="" field="utf8nameè"/>
<alias field="id" index="0" name=""/>
<alias field="name" index="1" name=""/>
<alias field="utf8nameè" index="2" name=""/>
</aliases>
<excludeAttributesWMS/>
<excludeAttributesWFS/>
<attributeactions default="0"/>
<attributetableconfig sortExpression="" sortOrder="0" actionWidgetStyle="dropDown">
<attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
<columns/>
</attributetableconfig>
<editform>.</editform>
<editforminit/>
<editforminitcodesource>0</editforminitcodesource>
<editforminitfilepath></editforminitfilepath>
<editforminitfilepath>.</editforminitfilepath>
<editforminitcode><![CDATA[]]></editforminitcode>
<featformsuppress>0</featformsuppress>
<editorlayout>generatedlayout</editorlayout>
@ -339,106 +356,119 @@
<rowstyles/>
<fieldstyles/>
</conditionalstyles>
<expressionfields/>
<previewExpression>"name"</previewExpression>
<mapTip></mapTip>
</maplayer>
</projectlayers>
<properties>
<WMSKeywordList type="QStringList">
<value></value>
</WMSKeywordList>
<WMSUrl type="QString"></WMSUrl>
<SpatialRefSys>
<ProjectCRSProj4String type="QString">+proj=longlat +datum=WGS84 +no_defs</ProjectCRSProj4String>
<ProjectCrs type="QString">EPSG:4326</ProjectCrs>
<ProjectCRSID type="int">3452</ProjectCRSID>
<ProjectionsEnabled type="int">1</ProjectionsEnabled>
</SpatialRefSys>
<Measurement>
<DistanceUnits type="QString">meters</DistanceUnits>
<AreaUnits type="QString">m2</AreaUnits>
</Measurement>
<Legend>
<filterByMap type="bool">false</filterByMap>
</Legend>
<WMSExtent type="QStringList">
<value>8.20315414376310059</value>
<value>44.901236559338642</value>
<value>8.204164917965862</value>
<value>44.90159838674664172</value>
</WMSExtent>
<WMSUrl type="QString"></WMSUrl>
<DefaultStyles>
<Fill type="QString"></Fill>
<Line type="QString"></Line>
<Marker type="QString"></Marker>
<RandomColors type="bool">true</RandomColors>
<AlphaInt type="int">255</AlphaInt>
<ColorRamp type="QString"></ColorRamp>
</DefaultStyles>
<WMSAccessConstraints type="QString">None</WMSAccessConstraints>
<WMSContactMail type="QString">elpaso@itopen.it</WMSContactMail>
<WMSImageQuality type="int">90</WMSImageQuality>
<WFSLayersPrecision>
<testlayer20150528120452665 type="int">8</testlayer20150528120452665>
</WFSLayersPrecision>
<WMSRestrictedComposers type="QStringList"/>
<WMSServiceTitle type="QString">QGIS TestProject</WMSServiceTitle>
<WMSContactPhone type="QString"></WMSContactPhone>
<WFSTLayers>
<Insert type="QStringList">
<value>testlayer20150528120452665</value>
</Insert>
<Update type="QStringList">
<value>testlayer20150528120452665</value>
</Update>
<Delete type="QStringList">
<value>testlayer20150528120452665</value>
</Delete>
</WFSTLayers>
<WCSLayers type="QStringList"/>
<WMSRestrictedLayers type="QStringList"/>
<WMSContactPhone type="QString"></WMSContactPhone>
<Identify>
<disabledLayers type="QStringList"/>
</Identify>
<WMSImageQuality type="int">90</WMSImageQuality>
<WMSServiceAbstract type="QString">Some UTF8 text èòù</WMSServiceAbstract>
<WMSAddWktGeometry type="bool">true</WMSAddWktGeometry>
<WCSUrl type="QString"></WCSUrl>
<Measurement>
<DistanceUnits type="QString"></DistanceUnits>
<AreaUnits type="QString"></AreaUnits>
</Measurement>
<WMSServiceTitle type="QString">QGIS TestProject</WMSServiceTitle>
<WMSAccessConstraints type="QString"></WMSAccessConstraints>
<WMSOnlineResource type="QString"></WMSOnlineResource>
<WMSPrecision type="QString">4</WMSPrecision>
<SpatialRefSys>
<ProjectCRSProj4String type="QString">+proj=longlat +datum=WGS84 +no_defs</ProjectCRSProj4String>
<ProjectionsEnabled type="int">1</ProjectionsEnabled>
<ProjectCrs type="QString">EPSG:4326</ProjectCrs>
<ProjectCRSID type="int">3452</ProjectCRSID>
</SpatialRefSys>
<Paths>
<Absolute type="bool">false</Absolute>
</Paths>
<WMSUseLayerIDs type="bool">false</WMSUseLayerIDs>
<Digitizing>
<LayerSnappingList type="QStringList"/>
<LayerSnappingToleranceUnitList type="QStringList"/>
<DefaultSnapType type="QString">off</DefaultSnapType>
<SnappingMode type="QString">current_layer</SnappingMode>
<LayerSnappingEnabledList type="QStringList"/>
<LayerSnappingToleranceList type="QStringList"/>
<DefaultSnapTolerance type="double">0</DefaultSnapTolerance>
<LayerSnapToList type="QStringList"/>
<DefaultSnapToleranceUnit type="int">2</DefaultSnapToleranceUnit>
<AvoidIntersectionsList type="QStringList"/>
</Digitizing>
<WMSFees type="QString">conditions unknown</WMSFees>
<Macros>
<pythonCode type="QString"></pythonCode>
</Macros>
<WMSAddWktGeometry type="bool">true</WMSAddWktGeometry>
<WCSUrl type="QString"></WCSUrl>
<WMSOnlineResource type="QString"></WMSOnlineResource>
<WMSPrecision type="QString">4</WMSPrecision>
<Digitizing>
<LayerSnappingList type="QStringList"/>
<LayerSnappingEnabledList type="QStringList"/>
<DefaultSnapToleranceUnit type="int">2</DefaultSnapToleranceUnit>
<SnappingMode type="QString">current_layer</SnappingMode>
<AvoidIntersectionsList type="QStringList"/>
<LayerSnappingToleranceUnitList type="QStringList"/>
<LayerSnapToList type="QStringList"/>
<DefaultSnapType type="QString">off</DefaultSnapType>
<DefaultSnapTolerance type="double">0</DefaultSnapTolerance>
<LayerSnappingToleranceList type="QStringList"/>
</Digitizing>
<Identify>
<disabledLayers type="QStringList"/>
</Identify>
<WMSContactPerson type="QString">Alessandro Pasotti</WMSContactPerson>
<WMSContactOrganization type="QString">QGIS dev team</WMSContactOrganization>
<WMSRestrictedComposers type="QStringList"/>
<WFSUrl type="QString"></WFSUrl>
<WFSLayers type="QStringList"/>
<WMSServiceCapabilities type="bool">true</WMSServiceCapabilities>
<WMSContactMail type="QString">elpaso@itopen.it</WMSContactMail>
<Measure>
<Ellipsoid type="QString">WGS84</Ellipsoid>
</Measure>
<WMSKeywordList type="QStringList">
<value></value>
</WMSKeywordList>
<Paths>
<Absolute type="bool">false</Absolute>
</Paths>
<Variables>
<variableNames type="QStringList"/>
<variableValues type="QStringList"/>
</Variables>
<WMSContactPosition type="QString"></WMSContactPosition>
<PositionPrecision>
<DecimalPlaces type="int">2</DecimalPlaces>
<Automatic type="bool">true</Automatic>
<DegreeFormat type="QString">D</DegreeFormat>
</PositionPrecision>
<WFSTLayers>
<Update type="QStringList"/>
<Delete type="QStringList"/>
<Insert type="QStringList"/>
</WFSTLayers>
<WMSContactPerson type="QString">Alessandro Pasotti</WMSContactPerson>
<Legend>
<filterByMap type="bool">false</filterByMap>
</Legend>
<DefaultStyles>
<Fill type="QString"></Fill>
<RandomColors type="bool">true</RandomColors>
<Line type="QString"></Line>
<AlphaInt type="int">255</AlphaInt>
<ColorRamp type="QString"></ColorRamp>
<Marker type="QString"></Marker>
</DefaultStyles>
<WMSFees type="QString"></WMSFees>
<Gui>
<SelectionColorRedPart type="int">255</SelectionColorRedPart>
<SelectionColorGreenPart type="int">255</SelectionColorGreenPart>
<CanvasColorGreenPart type="int">255</CanvasColorGreenPart>
<CanvasColorBluePart type="int">255</CanvasColorBluePart>
<SelectionColorBluePart type="int">0</SelectionColorBluePart>
<CanvasColorGreenPart type="int">255</CanvasColorGreenPart>
<CanvasColorRedPart type="int">255</CanvasColorRedPart>
<SelectionColorRedPart type="int">255</SelectionColorRedPart>
<SelectionColorAlphaPart type="int">255</SelectionColorAlphaPart>
<SelectionColorGreenPart type="int">255</SelectionColorGreenPart>
<CanvasColorBluePart type="int">255</CanvasColorBluePart>
</Gui>
<Measure>
<Ellipsoid type="QString">WGS84</Ellipsoid>
</Measure>
<WMSServiceAbstract type="QString">Some UTF8 text èòù</WMSServiceAbstract>
<WFSLayers type="QStringList">
<value>testlayer20150528120452665</value>
</WFSLayers>
<WFSUrl type="QString"></WFSUrl>
<WMSServiceCapabilities type="bool">true</WMSServiceCapabilities>
<WMSUseLayerIDs type="bool">false</WMSUseLayerIDs>
</properties>
<visibility-presets/>
</qgis>