ripped out a large chunk of microWebSrv in order to fit it into the memory space of an esp8266
This commit is contained in:
parent
fd117de9a6
commit
fd173c0f73
4
boot.py
4
boot.py
|
@ -41,5 +41,5 @@ if wlan(staif).isconnected() != True:
|
||||||
time.sleep_ms(100)
|
time.sleep_ms(100)
|
||||||
slept+=1
|
slept+=1
|
||||||
|
|
||||||
import webrepl
|
#import webrepl
|
||||||
webrepl.start()
|
#webrepl.start()
|
||||||
|
|
14
main.py
14
main.py
|
@ -1,20 +1,20 @@
|
||||||
import uPyConfig
|
import uPyConfig
|
||||||
import init_sample
|
|
||||||
|
|
||||||
hw = uPyConfig.esp8266(variant='d1-r2')
|
hw = uPyConfig.esp8266(variant='d1-r2')
|
||||||
#print family, variant and IP address (using oled, if available on-board)
|
#print family, variant and IP address (using oled, if available on-board)
|
||||||
init_sample.init_sample(hw)
|
#import init_sample
|
||||||
|
#init_sample.init_sample(hw)
|
||||||
|
|
||||||
# Main app
|
# Main app
|
||||||
from uPySensor import BME280, LM75A, SHT21
|
import uPySensor
|
||||||
sensors={
|
sensors={
|
||||||
'bme280': BME280(hw.i2c.bus),
|
'bme280': uPySensor.BME280(hw.i2c.bus),
|
||||||
'lm75a': LM75A(hw.i2c.bus),
|
'lm75a': uPySensor.LM75A(hw.i2c.bus),
|
||||||
'sht21': SHT21(hw.i2c.bus),
|
'sht21': uPySensor.SHT21(hw.i2c.bus),
|
||||||
}
|
}
|
||||||
|
|
||||||
from microWebSrv import MicroWebSrv
|
from microWebSrv import MicroWebSrv
|
||||||
ws = MicroWebSrv(webPath='www/')
|
ws = MicroWebSrv()
|
||||||
ws.WebSocketThreaded = False
|
ws.WebSocketThreaded = False
|
||||||
|
|
||||||
wshead={
|
wshead={
|
||||||
|
|
170
microWebSrv.py
170
microWebSrv.py
|
@ -10,21 +10,9 @@ import _thread
|
||||||
import network
|
import network
|
||||||
import time
|
import time
|
||||||
import socket
|
import socket
|
||||||
import websocket
|
|
||||||
import gc
|
import gc
|
||||||
import re
|
import re
|
||||||
|
|
||||||
try:
|
|
||||||
from microWebTemplate import MicroWebTemplate
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
|
||||||
from microWebSocket import MicroWebSocket
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class MicroWebSrvRoute:
|
class MicroWebSrvRoute:
|
||||||
def __init__(self, route, method, func, routeArgNames, routeRegex):
|
def __init__(self, route, method, func, routeArgNames, routeRegex):
|
||||||
self.route = route
|
self.route = route
|
||||||
|
@ -39,35 +27,6 @@ class MicroWebSrv:
|
||||||
# ===( Constants )============================================================
|
# ===( Constants )============================================================
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
_indexPages = [
|
|
||||||
"index.pyhtml",
|
|
||||||
"index.html",
|
|
||||||
"index.htm",
|
|
||||||
"default.pyhtml",
|
|
||||||
"default.html",
|
|
||||||
"default.htm"
|
|
||||||
]
|
|
||||||
|
|
||||||
_mimeTypes = {
|
|
||||||
".txt": "text/plain",
|
|
||||||
".htm": "text/html",
|
|
||||||
".html": "text/html",
|
|
||||||
".css": "text/css",
|
|
||||||
".csv": "text/csv",
|
|
||||||
".js": "application/javascript",
|
|
||||||
".xml": "application/xml",
|
|
||||||
".xhtml": "application/xhtml+xml",
|
|
||||||
".json": "application/json",
|
|
||||||
".zip": "application/zip",
|
|
||||||
".pdf": "application/pdf",
|
|
||||||
".jpg": "image/jpeg",
|
|
||||||
".jpeg": "image/jpeg",
|
|
||||||
".png": "image/png",
|
|
||||||
".gif": "image/gif",
|
|
||||||
".svg": "image/svg+xml",
|
|
||||||
".ico": "image/x-icon"
|
|
||||||
}
|
|
||||||
|
|
||||||
_html_escape_chars = {
|
_html_escape_chars = {
|
||||||
"&": "&",
|
"&": "&",
|
||||||
'"': """,
|
'"': """,
|
||||||
|
@ -76,8 +35,6 @@ class MicroWebSrv:
|
||||||
"<": "<"
|
"<": "<"
|
||||||
}
|
}
|
||||||
|
|
||||||
_pyhtmlPagesExt = '.pyhtml'
|
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# ===( Class globals )=======================================================
|
# ===( Class globals )=======================================================
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
@ -150,22 +107,6 @@ class MicroWebSrv:
|
||||||
def _unquote_plus(s):
|
def _unquote_plus(s):
|
||||||
return MicroWebSrv._unquote(s.replace('+', ' '))
|
return MicroWebSrv._unquote(s.replace('+', ' '))
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _fileExists(path):
|
|
||||||
try:
|
|
||||||
stat(path)
|
|
||||||
return True
|
|
||||||
except:
|
|
||||||
return False
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _isPyHTMLFile(filename):
|
|
||||||
return filename.lower().endswith(MicroWebSrv._pyhtmlPagesExt)
|
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# ===( Constructor )==========================================================
|
# ===( Constructor )==========================================================
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
@ -173,21 +114,14 @@ class MicroWebSrv:
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
routeHandlers=[],
|
routeHandlers=[],
|
||||||
port=80,
|
port=80,
|
||||||
bindIP='0.0.0.0',
|
bindIP='0.0.0.0'):
|
||||||
webPath="/flash/www"):
|
|
||||||
|
|
||||||
self._srvAddr = (bindIP, port)
|
self._srvAddr = (bindIP, port)
|
||||||
self._webPath = webPath
|
|
||||||
self._notFoundUrl = None
|
self._notFoundUrl = None
|
||||||
self._started = False
|
self._started = False
|
||||||
self.thID = None
|
self.thID = None
|
||||||
self.isThreaded = False
|
self.isThreaded = False
|
||||||
self._state = "Stoped"
|
self._state = "Stopped"
|
||||||
|
|
||||||
self.MaxWebSocketRecvLen = 1024
|
|
||||||
self.WebSocketThreaded = True
|
|
||||||
self.WebSocketStackSize = 4096
|
|
||||||
self.AcceptWebSocketCallback = None
|
|
||||||
|
|
||||||
self._routeHandlers = []
|
self._routeHandlers = []
|
||||||
routeHandlers += self._docoratedRouteHandlers
|
routeHandlers += self._docoratedRouteHandlers
|
||||||
|
@ -237,7 +171,7 @@ class MicroWebSrv:
|
||||||
break
|
break
|
||||||
self._client(self, client, cliAddr)
|
self._client(self, client, cliAddr)
|
||||||
self._started = False
|
self._started = False
|
||||||
self._state = "Stoped"
|
self._state = "Stopped"
|
||||||
self.thID = None
|
self.thID = None
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
@ -298,15 +232,6 @@ class MicroWebSrv:
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
def GetMimeTypeFromFilename(self, filename):
|
|
||||||
filename = filename.lower()
|
|
||||||
for ext in self._mimeTypes:
|
|
||||||
if filename.endswith(ext):
|
|
||||||
return self._mimeTypes[ext]
|
|
||||||
return None
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
def GetRouteHandler(self, resUrl, method):
|
def GetRouteHandler(self, resUrl, method):
|
||||||
if self._routeHandlers:
|
if self._routeHandlers:
|
||||||
# resUrl = resUrl.upper()
|
# resUrl = resUrl.upper()
|
||||||
|
@ -331,20 +256,6 @@ class MicroWebSrv:
|
||||||
return (rh.func, None)
|
return (rh.func, None)
|
||||||
return (None, None)
|
return (None, None)
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
def _physPathFromURLPath(self, urlPath):
|
|
||||||
if urlPath == '/':
|
|
||||||
for idxPage in self._indexPages:
|
|
||||||
physPath = self._webPath + '/' + idxPage
|
|
||||||
if MicroWebSrv._fileExists(physPath):
|
|
||||||
return physPath
|
|
||||||
else:
|
|
||||||
physPath = self._webPath + urlPath
|
|
||||||
if MicroWebSrv._fileExists(physPath):
|
|
||||||
return physPath
|
|
||||||
return None
|
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# ===( Class Client )========================================================
|
# ===( Class Client )========================================================
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
@ -386,30 +297,9 @@ class MicroWebSrv:
|
||||||
else:
|
else:
|
||||||
routeHandler(self, response)
|
routeHandler(self, response)
|
||||||
elif self._method.upper() == "GET":
|
elif self._method.upper() == "GET":
|
||||||
filepath = self._microWebSrv._physPathFromURLPath(self._resPath)
|
|
||||||
if filepath:
|
|
||||||
if MicroWebSrv._isPyHTMLFile(filepath):
|
|
||||||
response.WriteResponsePyHTMLFile(filepath)
|
|
||||||
else:
|
|
||||||
contentType = self._microWebSrv.GetMimeTypeFromFilename(filepath)
|
|
||||||
if contentType:
|
|
||||||
response.WriteResponseFile(filepath, contentType)
|
|
||||||
else:
|
|
||||||
response.WriteResponseForbidden()
|
|
||||||
else:
|
|
||||||
response.WriteResponseNotFound()
|
response.WriteResponseNotFound()
|
||||||
else:
|
else:
|
||||||
response.WriteResponseMethodNotAllowed()
|
response.WriteResponseMethodNotAllowed()
|
||||||
elif upg == 'websocket' and 'MicroWebSocket' in globals() \
|
|
||||||
and self._microWebSrv.AcceptWebSocketCallback:
|
|
||||||
MicroWebSocket(socket=self._socket,
|
|
||||||
httpClient=self,
|
|
||||||
httpResponse=response,
|
|
||||||
maxRecvLen=self._microWebSrv.MaxWebSocketRecvLen,
|
|
||||||
threaded=self._microWebSrv.WebSocketThreaded,
|
|
||||||
acceptCallback=self._microWebSrv.AcceptWebSocketCallback,
|
|
||||||
stackSize=self._microWebSrv.WebSocketStackSize)
|
|
||||||
return
|
|
||||||
else:
|
else:
|
||||||
response.WriteResponseNotImplemented()
|
response.WriteResponseNotImplemented()
|
||||||
else:
|
else:
|
||||||
|
@ -654,60 +544,6 @@ class MicroWebSrv:
|
||||||
|
|
||||||
# ------------------------------------------------------------------------
|
# ------------------------------------------------------------------------
|
||||||
|
|
||||||
def WriteResponsePyHTMLFile(self, filepath, headers=None):
|
|
||||||
if 'MicroWebTemplate' in globals():
|
|
||||||
with open(filepath, 'r') as file:
|
|
||||||
code = file.read()
|
|
||||||
gc.collect()
|
|
||||||
mWebTmpl = MicroWebTemplate(code, escapeStrFunc=MicroWebSrv.HTMLEscape, filepath=filepath)
|
|
||||||
try:
|
|
||||||
tmplResult = mWebTmpl.Execute()
|
|
||||||
return self.WriteResponse(200, headers, "text/html", "UTF-8", tmplResult)
|
|
||||||
except Exception as ex:
|
|
||||||
return self.WriteResponse(500,
|
|
||||||
None,
|
|
||||||
"text/html",
|
|
||||||
"UTF-8",
|
|
||||||
self._execErrCtnTmpl % {
|
|
||||||
'module': 'PyHTML',
|
|
||||||
'message': str(ex)
|
|
||||||
})
|
|
||||||
return self.WriteResponseNotImplemented()
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
def WriteResponseFile(self, filepath, contentType=None, headers=None):
|
|
||||||
try:
|
|
||||||
size = stat(filepath)[6]
|
|
||||||
if size > 0:
|
|
||||||
with open(filepath, 'rb') as file:
|
|
||||||
self._writeBeforeContent(200, headers, contentType, None, size)
|
|
||||||
buf = MicroWebSrv._tryAllocByteArray(1024)
|
|
||||||
if buf:
|
|
||||||
while size > 0:
|
|
||||||
x = file.readinto(buf)
|
|
||||||
if x < len(buf):
|
|
||||||
buf = memoryview(buf)[:x]
|
|
||||||
self._write(buf)
|
|
||||||
size -= x
|
|
||||||
return True
|
|
||||||
self.WriteResponseInternalServerError()
|
|
||||||
return False
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
self.WriteResponseNotFound()
|
|
||||||
return False
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
def WriteResponseFileAttachment(self, filepath, attachmentName, headers=None):
|
|
||||||
if not isinstance(headers, dict):
|
|
||||||
headers = {}
|
|
||||||
headers["Content-Disposition"] = "attachment; filename=\"%s\"" % attachmentName
|
|
||||||
return self.WriteResponseFile(filepath, None, headers)
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
def WriteResponseOk(self, headers=None, contentType=None, contentCharset=None, content=None):
|
def WriteResponseOk(self, headers=None, contentType=None, contentCharset=None, content=None):
|
||||||
return self.WriteResponse(200, headers, contentType, contentCharset, content)
|
return self.WriteResponse(200, headers, contentType, contentCharset, content)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue