diff --git a/nodemcu/http/wifi_settings.lua b/nodemcu/http/wifi_settings.lua new file mode 100644 index 0000000..03806e2 --- /dev/null +++ b/nodemcu/http/wifi_settings.lua @@ -0,0 +1,37 @@ +return function (connection, req, args) + local staConfig = {ssid="", pwd=""} + + connection:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nCache-Control: private, no-store\r\n\r\n") + connection:send('Wifi Settings

Wifi settings

')
+
+  connection:send("SSID: "..staConfig.ssid)
+  connection:send("\nPassword: "..staConfig.pwd)
+    
+  connection:send('


') + + local form = [===[ +
+ SSID:

+ Password:

+ +
+ ]===] + + if req.method == "GET" then + connection:send(form) + elseif req.method == "POST" then + local rd = req.getRequestData() + -- connection:send(cjson.encode(rd)) + connection:send('

Received the following values:

') + connection:send("\n") + else + connection:send("NOT IMPLEMENTED") + end + + connection:send('') +end diff --git a/nodemcu/httpserver-connection.lua b/nodemcu/httpserver-connection.lua new file mode 100644 index 0000000..329e603 --- /dev/null +++ b/nodemcu/httpserver-connection.lua @@ -0,0 +1,67 @@ +-- httpserver-connection +-- Part of nodemcu-httpserver, provides a buffered connection object that can handle multiple +-- consecutive send() calls, and buffers small payloads to send once they get big. +-- For this to work, it must be used from a coroutine and owner is responsible for the final +-- flush() and for closing the connection. +-- Author: Philip Gladstone, Marcos Kirsch + +BufferedConnection = {} + +-- parameter is the nodemcu-firmware connection +function BufferedConnection:new(connection) + local newInstance = {} + newInstance.connection = connection + newInstance.size = 0 + newInstance.data = {} + + function newInstance:flush() + if self.size > 0 then + self.connection:send(table.concat(self.data, "")) + self.data = {} + self.size = 0 + return true + end + return false + end + + function newInstance:send(payload) + local flushthreshold = 1400 + + local newsize = self.size + payload:len() + while newsize > flushthreshold do + --STEP1: cut out piece from payload to complete threshold bytes in table + local piecesize = flushthreshold - self.size + local piece = payload:sub(1, piecesize) + payload = payload:sub(piecesize + 1, -1) + --STEP2: insert piece into table + table.insert(self.data, piece) + self.size = self.size + piecesize --size should be same as flushthreshold + --STEP3: flush entire table + if self:flush() then + coroutine.yield() + end + --at this point, size should be 0, because the table was just flushed + newsize = self.size + payload:len() + end + + --at this point, whatever is left in payload should be <= flushthreshold + local plen = payload:len() + if plen == flushthreshold then + --case 1: what is left in payload is exactly flushthreshold bytes (boundary case), so flush it + table.insert(self.data, payload) + self.size = self.size + plen + if self:flush() then + coroutine.yield() + end + elseif payload:len() then + --case 2: what is left in payload is less than flushthreshold, so just leave it in the table + table.insert(self.data, payload) + self.size = self.size + plen + --else, case 3: nothing left in payload, so do nothing + end + end + + return newInstance +end + +return BufferedConnection diff --git a/nodemcu/init.lua b/nodemcu/init.lua index c9f6825..7204f97 100644 --- a/nodemcu/init.lua +++ b/nodemcu/init.lua @@ -39,7 +39,7 @@ local compileAndRemoveIfNeeded = function(f) end end -local serverFiles = {'httpserver.lua', 'httpserver-basicauth.lua', 'httpserver-conf.lua', 'httpserver-b64decode.lua', 'httpserver-request.lua', 'httpserver-static.lua', 'httpserver-header.lua', 'httpserver-error.lua'} +local serverFiles = {'httpserver.lua', 'httpserver-basicauth.lua', 'httpserver-conf.lua', 'httpserver-b64decode.lua', 'httpserver-request.lua', 'httpserver-static.lua', 'httpserver-header.lua', 'httpserver-error.lua', 'httpserver-connection.lua'} for i, f in ipairs(serverFiles) do compileAndRemoveIfNeeded(f) end compileAndRemoveIfNeeded = nil