Ground0
2cbfdceaac
Every Include should now have some procedure who are standalone usable. lweb_http Has a lot of changes todo (Full HTTP 1.1 Compliance) lweb_file_cache, is realy buggy. A lot of todo's lweb_IP is Only IsIPStringValid in lweb_helper, there is only some help procedures. To Do: lweb_http_post (Everything Post Specific) lweb_http_get (Everything Get Specific) lweb_http_put (Complete todo nothing done until now) lweb_server_http (Specific http only Server) lweb_server_https (Specific https only Server) lweb_server (Common Server Things) Maybe everything more generic to use standalone... |
||
---|---|---|
inc | ||
testweb | ||
.gitignore | ||
createini.pb | ||
lhttpd.ini | ||
lhttpd.pb | ||
LICENSE | ||
lsocket.pbi | ||
ltls.pbi | ||
lweb.pbi | ||
lweb_header.pbi | ||
README.md | ||
server_example.pb | ||
TODO.txt |
lweb
LiHaSo Webserver Modul
Öffentliche Funktionen:
Konfiguration des Server Moduls:
Mögliche Parameter:
lweb::#conf_port ;Hörender Port, z.B. "80"
lweb::#conf_binding ;Interface Binding z.B. nur Lokalhost mit "127.0.0.1"
lweb::#conf_defaultfile ;Standard wenn keine Datei (Extension angegeben ist) z.B. "index.php"
lweb::#conf_basedir ;Standard Verzeichnis z.B. "/srv/www/htdocs/"
lweb::#conf_error400 ;TODO:error400 bearbeitung
lweb::#conf_max_clients ;Maximale Clientconnections (Memory beachten)
lweb::#conf_server_type ;Derzeit ohne Funktion (Später z.B. HTTPS und HTTP oder HTTP/2 usw.)
lweb::#conf_cache_enable ;Bei wert auf 1 Setzen um zu Aktivieren diese Funktion ist aber derzeit mit Vorsicht zu geniessen!!!!
Funktionen
lweb::set_config(parameter.i=#conf_defaultfile, setting.s="index.html")
Dass setting ist immer ein String.
Rückgabewert ist #True
oder #False.
lweb::get_config(parameter.i=#conf_defaultfile)
Der Rückgabewert ist immer einen String.
Starten des Servers
lweb::start_server()
Rückgabewert ist #True
oder #False.
Verschiedene arten des Handlers Registrieren & Proceduren:
lweb::register_client_handler(Route.s, Callback.i, AppPrototype.i = #handler_proto_get, RouteType.i = #handler_sub)
Rückgabewerte ist immer ein JSONString!
AppPrototype Möglichkeiten:
lweb::#handler_proto_universal ;Für HTTP POST und GET Requests Nimmt Optional einen String entgegen.
lweb::#handler_proto_post ;Nur für HTTP POST Requests Nimmt Zwingend einen String entgegen.
lweb::#handler_proto_get ;Nur für HTTP GET Requests Nimmt keinen String entgegen.
RouteType Möglichkeiten:
lweb::#handler_only ;Reagiert nur auf die Url (Bsp. /rest/v1/test aber nicht auf /rest/v1/test/sub)
lweb::#handler_sub ;Reagiert auf eine ganze Url die begint. (Bsp. /rest/v1/test sowie auch auf /rest/v1/test/sub)
lweb::#handler_type ;Reagiert auf datentypen (zb. *.php = "php")
Map für Antwort ist eine einfache Stringmap:
NewMap Response.s()
Wobei folgende werte entsprechend gesetzt werden müssen:
lweb::#cha_R_ResponseType = "ResponseType"
;Element ResponseType,Mimetype mitlweb::mimetype("html")
z.B. Setzen.lweb::#cha_R_ResponseContentType = "ResponseContentType"
;Element ResponseContentType,lweb::#response_string
oderlweb::#response_Memory
lweb::#cha_R_MemoryAdress = "MemoryAdress"
;Element MemoryAdress, Konvertieren zu StringStr(Adresse)
wird mitVal()
zurückkonvertiert. Und nach dem Bearbeiten wieder freigegeben!lweb::#cha_R_MemorySize = "MemorySize"
;Element MemorySize, Konvertieren zu StringStr(Grösse)
wird mitVal()
zurückkonvertiert.lweb::#cha_R_StringBase64 = "StringBase64"
;Element StringBase64, Base64 Encoded Stringlweb::#cha_R_http_head_status = "HeaderStatus"
;"200 OK"
,"300 Error"
,"500 Server Error"
usw.
Zu beachten ist das entweder ein Base64 encodierter String oder ein MemoryBlock zurückgegeben werden muss!
Komplettes Beispiel:
Procedure.s Sample_Header(Map Header.s())
Define *Text
Define.s Encoded, ZumSenden, TBD
NewMap Response.s()
TBD="<div><div><h1>Header</h1></div><br/>"+#CRLF$
ResetMap(Header())
While NextMapElement(Header())
TBD = TBD+"<div>"+MapKey(Header())+" : "+Header()+" </div><br/>"+#CRLF$
Wend
*Text = UTF8("<!DOCTYPE html><html><header><title>Alle Client Headers</title></header><body>"+TBD+"</body></html>")
Encoded = Base64Encoder(*Text, MemorySize(*Text))
Debug "Encoded: " + Encoded
Response(lhs_web::#cha_R_ResponseContentType) = lhs_web::#response_string
Response(lhs_web::#cha_R_StringBase64) = Encoded
Response(lhs_web::#cha_R_ResponseType) = lhs_web::mimetype("html")
Response(lhs_web::#cha_R_http_head_status) = "200 OK"
ZumSenden = lhs_web::MapToJSONString(Response())
Debug "ZumSenden: " + ZumSenden
ProcedureReturn ZumSenden
EndProcedure
lhs_web::register_client_handler("/server/show_client_headers", @Sample_Header(),lhs_web::#handler_proto_get, lhs_web::#handler_sub)
Einen Mimetype eines Fileextensions:
lweb::mimetype(file.s)
Gibt einen String zurück.
Konvertiert z.B. lweb::mimetype("html")
zu "text/html"
Eine Map in einen JSONString Konvertieren (z.B. in Interaktion mit einer Spiderbasic App)
lweb::MapToJSONString(Map ConvertMap.s())
Gibt einen String zurück.
Beispiel:
Response(lhs_web::#cha_R_ResponseContentType) = lhs_web::#response_string
Response(lhs_web::#cha_R_StringBase64) = Encoded
Response(lhs_web::#cha_R_ResponseType) = lhs_web::mimetype("html")
Response(lhs_web::#cha_R_http_head_status) = "200 OK"
ZumSenden = lhs_web::MapToJSONString(Response())
Ergib anschliessend einen String der wieder Zurückkonvertiert werden kann von der Hauptbearbeitungsprozedur (Client Thread in lweb.pbi).
Verifizierung ob es eine Gültige IP Adresse ist (IPv6 und IPv4)
lweb::IsIPStringValid(Adress.s)
Beispiel:
setting = "192.168.256.12"
If lweb::IsIPStringValid(setting)
conf_binding = setting
Else
; Fehler
conf_binding = "127.0.0.1"
EndIf
ergibt einen Fehler und wird die Standard IP Setzen.
Rückgabewert ist #True
oder #False.