modules/admin-mini: Added Wifi configuration
[project/luci.git] / libs / http / luasrc / http / protocol.lua
index b8e9624..542c314 100644 (file)
@@ -19,6 +19,7 @@ local ltn12 = require("luci.ltn12")
 
 HTTP_MAX_CONTENT      = 1024*4         -- 4 kB maximum content size
 HTTP_URLENC_MAXKEYLEN = 1024           -- maximum allowd size of urlencoded parameter names
+TSRC_BLOCKSIZE        = 2048           -- target block size for throttling sources
 
 
 -- Decode an urlencoded string.
@@ -111,6 +112,36 @@ function urlencode_params( tbl )
 end
 
 
+-- Parameter helper
+local function __initval( tbl, key )
+       if tbl[key] == nil then
+               tbl[key] = ""
+       elseif type(tbl[key]) == "string" then
+               tbl[key] = { tbl[key], "" }
+       else
+               table.insert( tbl[key], "" )
+       end
+end
+
+local function __appendval( tbl, key, chunk )
+       if type(tbl[key]) == "table" then
+               tbl[key][#tbl[key]] = tbl[key][#tbl[key]] .. chunk
+       else
+               tbl[key] = tbl[key] .. chunk
+       end
+end
+
+local function __finishval( tbl, key, handler )
+       if handler then
+               if type(tbl[key]) == "table" then
+                       tbl[key][#tbl[key]] = handler( tbl[key][#tbl[key]] )
+               else
+                       tbl[key] = handler( tbl[key] )
+               end
+       end
+end
+
+
 -- Table of our process states
 local process_states = { }
 
@@ -285,9 +316,10 @@ process_states['mime-headers'] = function( msg, chunk, filecb )
 
                                        -- Treat as form field
                                        else
-                                               msg.params[field] = ""
+                                               __initval( msg.params, field )
+
                                                msg._mimecallback = function(chunk,eof)
-                                                       msg.params[field] = msg.params[field] .. chunk
+                                                       __appendval( msg.params, field, chunk )
                                                end
                                        end
 
@@ -430,7 +462,6 @@ process_states['urldecode-key'] = function( msg, chunk, filecb )
                                local key = urldecode( buffer:sub( 1, spos - 1 ) )
 
                                -- Prepare buffers
-                               msg.params[key]         = ""
                                msg._urldeclength   = msg._urldeclength + epos
                                msg._urldecbuffer   = buffer:sub( epos + 1, #buffer )
 
@@ -440,12 +471,14 @@ process_states['urldecode-key'] = function( msg, chunk, filecb )
                                                filecb( field, chunk, eof )
                                        end
                                else
+                                       __initval( msg.params, key )
+
                                        msg._urldeccallback = function( chunk, eof )
-                                               msg.params[key] = msg.params[key] .. chunk
+                                               __appendval( msg.params, key, chunk )
 
                                                -- FIXME: Use a filter
                                                if eof then
-                                                       msg.params[key] = urldecode( msg.params[key] )
+                                                       __finishval( msg.params, key, urldecode )
                                                end
                                        end
                                end
@@ -590,7 +623,7 @@ function mimedecode_message_body( source, msg, filecb )
 
                -- XXX: we schould propably keep the maximum buffer size in sync with
                --      the blocksize of our original source... but doesn't really matter
-               if msg._mimebuffer ~= null and #msg._mimebuffer > 256 then
+               if msg._mimebuffer ~= nil and #msg._mimebuffer > TSRC_BLOCKSIZE then
                        return ""
                else
                        return source()
@@ -628,7 +661,7 @@ function urldecode_message_body( source, msg )
        -- Create a throttling LTN12 source
        -- See explaination in mimedecode_message_body().
        local tsrc = function()
-               if msg._urldecbuffer ~= null and #msg._urldecbuffer > 0 then
+               if msg._urldecbuffer ~= nil and #msg._urldecbuffer > 0 then
                        return ""
                else
                        return source()