diff --git a/lsocket.pbi b/lsocket.pbi new file mode 100644 index 0000000..ca253f4 --- /dev/null +++ b/lsocket.pbi @@ -0,0 +1,101 @@ +;lsocket.pbi +; +; Socket Module +; Definition who are not available on linux... +; Simple PureBasic Spech commands. +; +DeclareModule lsocket + Structure sockaddr + sa_family.w + sa_data.s{14} + EndStructure + + Structure in_addr + s_addr.w + EndStructure + + Structure sockaddr_in + sin_family.w + sin_port.w + sin_addr.in_addr + sin_zero.s{8} + EndStructure + + ; Socket types: + #SOCK_STREAM = 1 ; stream (connection) socket + #SOCK_DGRAM = 2 ; datagram (conn.less) socket + #SOCK_RAW = 3 ; raw socket + #SOCK_RDM = 4 ; reliably-delivered message + #SOCK_SEQPACKET = 5 ; sequential packet socket + #SOCK_PACKET = 10 ; linux specific way of + ; getting packets at the dev + ; level. For writing rarp And + ; other similar things on the + ; user level. + + ; socket.h + #PF_INET = 2 + #AF_INET = #PF_INET + + Declare CreateSocket(Port.i, Queuelengt.i = 64, Type.i = #SOCK_STREAM, Protocol.i = #AF_INET, BindedIP.s = "127.0.0.1") ; Return Server Socket < 0 Error + Declare WaitSocket(ServerSocket.i) ;Return new SocketID + Declare ReadSocket(ClientSocket.i, *Buffer, Length.i) ;Return Effective Read + Declare WriteSocket(ClientSocket.i, *Buffer, Length.i) ;Return Effective Writen + +EndDeclareModule + +Module lsocket + Global NewMap lsockets_server.sockaddr_in() + Global NewMap lsockets_client.sockaddr_in() + + Procedure CreateSocket(Port.i, Queuelengt.i = 64, Type.i = #SOCK_STREAM, Protocol.i = #AF_INET, BindedIP.s = "127.0.0.1") ; Return Server Socket < 0 Error + Protected SocketID.i + SocketID = socket_(Protocol, Type, 0) + If SocketID = -1 : ProcedureReturn -1 : EndIf + lsockets_server(Str(SocketID))\sin_family = Protocol + lsockets_server(Str(SocketID))\sin_addr\s_addr = Inet_addr_(BindedIP) + lsockets_server(Str(SocketID))\sin_port = htons_(Port) + If bind_(SocketID, @lsockets_server(Str(SocketID)), SizeOf(sockaddr_in)) <> 0 + Close_(SocketID) + DeleteMapElement(lsockets_server(), Str(SocketID)) + ProcedureReturn -1 + Else + If listen_(SocketID, Queuelengt) <> 0 + Close_(SocketID) + DeleteMapElement(lsockets_server(), Str(SocketID)) + ProcedureReturn -1 + EndIf + EndIf + ProcedureReturn SocketID + EndProcedure + + Procedure WaitSocket(ServerSocket.i) ;Return new ClientSocketID + Protected ClientSID.i, MapID.s, ClientLength + Protected Client.sockaddr_in + ClientSID = accept_(ServerSocket, @Client, @ClientLength) + If ClientSID < 0 : ProcedureReturn ClientSID : EndIf + MapID = Str(ClientSID) + lsockets_client(MapID)\sin_addr\s_addr = Client\sin_addr\s_addr + lsockets_client(MapID)\sin_family = Client\sin_family + lsockets_client(MapID)\sin_port = Client\sin_port + lsockets_client(MapID)\sin_zero = Client\sin_zero + ProcedureReturn ClientSID + EndProcedure + + Procedure ReadSocket(ClientSocket.i, *Buffer, Length.i) ;Return Effective Read + Protected Effective.i + Effective = read_(ClientSocket, *Buffer, Length) + ProcedureReturn Effective + EndProcedure + + Procedure WriteSocket(ClientSocket.i, *Buffer, Length.i) ;Return Effective Writen + Protected Effective.i + Effective = write_(ClientSocket, *Buffer, Length) + ProcedureReturn Effective + EndProcedure + + + + + +EndModule diff --git a/ltls.pbi b/ltls.pbi new file mode 100644 index 0000000..d6680f6 --- /dev/null +++ b/ltls.pbi @@ -0,0 +1,175 @@ +;ltls.pbi + +XIncludeFile "lsocket.pbi" + +DeclareModule ltls + Structure s_tls_server + CA.s + Cert.s + Key.s + Password.s + EndStructure + + + Declare InitTLS(*Settings.s_tls_server, TLSID.i = 0) + Declare WaitTLSSocket(ServerSocket.i, TLSID.i = 0) + Declare ReadTLSSocket(Connection.i, *Buffer, Length.i) + Declare WriteTLSSocket(Connection.i, *Buffer, Length.i) + Declare CloseTLSSocket(Connection.i) + Declare CloseTLS(TLSID.i = 0) + Declare.s ErrorTLSSrv(TLSID.i = 0) + Declare.s ErrorTLSCli(Connection) + +EndDeclareModule + +Module ltls + PrototypeC.i Pr_tls_init() + PrototypeC.i Pr_tls_config_new() + PrototypeC.i Pr_tls_load_file_pw(FileName.p-utf8, Length, Password.p-utf8) + PrototypeC.i Pr_tls_load_file(FileName.p-utf8, Length, Passord.s = #Null$) + PrototypeC.i Pr_tls_config_set_ca_mem(*tls_config , Memory.i, Length.i) + PrototypeC.i Pr_tls_config_set_cert_mem(*tls_config , Memory.i, Length.i) + PrototypeC.i Pr_tls_config_set_key_mem(*tls_config , Memory.i, Length.i) + PrototypeC.i Pr_tls_server() + PrototypeC.i Pr_tls_configure(*ctx, *cfg) + PrototypeC.i Pr_tls_error(*ctx) + PrototypeC.i Pr_tls_accept_socket(*ctx, *cctx, Socket.l) + PrototypeC.i Pr_tls_accept_cbs(*ctx, *cctx, read_cb.i, write_cb.i, arg_ch.i = #Null) + PrototypeC.i Pr_tls_read(*cctx, *buffer, Size.i) + PrototypeC.i Pr_tls_write(*cctx, *buffer, Size.i) + PrototypeC.i Pr_tls_handshake(*cctx) + PrototypeC.i Pr_tls_close(*cctx) + PrototypeC.i Pr_tls_free(*ctx) + PrototypeC.i Pr_tls_config_free(*cfg) + + + #TLS_WANT_POLLIN = -2 + #TLS_WANT_POLLOUT = -3 + + Define libressl_tls = OpenLibrary(#PB_Any, "libtls.so") + + If IsLibrary(libressl_tls) + Define Call_tls_init = GetFunction(libressl_tls, "tls_init") + Define Call_tls_config_new = GetFunction(libressl_tls, "tls_config_new") + Define Call_tls_load_file = GetFunction(libressl_tls, "tls_load_file") + Define Call_tls_config_set_ca_mem = GetFunction(libressl_tls, "tls_config_set_ca_mem") + Define Call_tls_config_set_cert_mem = GetFunction(libressl_tls, "tls_config_set_cert_mem") + Define Call_tls_config_set_key_mem = GetFunction(libressl_tls, "tls_config_set_key_mem") + Define Call_tls_server = GetFunction(libressl_tls, "tls_server") + Define Call_tls_configure = GetFunction(libressl_tls, "tls_configure") + Define Call_tls_error = GetFunction(libressl_tls, "tls_error") + Define Call_tls_accept_socket = GetFunction(libressl_tls, "tls_accept_socket") + Define Call_tls_accept_cbs = GetFunction(libressl_tls, "tls_accept_cbs") + Define Call_tls_read = GetFunction(libressl_tls, "tls_read") + Define Call_tls_write = GetFunction(libressl_tls, "tls_write") + Define Call_tls_handshake = GetFunction(libressl_tls, "tls_handshake") + Define Call_tls_close = GetFunction(libressl_tls, "tls_close") + Define Call_tls_free = GetFunction(libressl_tls, "tls_free") + Define Call_tls_config_free = GetFunction(libressl_tls, "tls_config_free") + Else + Debug "libtls.so Library Not found" + End + EndIf + + + Global.Pr_tls_init tls_init = Call_tls_init + Global.Pr_tls_config_new tls_config_new = Call_tls_config_new + Global.Pr_tls_load_file tls_load_file = Call_tls_load_file + Global.Pr_tls_load_file_pw tls_load_file_pw = Call_tls_load_file + Global.Pr_tls_config_set_ca_mem tls_config_set_ca_mem = Call_tls_config_set_ca_mem + Global.Pr_tls_config_set_cert_mem tls_config_set_cert_mem = Call_tls_config_set_cert_mem + Global.Pr_tls_config_set_key_mem tls_config_set_key_mem = Call_tls_config_set_key_mem + Global.Pr_tls_server tls_server = Call_tls_server + Global.Pr_tls_configure tls_configure = Call_tls_configure + Global.Pr_tls_error tls_error = Call_tls_error + Global.Pr_tls_accept_socket tls_accept_socket = Call_tls_accept_socket + Global.Pr_tls_accept_cbs tls_accept_cbs = Call_tls_accept_cbs + Global.Pr_tls_read tls_read = Call_tls_read + Global.Pr_tls_write tls_write = Call_tls_write + Global.Pr_tls_handshake tls_handshake = Call_tls_handshake + Global.Pr_tls_close tls_close = Call_tls_close + Global.Pr_tls_free tls_free = Call_tls_free + Global.Pr_tls_config_free tls_config_free = Call_tls_config_free + + Global *ctx, *cfg + Global tls_cfg = #Null + Global tls_ctx = #Null + + Procedure InitTLS(*Settings.s_tls_server, TLSID.i = 0) + Protected mem_ptr.i, length.i, returns.i + If tls_init() <> 0 : ProcedureReturn -1 : EndIf + tls_cfg = tls_config_new() + Debug "TLS cfg obj:"+Str(tls_cfg) + Debug "CA:"+*Settings\CA + mem_ptr = tls_load_file(*Settings\CA, @length) + If Not mem_ptr : tls_config_free(tls_cfg) : ProcedureReturn -2 : EndIf + tls_config_set_ca_mem(tls_cfg, mem_ptr, length) + Debug "Cert:"+*Settings\Cert + mem_ptr = tls_load_file(*Settings\Cert, @length) + If Not mem_ptr : tls_config_free(tls_cfg) : ProcedureReturn -3 : EndIf + tls_config_set_cert_mem(tls_cfg, mem_ptr, length) + If Len(*Settings\Password) > 0 + Debug "Key:"+*Settings\Key + " Password:"+*Settings\Password + mem_ptr = tls_load_file_pw(*Settings\Key, @length, *Settings\Password) + If Not mem_ptr : tls_config_free(tls_cfg) : ProcedureReturn -4 : EndIf + tls_config_set_key_mem(tls_cfg, mem_ptr, length) + Else + Debug "Key:"+*Settings\Key + mem_ptr = tls_load_file(*Settings\Key, @length) + If Not mem_ptr : tls_config_free(tls_cfg) : ProcedureReturn -5 : EndIf + tls_config_set_key_mem(tls_cfg, mem_ptr, length) + EndIf + tls_ctx = tls_server() + Debug "TLS Server obj:"+Str(tls_ctx) + If Not tls_ctx : tls_config_free(tls_cfg) : ProcedureReturn -6 : EndIf + returns = tls_configure(tls_ctx, tls_cfg) + Debug "Configure Returns:"+Str(returns) + If returns <> 0 :Debug ErrorTLSSrv(): tls_free(tls_ctx) : tls_config_free(tls_cfg) : ProcedureReturn -7 : EndIf + ProcedureReturn 1 + EndProcedure + + Procedure WaitTLSSocket(ServerSocket.i, TLSID.i = 0) + Protected sockID.i , tlssID.i, cctx + sockID = lsocket::WaitSocket(ServerSocket) + If sockID < 0 : ProcedureReturn -1 : EndIf + tlssID = tls_accept_socket(tls_ctx, @cctx, sockID) + If tlssID = -1 : ProcedureReturn -2 : EndIf + ProcedureReturn cctx + EndProcedure + + Procedure ReadTLSSocket(Connection.i, Buffer, Length.i) + Protected Received.i + + Received = tls_read(Connection, Buffer, Length) + ProcedureReturn Received + EndProcedure + + Procedure WriteTLSSocket(Connection.i, Buffer, Length.i) + Protected Received.i + Received = tls_write(Connection, Buffer, Length) + ProcedureReturn Received + + EndProcedure + + Procedure CloseTLSSocket(Connection.i) + tls_close(Connection) + EndProcedure + + Procedure.s ErrorTLSSrv(TLSID.i = 0) + Protected Error.s + Error = PeekS(tls_error(tls_ctx),-1,#PB_Ascii) + ProcedureReturn Error + EndProcedure + + Procedure.s ErrorTLSCli(Connection.i) + Protected Error.s + Error = PeekS(tls_error(Connection),-1,#PB_Ascii) + ProcedureReturn Error + EndProcedure + + Procedure CloseTLS(TLSID.i = 0) + tls_free(tls_ctx) + tls_config_free(tls_cfg) + EndProcedure + +EndModule diff --git a/lweb.pbi b/lweb.pbi index 53ea530..d0b4757 100644 --- a/lweb.pbi +++ b/lweb.pbi @@ -8,6 +8,8 @@ ;* +XIncludeFile "ltls.pbi" + Module lhs_web ;******************************** ;* @@ -37,7 +39,14 @@ Module lhs_web Global.i conf_cache_time = 120 ;120Sekunden Global.i conf_cache_maxsize = 1 ;1 Mbyte Global.i conf_cache_current = 0 - Global.i conf_cache_enable = 1 + Global.i conf_cache_enable = 1 + Global.i conf_TLS_Port = 8443 + Global.s conf_TLS_binding = "127.0.0.1" + Global.i conf_TLS_enable = 0 ;SSL Server + Global.s conf_TLS_CA = "" + Global.s conf_TLS_Cert = "" + Global.s conf_TLS_Key = "" + Global.s conf_TLS_Key_Pass = "" Enumeration s_client_do ;client_do_cli #CLI_DO_NOP ;Keine Arbeit @@ -75,13 +84,13 @@ Module lhs_web ;* vergrössert wird nach abgeschlossener Arbeit wieder auf Default gesetzt. ;* Structure s_client_memory - Buffer.i + *Buffer Initialized.b Size.i EndStructure Structure s_file_cache - Buffer.i + *Buffer Size.i Timer.i Is.i @@ -91,11 +100,13 @@ Module lhs_web client_id.i client_do_cli.i client_do_srv.i + client_ssl.i ;Client ist von einem SSL Server client_mutex.i client_thread.i List datenbuffer.s_client_memory() client_test_cli.i client_test_srv.i + client_cctx.i EndStructure Structure s_request_handler @@ -138,6 +149,7 @@ Module lhs_web ;* Declare server(network_server_id.i) + Declare server_SSL(network_server_id.i) Declare client(network_client_id.i) Declare AddFileToCache(MemoryID.i, FileName.s, Size.i) Declare FileCache(Information.i) @@ -153,6 +165,8 @@ Module lhs_web Select parameter Case #conf_port conf_port = Val(setting) + Case #conf_TLS_Port + conf_TLS_Port = Val(setting) Case #conf_binding If IsIPStringValid(setting) conf_binding = setting @@ -160,6 +174,23 @@ Module lhs_web conf_binding = "127.0.0.1" ProcedureReturn #False EndIf + Case #conf_TLS_Binding + If IsIPStringValid(setting) + conf_binding = setting + Else + conf_binding = "127.0.0.1" + ProcedureReturn #False + EndIf + Case #conf_TLS_CA + conf_TLS_CA = setting + Case #conf_TLS_Cert + conf_TLS_Cert = setting + Case #conf_TLS_Key + conf_TLS_Key = setting + Case #conf_TLS_Key_Pass + conf_TLS_Key_Pass = setting + Case #conf_TLS_Enable + conf_TLS_enable = Val(setting) Case #conf_defaultfile conf_defaultfile = setting Case #conf_basedir @@ -197,6 +228,8 @@ Module lhs_web ProcedureReturn Str(conf_server_type) Case #conf_port ProcedureReturn Str(conf_port) + Case #conf_TLS_Port + ProcedureReturn Str(conf_TLS_Port) Default ProcedureReturn "" EndSelect @@ -204,7 +237,31 @@ Module lhs_web Procedure start_server() Global NewMap m_clients.s_clients(conf_max_clients) + Protected settings.ltls::s_tls_server + Protected tlsresponse.i + + ;TODO: Create SSL Server + server_id = CreateNetworkServer(#PB_Any, conf_port, #PB_Network_TCP, conf_binding) + If conf_TLS_enable = 1 + server_SSL_id = lsocket::CreateSocket(conf_TLS_Port, conf_max_clients, lsocket::#SOCK_STREAM, lsocket::#AF_INET, conf_TLS_binding) + If server_SSL_id + settings\CA = conf_TLS_CA + settings\Cert = conf_TLS_Cert + settings\Key = conf_TLS_Key + settings\Password = conf_TLS_Key_Pass + tlsresponse = ltls::InitTLS(@settings) + Debug "TLS Fehler:"+Str(tlsresponse) + If tlsresponse > 0 + CreateThread(@server_SSL(), server_SSL_id) + Else + ProcedureReturn #False + EndIf + + Else + ProcedureReturn #False + EndIf + EndIf If server_id CreateThread(@server(), server_id) @@ -215,6 +272,42 @@ Module lhs_web EndProcedure + Procedure server_SSL(network_server_id.i) + ;************************** + ;* + ;* Hauptthread welcher den Netzwerkport verwaltet und den Datenfluss. + ;* Erstellt die Subthreads für Clients + ;* + Protected.i count_client + Protected.i client_id + + thread_alive = #True + + Debug "TLS Server Started." + Repeat + client_id = ltls::WaitTLSSocket(network_server_id) + Debug "New TLS Client:"+Str(client_id) + If client_id > 0 + If count_client <= conf_max_clients + m_clients(Str(client_id))\client_id = client_id + m_clients(Str(client_id))\client_do_cli = #CLI_DO_WaitDataReceive + m_clients(Str(client_id))\client_do_srv = #SRV_DO_DataReceive + m_clients(Str(client_id))\client_ssl = 1 + ;Thread erstellen + m_clients(Str(client_id))\client_thread = CreateThread(@client(), client_id) + count_client + 1 + Else + Debug "Max TLS Clients reached..." + CloseNetworkConnection(client_id) + EndIf + Else + Break + EndIf + + ForEver + EndProcedure + + Procedure server(network_server_id.i) ;************************** ;* @@ -230,7 +323,7 @@ Module lhs_web Debug "AllOk" Repeat ;Ist etwas passiert ? - + ;TODO: SSL Server network_event = NetworkServerEvent(network_server_id) Select network_event Case #PB_NetworkEvent_None @@ -331,7 +424,7 @@ Module lhs_web EndProcedure Procedure client(network_client_id.i) - Protected thread_cli_id = network_client_id + Protected thread_cli_id = network_client_id, sent Protected MyThreadJSON, ToCall, ToCallType Protected thread_temp_cache.s, thread_temp_cache_memory, temp_receivelength, thread_temp_decode_memory Protected thread_reasign @@ -361,7 +454,13 @@ Module lhs_web Debug "Buffer Initialisierung fehlgeschlagen." Break EndIf - temp_receivelength = ReceiveNetworkData(thread_cli_id, m_clients(Str(thread_cli_id))\datenbuffer()\Buffer, 65536) + ;TODO: SSL Read + If m_clients(Str(thread_cli_id))\client_ssl = 1 + temp_receivelength = ltls::ReadTLSSocket(thread_cli_id, m_clients(Str(thread_cli_id))\datenbuffer()\Buffer, 65536) + Else + temp_receivelength = ReceiveNetworkData(thread_cli_id, m_clients(Str(thread_cli_id))\datenbuffer()\Buffer, 65536) + EndIf + If temp_receivelength = -1 Debug "Empfangsfehler." Break @@ -377,7 +476,13 @@ Module lhs_web Debug "Buffer Initialisierung fehlgeschlagen." Break 2 EndIf - temp_receivelength = ReceiveNetworkData(thread_cli_id, m_clients(Str(thread_cli_id))\datenbuffer()\Buffer, 65536) + ;TODO: SSL Read 2 + If m_clients(Str(thread_cli_id))\client_ssl = 1 + temp_receivelength = ltls::ReadTLSSocket(thread_cli_id, m_clients(Str(thread_cli_id))\datenbuffer()\Buffer, 65536) + Else + temp_receivelength = ReceiveNetworkData(thread_cli_id, m_clients(Str(thread_cli_id))\datenbuffer()\Buffer, 65536) + EndIf + m_clients(Str(thread_cli_id))\datenbuffer()\Size = temp_receivelength counter_mem_buffers + 1 If temp_receivelength = -1 @@ -747,8 +852,14 @@ Module lhs_web EndIf DeleteElement(m_clients(Str(thread_cli_id))\datenbuffer()) ;Daten Senden... + ;TODO: SSL Send + If m_clients(Str(thread_cli_id))\client_ssl = 1 + sent = ltls::WriteTLSSocket(thread_cli_id, thread_buffer , thread_data_size+(thread_buffer_offset-thread_buffer)) + Else + sent = SendNetworkData(thread_cli_id, thread_buffer , thread_data_size+(thread_buffer_offset-thread_buffer)) + EndIf - If SendNetworkData(thread_cli_id, thread_buffer , thread_data_size+(thread_buffer_offset-thread_buffer)) = thread_data_size+(thread_buffer_offset-thread_buffer) + If sent = thread_data_size+(thread_buffer_offset-thread_buffer) ;Ok ;Debug "Gesendet:" + PeekS(thread_buffer,thread_buffer_length, #PB_Ascii) FreeMemory(thread_buffer) @@ -1000,7 +1111,7 @@ Module lhs_web ProcedureReturn 0 EndProcedure - Procedure.s MapToJSONString(Map ConvertMap.s()) + Procedure.s MapStringToJSONString(Map ConvertMap.s()) Protected MyJSON Protected.s Response MyJSON = CreateJSON(#PB_Any) diff --git a/lweb_header.pbi b/lweb_header.pbi index 64ac3dd..be74489 100644 --- a/lweb_header.pbi +++ b/lweb_header.pbi @@ -29,6 +29,13 @@ DeclareModule lhs_web #conf_max_clients #conf_server_type #conf_cache_enable + #conf_TLS_CA + #conf_TLS_Cert + #conf_TLS_Key + #conf_TLS_Key_Pass + #conf_TLS_Port + #conf_TLS_Binding + #conf_TLS_Enable EndEnumeration Enumeration cli_handler 1 @@ -83,7 +90,7 @@ DeclareModule lhs_web 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.s MapStringToJSONString(Map ConvertMap.s()) Declare IsIPStringValid(Adress.s) EndDeclareModule \ No newline at end of file diff --git a/server_example.pb b/server_example.pb index 7bb36ab..8ec2a73 100644 --- a/server_example.pb +++ b/server_example.pb @@ -20,10 +20,16 @@ XIncludeFile "lweb.pbi" Define counter, v_lweb_srv_stop -lhs_web::set_config(lhs_web::#conf_port, "8096") +lhs_web::set_config(lhs_web::#conf_port, "8081") ;lhs_web::set_config(lhs_web::#conf_binding, "127.0.0.1") lhs_web::set_config(lhs_web::#conf_binding, "0.0.0.0") - +lhs_web::set_config(lhs_web::#conf_TLS_CA, "/home/renlin/dev/libressl/sample/test_ca.pem") +lhs_web::set_config(lhs_web::#conf_TLS_Cert, "/home/renlin/dev/libressl/sample/test_server_cert.pem") +lhs_web::set_config(lhs_web::#conf_TLS_Key, "/home/renlin/dev/libressl/sample/test_server_key.pem") +lhs_web::set_config(lhs_web::#conf_TLS_Key_Pass, "test-server-pass") +lhs_web::set_config(lhs_web::#conf_TLS_Binding, "127.0.0.1") +lhs_web::set_config(lhs_web::#conf_TLS_Port, "8444") +lhs_web::set_config(lhs_web::#conf_TLS_Enable, "1") lhs_web::set_config(lhs_web::#conf_defaultfile, "/index.html") lhs_web::set_config(lhs_web::#conf_basedir, "/home/renlin/testweb/") lhs_web::set_config(lhs_web::#conf_error400, "integrated") @@ -50,7 +56,7 @@ Procedure.s Sample_Header(Map Header.s()) 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()) + ZumSenden = lhs_web::MapStringToJSONString(Response()) Debug "ZumSenden: " + ZumSenden ProcedureReturn ZumSenden EndProcedure @@ -74,7 +80,7 @@ Procedure.s Formular_Test(Map Header.s(), ContentData.s) 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()) + ZumSenden = lhs_web::MapStringToJSONString(Response()) Debug "ZumSenden: " + ZumSenden ProcedureReturn ZumSenden @@ -105,7 +111,7 @@ Procedure.s Php_Test(Map Header.s(), ContentData.s) 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()) + ZumSenden = lhs_web::MapStringToJSONString(Response()) Debug "ZumSenden: " + ZumSenden ProcedureReturn ZumSenden EndProcedure @@ -139,7 +145,9 @@ EndIf counter = 0 OpenConsole("Test") -PrintN("Webserver an Port:"+lhs_web::get_config(lhs_web::#conf_port)) +PrintN("Webserver") +PrintN("HTTP an Port:"+lhs_web::get_config(lhs_web::#conf_port)) +PrintN("HTTPS an Port:"+lhs_web::get_config(lhs_web::#conf_TLS_Port)) PrintN("Press Enter to Exit") Input()