[mapserver-dev] Can msIO_stripStdoutBufferContentHeaders() return headers and be available through MapScript?

Jean-François Gigand jf at geonef.fr
Thu Aug 11 11:37:48 EDT 2011


Back 2 months later...
I just created 2 tickets for these PHP mapscript issues (I forgot to
do it earlier, sorry):
http://trac.osgeo.org/mapserver/ticket/3988
http://trac.osgeo.org/mapserver/ticket/3989

And another trivial one about a constant missing from the (php) doc:
http://trac.osgeo.org/mapserver/ticket/3987

There are patches for these 3.

Best regards,

Jean-François Gigand - Geonef
Paris, France - http://geonef.fr/


2011/6/14 Lime, Steve D (DNR) <steve.lime at state.mn.us>:
> JF: Could you create a ticket for the two patches you've supplied so they don't get lost?
>
> Steve
>
> -----Original Message-----
> From: mapserver-dev-bounces at lists.osgeo.org [mailto:mapserver-dev-bounces at lists.osgeo.org] On Behalf Of Jean-François Gigand
> Sent: Tuesday, June 14, 2011 11:10 AM
> To: Daniel Morissette; Stephan Meißl
> Cc: mapserver-dev at lists.osgeo.org
> Subject: Re: [mapserver-dev] Can msIO_stripStdoutBufferContentHeaders() return headers and be available through MapScript?
>
> Hi again,
>
> Since I'm on the php/msIO topic, I remember a bug (in 5.6, still in
> 6.0) in the ms_ioGetStdoutBufferString() PHP/MapScript function.
> The function does not work with binary data, since RETURN_STRING() assumes, as you know, a \0 byte for the end.
> I have replaced it with RETURN_STRINGL() which takes a length argument instead of relying on strlen(). It works with my PNG test.
>
> Attached is the (tiny) patch.
>
> Best regards,
>
> JF Gigand
>
>
>
> 2011/6/14 Jean-François Gigand <jean-francois at gigand.fr>:
>> Hi,
>>
>> I did not notice that msIO_stripStdoutBufferContentHeaders() was
>> available in MapScript. The page you pointed, Stephan, is SWIG's. The
>> PHP bindings in mapscript/php/php_mapscript.c are statically written
>> (not based on SWIG) and do not contain the function. The following
>> check confirms it at runtime:
>>
>> $ echo '<?php print ms_GetVersion()."\n";
>> print_r(get_extension_funcs("mapscript"));' | php MapServer version
>> 6.0.0 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML SUPPORTS=PROJ
>> SUPPORTS=AGG SUPPORTS=CAIRO SUPPORTS=FREETYPE SUPPORTS=ICONV
>> SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT
>> SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER
>> SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS
>> INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE Array (
>>    [0] => ms_GetVersion
>>    [1] => ms_GetVersionInt
>>    [2] => ms_newLineObj
>>    [3] => ms_newRectObj
>>    [4] => ms_newShapeObj
>>    [5] => ms_shapeObjFromWkt
>>    [6] => ms_GetErrorObj
>>    [7] => ms_ResetErrorList
>>    [8] => ms_newOWSRequestObj
>>    [9] => ms_newShapeFileObj
>>    [10] => ms_newMapObj
>>    [11] => ms_newMapObjFromString
>>    [12] => ms_newLayerObj
>>    [13] => ms_newPointObj
>>    [14] => ms_newProjectionObj
>>    [15] => ms_newStyleObj
>>    [16] => ms_newSymbolObj
>>    [17] => ms_newClassObj
>>    [18] => ms_newGridObj
>>    [19] => ms_getCwd
>>    [20] => ms_getPid
>>    [21] => ms_getScale
>>    [22] => ms_tokenizeMap
>>    [23] => ms_ioInstallStdoutToBuffer
>>    [24] => ms_ioInstallStdinFromBuffer
>>    [25] => ms_ioGetStdoutBufferString
>>    [26] => ms_ioResetHandlers
>>    [27] => ms_ioStripStdoutBufferContentType
>>    [28] => ms_ioGetStdoutBufferBytes
>> )
>>
>> However, my need was to *fetch* the Content-* headers.
>>
>> In the mean time, since msIO_stripStdoutBufferContentHeaders() is in
>> SWIG but not in PHP, I guess it is just missing.
>> So I added it, attached is a patch, made against trunk rev 11817.
>> I named the function "ms_ioStripStdoutBufferContentHeaders", following
>> the naming convention of the other PHP MS bindings.
>>
>> Best regards,
>>
>> JF Gigand
>>
>>
>>
>> 2011/6/13 Daniel Morissette <dmorissette at mapgears.com>:
>>> Maybe we couold add a new ms_ioExtractStdoutBufferHeaders() that
>>> would extract and return all headers in an array?
>>>
>>>
>>> On 11-06-13 11:59 AM, Stephan Meißl wrote:
>>>>
>>>> Jean-François,
>>>>
>>>> in 6.0 the exact function you propose was added (see [1]). It
>>>> doesn't return the headers though. I haven't tested the function in
>>>> PHP MapScript but it works with Python.
>>>>
>>>> cu
>>>> Stephan
>>>>
>>>> [1]
>>>> http://mapserver.org/mapscript/mapscript.html#mapscript-functions
>>>>
>>>>
>>>> On Mon, 2011-06-13 at 15:27 +0200, Jean-François Gigand wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> I use PHP MapScript and handle WxS requests through the "MapScript
>>>>> Wrappers for WxS Services", which work fine.
>>>>>
>>>>> Since 6.0 I also use OGR output (ZIP of CSV/Shapefiles), which also
>>>>> works fine (much thanks, 6.0 kicks ass!).
>>>>>
>>>>> Through {,Fast}Cgi, everything is fine.
>>>>> But, through (PHP) MapScript, when the WxS request outputs a
>>>>> "Content-Disposition" header, the
>>>>> ms_ioStripStdoutBufferContentType()
>>>>> function is of no use, as the Content-Type header is not the first
>>>>> one, and no MapScript method would extract the "Content-Disposition"
>>>>> header anyway.
>>>>>
>>>>> To my guess, the perfect solution would be a
>>>>> msIO_stripStdoutBufferContentHeaders() function which:
>>>>> - would return the headers, not just strip them off, for example
>>>>> returning a<char **>
>>>>> - would be available through MapScript
>>>>>
>>>>> If you confirm the need for this solution, I can develop it and
>>>>> send you a patch (just advise me about the function name and
>>>>> prototype (<char***>  param or<char**>  return?).
>>>>>
>>>>> So far, I have done this through PHP, see the function below:
>>>>>
>>>>>   /**
>>>>>    * Strip off Content-* headers from buffer and set them on
>>>>> response object
>>>>>    *
>>>>>    * @param $buffer  string     Ref to buffer string, which may
>>>>> include Content-* headers
>>>>>    * @param $reponse Response   Framework-dependant response object
>>>>> to add the headers to
>>>>>    */
>>>>>   function extractContentHeaders(&$buffer, Response $response)
>>>>>   {
>>>>>     $length = -1;
>>>>>     $regex = "/^(Content-[a-zA-Z-]+): ([a-zA-Z0-9.\/=?!_; -]+)\n/";
>>>>>     while (strlen($buffer) != $length) {
>>>>>       $length = strlen($buffer);
>>>>>       $cb = function($m) use ($response) {
>>>>>         $response->headers->set($m[1], $m[2]);
>>>>>         return '';
>>>>>       };
>>>>>       $buffer = preg_replace_callback($regex,$cb, $buffer);
>>>>>     }
>>>>>   }
>>>>>
>>>>>
>>>>> Best regards,
>>>>>
>>>>> JF Gigand
>>>>> _______________________________________________
>>>>> mapserver-dev mailing list
>>>>> mapserver-dev at lists.osgeo.org
>>>>> http://lists.osgeo.org/mailman/listinfo/mapserver-dev
>>>>
>>>>
>>>> _______________________________________________
>>>> mapserver-dev mailing list
>>>> mapserver-dev at lists.osgeo.org
>>>> http://lists.osgeo.org/mailman/listinfo/mapserver-dev
>>>
>>>
>>> --
>>> Daniel Morissette
>>> http://www.mapgears.com/
>>> Provider of Professional MapServer Support since 2000
>>>
>>> _______________________________________________
>>> mapserver-dev mailing list
>>> mapserver-dev at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/mapserver-dev
>>>
>>
>
>


More information about the mapserver-dev mailing list