<div dir="ltr">Hi Alessandro,<div>the concept is clear but I probably I was reading the worng repo: serverplugins-iface, which is the latest you authored.</div><div>In this repo it seems that, in case a SERVICE different from the standards ones is called, an exception is raised [1], while in serverplugins repo the workflow is quite different, because the switch looks for plugin available to process the request.</div><div><br></div><div>However, what you're saying is that a plugin can completely change the incoming request and the outgoin request (I understand the middleware concept very well being a Django dev) and so:</div><div><br></div><div> - have the opportunity to server a non-standard service</div><div> - have the opportunity to do not let the request reach the QGIS Servers' request handlers.</div><div><br></div><div>I will have a look to the filter examples later.</div><div>Thanks for this work Alessandro ;)</div><div>giovanni</div><div><br></div><div>[1] <a href="https://github.com/elpaso/QGIS/blob/serverplugins-iface/src/mapserver/qgis_map_serv.cpp#L423">https://github.com/elpaso/QGIS/blob/serverplugins-iface/src/mapserver/qgis_map_serv.cpp#L423</a></div></div><div class="gmail_extra"><br><div class="gmail_quote">2014-10-24 8:31 GMT+02:00 Alessandro Pasotti <span dir="ltr"><<a href="mailto:apasotti@gmail.com" target="_blank">apasotti@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">2014-10-23 20:20 GMT+02:00 G. Allegri <<a href="mailto:giohappy@gmail.com">giohappy@gmail.com</a>>:<br>
<span class="">> Hi Alessandro,<br>
> I've read the latest version of the QEP and had a look to your repo.<br>
> If I'm not wrong the current implementation doesn't provide custom services<br>
> as in the initial proof of concept, but gives the opportunity to define<br>
> "middlewares" before and after the requests have been processed by the<br>
> standard OGC servces offered by QGIS Server. Is it right?<br>
><br>
> giovanni<br>
><br>
<br>
</span>Hi Giovanni,<br>
<br>
Thank you for your interest in my work!<br>
<br>
You are partially right: the new implementation we agreed upon in<br>
Hessen is loosely based on the Django concept of middlewares, with the<br>
addition of the possibility to add new hooks (callbacks) in the<br>
future.<br>
<br>
This implementation also allows for an easy implementation of custom<br>
services though.<br>
<br>
In fact, this concept proved to be extremely flexible and unobtrusive<br>
at the same time: a plugin can define one or more "filters" [1] with<br>
an optional priority, the filters have access to server interface [2]<br>
that in turn can manipulate the request handler [3].<br>
By manipulating the requet handler, a plugin can intercept and alter<br>
the input (typically the query string) **before** entering the main<br>
C++ switch for core services and/or can intercept and alter the output<br>
**after** the main C++ switch. The output typically is one of: none<br>
(in case the service did not match), an exception, an image or a<br>
XML/HTML document.<br>
<br>
I have developed a test plugin [4] which implements the following filters:<br>
<br>
* an HTML remote python console, also implements HTTP BASIC<br>
Authentication to give an example of HTTP header manipulation<br>
* do nothing but logging the result of QUERY STRING manipulation tests</li>\n"<br>
* say HelloServer! and write some lines in the logs<br>
* WaterMarkFilter: adds a watermark image on top of all WMS GetImage requests<br>
* raise and exception, catched in main loop<br>
<br>
Have a look to the filters for the implementation details.<br>
<br>
For anyone interested in testing, the implementation is in my<br>
"serverpython" branch:<br>
<br>
<a href="https://github.com/elpaso/QGIS/tree/serverpython" target="_blank">https://github.com/elpaso/QGIS/tree/serverpython</a><br>
<br>
PLEASE NOTE THAT in a previous email I gave the address of a wrong<br>
branch, that one above is the right one.:<br>
<br>
[1] <a href="http://www.itopen.it/qgis/serverplugins/api/classQgsServerFilter.html" target="_blank">http://www.itopen.it/qgis/serverplugins/api/classQgsServerFilter.html</a><br>
[2] <a href="http://www.itopen.it/qgis/serverplugins/api/classQgsServerInterface.html" target="_blank">http://www.itopen.it/qgis/serverplugins/api/classQgsServerInterface.html</a><br>
[3] <a href="http://www.itopen.it/qgis/serverplugins/api/classQgsRequestHandler.html" target="_blank">http://www.itopen.it/qgis/serverplugins/api/classQgsRequestHandler.html</a><br>
[4] <a href="https://github.com/elpaso/qgis-helloserver/tree/master/filters" target="_blank">https://github.com/elpaso/qgis-helloserver/tree/master/filters</a><br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Alessandro Pasotti<br>
w3:   <a href="http://www.itopen.it" target="_blank">www.itopen.it</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Giovanni Allegri<br><a href="http://about.me/giovanniallegri" target="_blank">http://about.me/giovanniallegri</a><div>Twitter: <a href="https://twitter.com/_giohappy_" target="_blank">https://twitter.com/_giohappy_</a></div><div>blog: <a href="http://blog.spaziogis.it" target="_blank">http://blog.spaziogis.it</a><br>GEO+ geomatica in Italia <a href="http://bit.ly/GEOplus" target="_blank">http://bit.ly/GEOplus</a></div></div>
</div>