http.protocol: Support filehandlers for unhandled encodings
authorKarl Palsson <karlp@remake.is>
Tue, 18 Aug 2015 13:59:32 +0000 (13:59 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Tue, 18 Aug 2015 15:53:30 +0000 (17:53 +0200)
The setfilehandler() functions used for mime and url encoded message
bodies all operate with a signature of fh(meta, chunk, eof), but for
unhandled encodings, the callback was directly assigned to the sink
function, which has a signature of snk(chunk).  Insert a wrapper to
properly generate the EOF flag, and include a stub "meta" block
providing a virtual "name" and also the original client provided
Content-Type header, to possibly help with taking alternative actions in
the file handler.

The sink function created for raw content decoding also used the wrong
signature for the sink function.

Signed-off-by: Karl Palsson <karlp@remake.is>
modules/luci-base/luasrc/http/protocol.lua

index 61d7b802fe87c2dbe4f6276a6dcd78893e35ed93..859272679fa3d3b2c5dc693a718616909c9c9d51 100644 (file)
@@ -559,14 +559,23 @@ function parse_message_body( src, msg, filecb )
 
                -- If we have a file callback then feed it
                if type(filecb) == "function" then
-                       sink = filecb
-
+                       local meta = {
+                               name = "raw",
+                               encoding = msg.env.CONTENT_TYPE
+                       }
+                       sink = function( chunk )
+                               if chunk then
+                                       return filecb(meta, chunk, false)
+                               else
+                                       return filecb(meta, nil, true)
+                               end
+                       end
                -- ... else append to .content
                else
                        msg.content = ""
                        msg.content_length = 0
 
-                       sink = function( chunk, err )
+                       sink = function( chunk )
                                if chunk then
                                        if ( msg.content_length + #chunk ) <= HTTP_MAX_CONTENT then
                                                msg.content        = msg.content        .. chunk