Splittet source up to some includes.

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...
This commit is contained in:
René Linder 2020-12-01 15:17:48 +01:00
parent 905f7ca677
commit 2cbfdceaac
10 changed files with 373 additions and 317 deletions

40
inc/lweb_IP.pbi Normal file
View file

@ -0,0 +1,40 @@
;********************************
;*
;* lweb_IP.pbi
;*
Procedure IsIPStringValid(Adress.s)
Static My_Regex_v4
Static My_Regex_v6_nocompress
Static My_Regex_v6_compress
Static Valid = 0
My_Regex_v4 = CreateRegularExpression(#PB_Any, "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")
My_Regex_v6_nocompress = CreateRegularExpression(#PB_Any, "^[0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){7}$")
My_Regex_v6_compress = CreateRegularExpression(#PB_Any, "^(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)::(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)$")
If MatchRegularExpression(My_Regex_v4, Adress) And Valid = 0
Debug "My_Regex_v4"
Valid = 1
EndIf
If MatchRegularExpression(My_Regex_v6_nocompress, Adress) And Valid = 0
Debug "My_Regex_v6_nocompress"
Valid = 1
EndIf
If MatchRegularExpression(My_Regex_v6_compress, Adress) And Valid = 0
Debug "My_Regex_v6_compress"
Valid = 1
EndIf
FreeRegularExpression(My_Regex_v4)
FreeRegularExpression(My_Regex_v6_nocompress)
FreeRegularExpression(My_Regex_v6_compress)
If Valid = 1
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure

6
inc/lweb_IP_header.pbi Normal file
View file

@ -0,0 +1,6 @@
;********************************
;*
;* lweb_IP_header.pbi
;*
Declare IsIPStringValid(Adress.s)

101
inc/lweb_file_cache.pbi Normal file
View file

@ -0,0 +1,101 @@

;Buggy FileCache Routines ... Wiso auch immer das noch nicht richtig Funktioniert.
Procedure FileCacheCleaner(Information.i)
Protected.i Selected
Protected.i Counter
Protected.i MaxSize = Information
Repeat
Delay(1000) ;Nur Alle Sekunden Prüfen
Counter + 1
LockMutex(file_cache_mutex)
ResetMap(m_file_cache_map())
;Debug "FileCacheCleaner" + Str(Counter) + " Map Size:" + Str(MapSize(m_file_cache_map()))
If NextMapElement(m_file_cache_map())
Repeat
m_file_cache(MapKey(m_file_cache_map()))\Timer - 1
If m_file_cache(MapKey(m_file_cache_map()))\Timer <= 0
If m_file_cache(MapKey(m_file_cache_map()))\Buffer > 0
conf_cache_current - m_file_cache(MapKey(m_file_cache_map()))\Size
FreeMemory(m_file_cache(MapKey(m_file_cache_map()))\Buffer)
DeleteMapElement(m_file_cache(), MapKey(m_file_cache_map()))
Debug "Info:["+Str(innercount)+"] Killed:["+MapKey(m_file_cache_map())+"]"
Selected = DeleteMapElement(m_file_cache_map())
Else
Debug "Info:["+Str(innercount)+"] Could Not kill:["+MapKey(m_file_cache_map())+"]"
EndIf
Else
Selected = NextMapElement(m_file_cache_map())
EndIf
Until Selected = 0
EndIf
UnlockMutex(file_cache_mutex)
ForEver
EndProcedure
Procedure FileCache(Information.i)
;http://purearea.net/pb/english/manual/reference/ug_memory.html
Protected FileCacheCleanerThread.i
Protected Tempbuffer.i, MaxSize.i, Current.i
MaxSize = conf_cache_maxsize * 1024 * 1024
FileCacheCleanerThread = CreateThread(@FileCacheCleaner(), MaxSize)
Repeat
WaitSemaphore(file_cache_semaphore)
Debug "Adresse:"+m_file_cache()\Buffer
If (m_file_cache()\Size + conf_cache_current) <= MaxSize
conf_cache_current + m_file_cache()\Size
Tempbuffer = AllocateMemory(m_file_cache()\Size)
CopyMemory(m_file_cache()\Buffer, Tempbuffer, MemorySize(m_file_cache()\Buffer))
m_file_cache()\Buffer = Tempbuffer
m_file_cache()\Timer = conf_cache_time
m_file_cache()\Is = #True
m_file_cache_map(MapKey(m_file_cache())) = #True
SignalSemaphore(file_cache_semaphore_thread)
Else
Debug "Cache Full"
SignalSemaphore(file_cache_semaphore_thread)
EndIf
ForEver
EndProcedure
Procedure AddFileToCache(MemoryID.i, FileName.s, Size.i)
LockMutex(file_cache_mutex)
Debug "Cache MaxSize:"+Str(conf_cache_maxsize*1024*1024)+" Actual Size:"+Str(conf_cache_current)
m_file_cache(FileName)\Buffer = MemoryID
m_file_cache(FileName)\Size = Size
SignalSemaphore(file_cache_semaphore)
WaitSemaphore(file_cache_semaphore_thread)
If m_file_cache(FileName)\Is
Debug FileName+" Size:"+Str(m_file_cache(FileName)\Size)+" Timer:"+Str(m_file_cache(FileName)\Timer)+ " new Memory ID:"+Str(m_file_cache(FileName)\Buffer)
Else
Debug "File not in cache was to full:"+FileName+ " MaxSize:"+Str(conf_cache_maxsize)+" Actual Size:"+Str(conf_cache_current/1024/1024)
EndIf
UnlockMutex(file_cache_mutex)
EndProcedure
Procedure.s GetFileFromCache(FileName.s, MemoryID.i)
Protected String.s
If TryLockMutex(file_cache_mutex)
If m_file_cache(FileName)\Is
MemoryID = ReAllocateMemory(MemoryID, m_file_cache(FileName)\Size)
CopyMemory(m_file_cache(FileName)\Buffer, MemoryID, m_file_cache(FileName)\Size)
String.s = Str(m_file_cache(FileName)\Size) + ":" + Str(MemoryID)
Else
String.s = #error_string
EndIf
UnlockMutex(file_cache_mutex)
Debug "Get from cache: "+FileName+">"+String+"-------------------------------------------------------------<"
ProcedureReturn String.s
Else
ProcedureReturn #error_string
EndIf
EndProcedure

View file

@ -0,0 +1,10 @@
;********************************
;*
;* lweb_file_cache_header.pbi
;*
Declare AddFileToCache(MemoryID.i, FileName.s, Size.i)
Declare FileCache(Information.i)
Declare.s GetFileFromCache(FileName.s, MemoryID.i) ;Ass named
Declare FileCacheCleaner(Information.i) ;Thread to cleanup Filecache

45
inc/lweb_helper.pbi Normal file
View file

@ -0,0 +1,45 @@
;********************************
;*
;* lweb_helper.pbi
;*
Procedure.s mimetype(file.s)
Select file
Case "png"
ProcedureReturn "image/png"
Case "gif"
ProcedureReturn "image/gif"
Case "jpg"
ProcedureReturn "image/jpeg"
Case "jpeg"
ProcedureReturn "image/jpeg"
Case "txt"
ProcedureReturn "text/plain"
Case "html"
ProcedureReturn "text/html"
Case "htm"
ProcedureReturn "text/html"
Case "mss"
ProcedureReturn "text/html"
Case "css"
ProcedureReturn "text/css"
Case "js"
ProcedureReturn "text/javascript"
Default
ProcedureReturn "text/html"
EndSelect
EndProcedure
Procedure.s MapToJSONString(Map ConvertMap.s())
Protected MyJSON
Protected.s Response
MyJSON = CreateJSON(#PB_Any)
If MyJSON
InsertJSONMap(JSONValue(MyJSON), ConvertMap())
Response = ComposeJSON(MyJSON)
FreeJSON(MyJSON)
ProcedureReturn Response
EndIf
ProcedureReturn #error_string
EndProcedure

View file

@ -0,0 +1,8 @@
;********************************
;*
;* lweb_helper_header.pbi
;*
Declare.s mimetype(file.s)
Declare.s MapToJSONString(Map ConvertMap.s())

133
inc/lweb_http.pbi Normal file
View file

@ -0,0 +1,133 @@
;********************************
;*
;* lweb_http.pbi
;*
Procedure.s http_day(Tag.i)
Select DayOfWeek(Date())
Case 0
ProcedureReturn "Sun, "
Case 1
ProcedureReturn "Mon, "
Case 2
ProcedureReturn "Tue, "
Case 3
ProcedureReturn "Wed, "
Case 4
ProcedureReturn "Thur, "
Case 5
ProcedureReturn "Fri, "
Case 6
ProcedureReturn "Sat, "
EndSelect
EndProcedure
Procedure.s http_month(Monat.i)
Select Month(Date())
Case 1
ProcedureReturn " Jan "
Case 2
ProcedureReturn " Feb "
Case 3
ProcedureReturn " Mar "
Case 4
ProcedureReturn " Apr "
Case 5
ProcedureReturn " May "
Case 6
ProcedureReturn " June "
Case 7
ProcedureReturn " July "
Case 8
ProcedureReturn " Aug "
Case 9
ProcedureReturn " Sept "
Case 10
ProcedureReturn " Oct "
Case 11
ProcedureReturn " Nov "
Case 12
ProcedureReturn " Dec "
EndSelect
EndProcedure
Procedure.s http_header_generate(Map Header.s())
Protected.s v_http_header, v_current
If Not FindMapElement(Header(), #http_head_status) : Header(#http_head_status) = "400 Bad Request" : EndIf
If Not FindMapElement(Header(), #http_head_date) : Header(#http_head_date) = http_day(DayOfWeek(Date())) +
Str(Day(Date())) +
http_month(Month(Date())) +
Str(Year(Date())) +
" " +
FormatDate("%hh:%ii:%ss GMT+1", Date()) : EndIf
If Not FindMapElement(Header(), #http_head_server) : Header(#http_head_server) = conf_titel : EndIf
If Not FindMapElement(Header(), #http_head_content_length) : Header(#http_head_content_length) = "0" : EndIf
If Not FindMapElement(Header(), #http_head_content_type) : Header(#http_head_content_type) = "text/txt" : EndIf
v_http_header = "HTTP/1.1 " + Header(#http_head_status) + #CRLF$ +
#http_head_date + " " + Header(#http_head_date) + #CRLF$ +
#http_head_server + " " + Header(#http_head_server) + #CRLF$ +
#http_head_content_length + " " + Header(#http_head_content_length) + #CRLF$ +
#http_head_content_type + " " + Header(#http_head_content_type) + #CRLF$
If MapSize(Header()) > 5
ResetMap(Header())
While NextMapElement(Header())
v_current = MapKey(Header())
If Bool(v_current <> #http_head_status And v_current <> #http_head_date And v_current <> #http_head_server And v_current <> #http_head_content_length And v_current <> #http_head_content_type)
v_http_header + v_current + " " + Header(v_current) + #CRLF$
EndIf
Wend
EndIf
v_http_header + #CRLF$
ProcedureReturn v_http_header
EndProcedure
Procedure.s Work_Header_to_JSONMap(String.s)
Protected NewMap Header.s()
Define.s JSONString, Working, Working_Line
Define CountLines, Lines, JSON
If CountString(String,#CRLF$+#CRLF$)
Working = StringField(String,1,#CRLF$+#CRLF$)
Else
ProcedureReturn #error_string
EndIf
Lines = CountString(Working,#CRLF$)
If Lines
Working_Line = StringField(Working,1,#CRLF$)
If CountString(Working_Line," ")
Header(#http_head_method) = UCase(StringField(Working_Line,1," "))
Header(#http_head_request) = StringField(Working_Line,2," ")
Header(#http_head_protocol) = UCase(StringField(Working_Line,3," "))
If CountString(Header(#http_head_request), "?")
Header(#http_head_query) = StringField(Header(#http_head_request),2,"?")
Header(#http_head_request) = StringField(Header(#http_head_request),1,"?")
Else
Header(#http_head_query) = ""
EndIf
For CountLines = 2 To Lines
Working_Line = StringField(Working,CountLines,#CRLF$)
Header(LCase(Trim(StringField(Working_Line,1,":")))+":") = Trim(StringField(Working_Line,2,":"))
Next
Else
FreeMap(Header())
ProcedureReturn #error_string
EndIf
Else
FreeMap(Header())
ProcedureReturn #error_string
EndIf
JSON = CreateJSON(#PB_Any)
If JSON
InsertJSONMap(JSONValue(JSON), Header())
JSONString = ComposeJSON(JSON)
FreeMap(Header())
FreeJSON(JSON)
ProcedureReturn JSONString.s
Else
ProcedureReturn #error_string
EndIf
EndProcedure

9
inc/lweb_http_header.pbi Normal file
View file

@ -0,0 +1,9 @@
;********************************
;*
;* lweb_http_header.pbi
;*
Declare.s http_day(Tag.i)
Declare.s http_month(Monat.i)
Declare.s http_header_generate(Map Header.s())
Declare.s Work_Header_to_JSONMap(String.s)

332
lweb.pbi
View file

@ -1,6 +1,6 @@
;********************************
;*
;* lweb-srv.pbi V0.9
;* lweb.pbi
;*
;* LiHaSo Webserver Main module.
;*
@ -9,6 +9,7 @@
XIncludeFile "ltls.pbi"
XIncludeFile "lsocket.pbi"
Module lhs_web
;********************************
@ -156,6 +157,15 @@ Module lhs_web
Prototype.s WebHandler_Post(Map handler_Map.s(), ContentString.s)
Prototype.s WebHandler_Universal(Map handler_Map.s(), ContentString.s)
;********************************
;*
;* Used Librarys
;*
XIncludeFile "inc/lweb_http_header.pbi"
XIncludeFile "inc/lweb_file_cache_header.pbi"
;********************************
;*
;* Proceduren Deklarierung
@ -164,17 +174,17 @@ Module lhs_web
Declare server_HTTP(network_server_id.i)
Declare server_HTTPS(network_server_id.i)
Declare client(network_client_id.i)
Declare AddFileToCache(MemoryID.i, FileName.s, Size.i)
Declare FileCache(Information.i)
Declare call_request(RequestString.s, Info.i=#get_handler_procedure)
Declare.s http_day(Tag.i)
Declare.s http_month(Monat.i)
Declare.s http_header_generate(Map Header.s())
Declare.s Work_Header_to_JSONMap(String.s)
Declare.s Work_Post_ToJSON_x_www_form_urlencoded(ContentLength.i, MemorSize.i, Memory.i)
Declare.s GetFileFromCache(FileName.s, MemoryID.i)
Declare count_client(Type.i, Countchange.i)
XIncludeFile "inc/lweb_IP.pbi"
XIncludeFile "inc/lweb_http.pbi"
XIncludeFile "inc/lweb_helper.pbi"
XIncludeFile "inc/lweb_file_cache.pbi"
Procedure set_config(parameter.i=#conf_defaultfile, setting.s="index.html")
Select parameter
Case #conf_HTTP_port
@ -351,41 +361,6 @@ Module lhs_web
ForEver
EndProcedure
Procedure IsIPStringValid(Adress.s)
Static My_Regex_v4
Static My_Regex_v6_nocompress
Static My_Regex_v6_compress
Static Valid = 0
My_Regex_v4 = CreateRegularExpression(#PB_Any, "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")
My_Regex_v6_nocompress = CreateRegularExpression(#PB_Any, "^[0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){7}$")
My_Regex_v6_compress = CreateRegularExpression(#PB_Any, "^(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)::(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)$")
If MatchRegularExpression(My_Regex_v4, Adress) And Valid = 0
Debug "My_Regex_v4"
Valid = 1
EndIf
If MatchRegularExpression(My_Regex_v6_nocompress, Adress) And Valid = 0
Debug "My_Regex_v6_nocompress"
Valid = 1
EndIf
If MatchRegularExpression(My_Regex_v6_compress, Adress) And Valid = 0
Debug "My_Regex_v6_compress"
Valid = 1
EndIf
FreeRegularExpression(My_Regex_v4)
FreeRegularExpression(My_Regex_v6_nocompress)
FreeRegularExpression(My_Regex_v6_compress)
If Valid = 1
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure client(network_client_id.i)
Protected thread_cli_id = network_client_id, sent
Protected MyThreadJSON, ToCall, ToCallType
@ -908,163 +883,6 @@ Module lhs_web
EndProcedure
Procedure.s mimetype(file.s)
Select file
Case "png"
ProcedureReturn "image/png"
Case "gif"
ProcedureReturn "image/gif"
Case "jpg"
ProcedureReturn "image/jpeg"
Case "jpeg"
ProcedureReturn "image/jpeg"
Case "txt"
ProcedureReturn "text/plain"
Case "html"
ProcedureReturn "text/html"
Case "htm"
ProcedureReturn "text/html"
Case "mss"
ProcedureReturn "text/html"
Case "css"
ProcedureReturn "text/css"
Case "js"
ProcedureReturn "text/javascript"
Default
ProcedureReturn "text/html"
EndSelect
EndProcedure
Procedure.s http_day(Tag.i)
Select DayOfWeek(Date())
Case 0
ProcedureReturn "Sun, "
Case 1
ProcedureReturn "Mon, "
Case 2
ProcedureReturn "Tue, "
Case 3
ProcedureReturn "Wed, "
Case 4
ProcedureReturn "Thur, "
Case 5
ProcedureReturn "Fri, "
Case 6
ProcedureReturn "Sat, "
EndSelect
EndProcedure
Procedure.s http_month(Monat.i)
Select Month(Date())
Case 1
ProcedureReturn " Jan "
Case 2
ProcedureReturn " Feb "
Case 3
ProcedureReturn " Mar "
Case 4
ProcedureReturn " Apr "
Case 5
ProcedureReturn " May "
Case 6
ProcedureReturn " June "
Case 7
ProcedureReturn " July "
Case 8
ProcedureReturn " Aug "
Case 9
ProcedureReturn " Sept "
Case 10
ProcedureReturn " Oct "
Case 11
ProcedureReturn " Nov "
Case 12
ProcedureReturn " Dec "
EndSelect
EndProcedure
Procedure.s http_header_generate(Map Header.s())
Protected.s v_http_header, v_current
If Not FindMapElement(Header(), #http_head_status) : Header(#http_head_status) = "400 Bad Request" : EndIf
If Not FindMapElement(Header(), #http_head_date) : Header(#http_head_date) = http_day(DayOfWeek(Date())) +
Str(Day(Date())) +
http_month(Month(Date())) +
Str(Year(Date())) +
" " +
FormatDate("%hh:%ii:%ss GMT+1", Date()) : EndIf
If Not FindMapElement(Header(), #http_head_server) : Header(#http_head_server) = conf_titel : EndIf
If Not FindMapElement(Header(), #http_head_content_length) : Header(#http_head_content_length) = "0" : EndIf
If Not FindMapElement(Header(), #http_head_content_type) : Header(#http_head_content_type) = "text/txt" : EndIf
v_http_header = "HTTP/1.1 " + Header(#http_head_status) + #CRLF$ +
#http_head_date + " " + Header(#http_head_date) + #CRLF$ +
#http_head_server + " " + Header(#http_head_server) + #CRLF$ +
#http_head_content_length + " " + Header(#http_head_content_length) + #CRLF$ +
#http_head_content_type + " " + Header(#http_head_content_type) + #CRLF$
If MapSize(Header()) > 5
ResetMap(Header())
While NextMapElement(Header())
v_current = MapKey(Header())
If Bool(v_current <> #http_head_status And v_current <> #http_head_date And v_current <> #http_head_server And v_current <> #http_head_content_length And v_current <> #http_head_content_type)
v_http_header + v_current + " " + Header(v_current) + #CRLF$
EndIf
Wend
EndIf
v_http_header + #CRLF$
ProcedureReturn v_http_header
EndProcedure
Procedure.s Work_Header_to_JSONMap(String.s)
Protected NewMap Header.s()
Define.s JSONString, Working, Working_Line
Define CountLines, Lines, JSON
If CountString(String,#CRLF$+#CRLF$)
Working = StringField(String,1,#CRLF$+#CRLF$)
Else
ProcedureReturn #error_string
EndIf
Lines = CountString(Working,#CRLF$)
If Lines
Working_Line = StringField(Working,1,#CRLF$)
If CountString(Working_Line," ")
Header(#http_head_method) = UCase(StringField(Working_Line,1," "))
Header(#http_head_request) = StringField(Working_Line,2," ")
Header(#http_head_protocol) = UCase(StringField(Working_Line,3," "))
If CountString(Header(#http_head_request), "?")
Header(#http_head_query) = StringField(Header(#http_head_request),2,"?")
Header(#http_head_request) = StringField(Header(#http_head_request),1,"?")
Else
Header(#http_head_query) = ""
EndIf
For CountLines = 2 To Lines
Working_Line = StringField(Working,CountLines,#CRLF$)
Header(LCase(Trim(StringField(Working_Line,1,":")))+":") = Trim(StringField(Working_Line,2,":"))
Next
Else
FreeMap(Header())
ProcedureReturn #error_string
EndIf
Else
FreeMap(Header())
ProcedureReturn #error_string
EndIf
JSON = CreateJSON(#PB_Any)
If JSON
InsertJSONMap(JSONValue(JSON), Header())
JSONString = ComposeJSON(JSON)
FreeMap(Header())
FreeJSON(JSON)
ProcedureReturn JSONString.s
Else
ProcedureReturn #error_string
EndIf
EndProcedure
Procedure call_request(RequestString.s, Info.i = #get_handler_procedure)
Protected CurrPos, Count, Counter, PartString.s
If m_request(GetExtensionPart(RequestString))\routetype = #handler_type
@ -1120,19 +938,6 @@ Module lhs_web
ProcedureReturn 0
EndProcedure
Procedure.s MapToJSONString(Map ConvertMap.s())
Protected MyJSON
Protected.s Response
MyJSON = CreateJSON(#PB_Any)
If MyJSON
InsertJSONMap(JSONValue(MyJSON), ConvertMap())
Response = ComposeJSON(MyJSON)
FreeJSON(MyJSON)
ProcedureReturn Response
EndIf
ProcedureReturn #error_string
EndProcedure
Procedure.s Work_Post_ToJSON_x_www_form_urlencoded(ContentLength.i, MemorSize.i, Memory.i)
Define.s JSONString, Working, ContentString
@ -1188,107 +993,6 @@ Module lhs_web
Debug "Handler Registriert:"+Route
EndProcedure
;Buggy FileCache Routines ... Wiso auch immer das noch nicht richtig Funktioniert.
Procedure FileCacheCleaner(Information.i)
Protected.i Selected
Protected.i Counter
Protected.i MaxSize = Information
Repeat
Delay(1000) ;Nur Alle Sekunden Prüfen
Counter + 1
LockMutex(file_cache_mutex)
ResetMap(m_file_cache_map())
;Debug "FileCacheCleaner" + Str(Counter) + " Map Size:" + Str(MapSize(m_file_cache_map()))
If NextMapElement(m_file_cache_map())
Repeat
m_file_cache(MapKey(m_file_cache_map()))\Timer - 1
If m_file_cache(MapKey(m_file_cache_map()))\Timer <= 0
If m_file_cache(MapKey(m_file_cache_map()))\Buffer > 0
conf_cache_current - m_file_cache(MapKey(m_file_cache_map()))\Size
FreeMemory(m_file_cache(MapKey(m_file_cache_map()))\Buffer)
DeleteMapElement(m_file_cache(), MapKey(m_file_cache_map()))
Debug "Info:["+Str(innercount)+"] Killed:["+MapKey(m_file_cache_map())+"]"
Selected = DeleteMapElement(m_file_cache_map())
Else
Debug "Info:["+Str(innercount)+"] Could Not kill:["+MapKey(m_file_cache_map())+"]"
EndIf
Else
Selected = NextMapElement(m_file_cache_map())
EndIf
Until Selected = 0
EndIf
UnlockMutex(file_cache_mutex)
ForEver
EndProcedure
Procedure FileCache(Information.i)
;http://purearea.net/pb/english/manual/reference/ug_memory.html
Protected FileCacheCleanerThread.i
Protected Tempbuffer.i, MaxSize.i, Current.i
MaxSize = conf_cache_maxsize * 1024 * 1024
FileCacheCleanerThread = CreateThread(@FileCacheCleaner(), MaxSize)
Repeat
WaitSemaphore(file_cache_semaphore)
Debug "Adresse:"+m_file_cache()\Buffer
If (m_file_cache()\Size + conf_cache_current) <= MaxSize
conf_cache_current + m_file_cache()\Size
Tempbuffer = AllocateMemory(m_file_cache()\Size)
CopyMemory(m_file_cache()\Buffer, Tempbuffer, MemorySize(m_file_cache()\Buffer))
m_file_cache()\Buffer = Tempbuffer
m_file_cache()\Timer = conf_cache_time
m_file_cache()\Is = #True
m_file_cache_map(MapKey(m_file_cache())) = #True
SignalSemaphore(file_cache_semaphore_thread)
Else
Debug "Cache Full"
SignalSemaphore(file_cache_semaphore_thread)
EndIf
ForEver
EndProcedure
Procedure AddFileToCache(MemoryID.i, FileName.s, Size.i)
LockMutex(file_cache_mutex)
Debug "Cache MaxSize:"+Str(conf_cache_maxsize*1024*1024)+" Actual Size:"+Str(conf_cache_current)
m_file_cache(FileName)\Buffer = MemoryID
m_file_cache(FileName)\Size = Size
SignalSemaphore(file_cache_semaphore)
WaitSemaphore(file_cache_semaphore_thread)
If m_file_cache(FileName)\Is
Debug FileName+" Size:"+Str(m_file_cache(FileName)\Size)+" Timer:"+Str(m_file_cache(FileName)\Timer)+ " new Memory ID:"+Str(m_file_cache(FileName)\Buffer)
Else
Debug "File not in cache was to full:"+FileName+ " MaxSize:"+Str(conf_cache_maxsize)+" Actual Size:"+Str(conf_cache_current/1024/1024)
EndIf
UnlockMutex(file_cache_mutex)
EndProcedure
Procedure.s GetFileFromCache(FileName.s, MemoryID.i)
Protected String.s
If TryLockMutex(file_cache_mutex)
If m_file_cache(FileName)\Is
MemoryID = ReAllocateMemory(MemoryID, m_file_cache(FileName)\Size)
CopyMemory(m_file_cache(FileName)\Buffer, MemoryID, m_file_cache(FileName)\Size)
String.s = Str(m_file_cache(FileName)\Size) + ":" + Str(MemoryID)
Else
String.s = #error_string
EndIf
UnlockMutex(file_cache_mutex)
Debug "Get from cache: "+FileName+">"+String+"-------------------------------------------------------------<"
ProcedureReturn String.s
Else
ProcedureReturn #error_string
EndIf
EndProcedure
Procedure count_client(Type.i, Countchange.i)
Select Type
Case #client_HTTP

View file

@ -90,8 +90,8 @@ DeclareModule lhs_web
Declare.s get_config(parameter.i=#conf_defaultfile)
Declare start_server()
Declare.s register_client_handler(Route.s, Callback.i, AppPrototype.i = #handler_proto_get, RouteType.i = #handler_sub)
Declare.s mimetype(file.s)
Declare.s MapToJSONString(Map ConvertMap.s())
Declare IsIPStringValid(Adress.s)
XIncludeFile "inc/lweb_IP_header.pbi"
XIncludeFile "inc/lweb_helper_header.pbi"
EndDeclareModule