
Edit 2 : En fait si

Edit 3 : Le code a été mis à jour et n'est donc plus la version erronée
Avertissement : le présent Sherman est sur le point de planter totalement par overflow de ras le bol, et de renoncer à tout jamais à faire un serveur Web en pb

Ca fait des millions d'heures (environ 9 au total) que j'essaie de faire un serveur Web trés basique en PB. Ledit serveur doit :
- Être capable de répondre à une requête GET pour renvoyer une page.
Pourtant ca fait environ 3 codes que je jette par dépit de les faire fonctionner...

Voici un header :
Code : Tout sélectionner
HTTP/1.1 200 OK
Date: Mon, 23 Jan 2017 <heure> GMT
Server: PureServer Marche po 0.0
Content-Type: text/html
Content-Length: <un certain nombre>






Dans le meilleur des cas (sans aucun header), le code source est affiché, comme du plain text (normal), dans le pire (avec le header) seule une partie de celui-ci est effectivement envoyée au navigateur, puis la connection se ferme avant que tout ne soit chargé, ou alors, la requête boucle sur le début du header et l'affiche en texte brut... Bref RIEN à comprendre...

La page Web, aussi helloworldement simple soit-elle , ne s'affiche jamais

Voici un des codes de test, le premier, celui qui affiche le texte brut :
Le code corrigé et fonctionnel de la premiére version du serveur :
Code : Tout sélectionner
#Server = 42
#Port = 1946
#Root$ = "www"
Declare HTMLRequestProvider(Request$)
Declare URLtoFile(RootPath$,URL$)
Global gFileLen
Structure HTML_REQUEST
Method.s ;Méthode (GET/POST/PUT...)
File.s ;Fichier demandé
ProtocolVersion.s ;Version d'HTTP
EndStructure
Structure REQUEST
Req.HTML_REQUEST ;Requête HTML
Sender.s ;Envoyeur (IP)
BrowserInfos.s ;Infos aditionnelles
EndStructure
OpenConsole("Serveur Web PureWeb v0.1")
ConsoleColor(0,15)
PrintN(" Web Server PureWeb v 0.1b ")
ConsoleColor(15,0)
If Not InitNetwork()
MessageRequester("Serveur local","Erreur fatale : impossible d'initialiser le réseau.") : End
EndIf
If CreateNetworkServer(#Server,#Port)
PrintN("Server running on port : "+#Port)
ConsoleTitle("Serveur Web PureWeb v0.1 , port : "+Str(#Port))
;blabla de merde ici
Repeat
Sevent = NetworkServerEvent(#Server)
Select Sevent
Case #PB_NetworkEvent_Connect;Un client est connecté
ClientID = EventClient()
ClientIP = GetClientIP(ClientID)
PrintN(FormatDate("[%hh:%ii:%ss - %dd/%mm/%yyyy]",Date())+" New client connected :"+Str(ClientIP))
Case #PB_NetworkEvent_Data ;Un client envoie des données/requêtes
ClientID = EventClient()
ClientIP = GetClientIP(ClientID)
PrintN(FormatDate("[%hh:%ii:%ss - %dd/%mm/%yyyy]",Date())+" IP : "+IPString(ClientIP)+" - Client has sent a packet.")
PrintN("Receiving datas...")
ConsoleColor(7,0)
*Buffer = AllocateMemory(1024);Buffer pour requête
If Not *Buffer : Debug "erreur" : EndIf
ReceiveNetworkData(ClientID,*Buffer,1024);On récupére la requête reçue
Request$ = PeekS(*Buffer,1024,#PB_UTF8)
PrintN(Request$)
*ptr_Result = HTMLRequestProvider(Request$) ;On récupére la page associée à l'URL aprés résolution de la requête
If *ptr_Result
ConsoleColor(0,7)
PrintN("=======================Sended file : ==============================")
ConsoleColor(7,0)
Print(PeekS(*ptr_Result,-1,#PB_UTF8))
SendNetworkData(ClientID,*ptr_Result,gFileLen) ;On envoie la page
ConsoleColor(0,7)
PrintN("===================================================================")
ConsoleColor(7,0)
Else
ConsoleColor(12,0)
PrintN("404 file not found.")
*ptr_Result = URLtoFile(#Root$,"/error/404.html")
SendNetworkData(ClientID,*ptr_Result,gFileLen)
EndIf
ConsoleColor(15,0)
CloseNetworkConnection(ClientID)
EndSelect
ForEver
Else
MessageRequester("Serveur local","Erreur ! Impossible de créer le serveur Web sur le port "+#Port+".",#PB_MessageRequester_Error)
EndIf
;-Procédures
Procedure HTMLRequestProvider(Request$)
Protected Request.REQUEST, *ptrPage
;Dissection des informations de la requête, possibilité de s'en servir pour personnaliser/pour logger
HTMLRequest$ = StringField(Request$,1,#LF$)
Request\Sender = StringField(Request$,2,#LF$)
Request\BrowserInfos = StringField(Request$,3,#LF$)
Request\Req\Method = StringField(HTMLRequest$,1," ")
Request\Req\File = StringField(HTMLRequest$,2," ")
Request\Req\ProtocolVersion = StringField(HTMLRequest$,3," ")
If Request\Req\File = "" Or Request\Req\File = "/" ;Pas de page spécifiée? On affiche "index"
*ptrPage = URLtoFile(#Root$,"index.html")
Else
*ptrPage = URLtoFile(#Root$,Request\Req\File) ;Sinon on charge la page demandée
EndIf
ProcedureReturn *ptrPage
EndProcedure
Procedure.s GetDate()
Hour$ = FormatDate("%hh:%ii:%ss",Date())
Year$ = Str(Year(Date()))
DayOfMonth$ = Str(Day(Date()))
DayOfWeek$ = StringField("Sun,Mon,Tue,Wed,Thu,Fri,Sat", DayOfWeek(Date()) + 1, ",")
Month$ = StringField("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", Month(Date()), ",")
ProcedureReturn DayOfWeek$ + ", " + DayOfMonth$ + " " + Month$ + " " + Year$ + " " + Hour$
EndProcedure
Procedure.s FileExtension(File$)
ProcedureReturn "." + StringField(File$, CountString(File$,".")+1, ".")
EndProcedure
Procedure URLtoFile(RootPath$, URL$)
; ReplaceString(URL$,"/","\",#PB_String_InPlace)
File = ReadFile(#PB_Any,RootPath$+URL$,#PB_File_SharedRead | #PB_UTF8)
If File
gFileLen = Lof(File)
Debug URL$ + gFileLen
*FileBuffer = AllocateMemory(gFileLen)
If *FileBuffer
htmlLen = ReadData(File,*FileBuffer,gFileLen)
EndIf
CloseFile(File)
; filecontent$ = PeekS(*FileBuffer,gFileLen,#PB_UTF8)
; Debug "Mémoire fichier : "+filecontent$
Select FileExtension(URL$)
Case ".html"
ContentType$ = "text/html"
Case ".gif"
ContentType$ = "image/gif"
Case ".jpg"
ContentType$ = "image/jpeg"
Case ".png"
ContentType$ = "image/png"
Case ".txt"
ContentType$ = "text/plain"
Case ".zip"
ContentType$ = "application/zip"
Case ".css"
ContentType$ = "text/css"
Case ".js"
ContentType$ = "application/javascript"
Case ".xml"
ContentType$ = "application/xml"
Case ".pdf"
ContentType$ = "application/pdf"
Case ".exe"
ContentType$ = "application/octet-stream"
Case ".ogg"
ContentType$ = "application/ogg"
Case ".mp3"
ContentType$ = "audio/mpeg"
Default
ContentType$ = "application/octet-stream"
EndSelect
header$ = "HTTP/1.1 200 OK" + #CRLF$+
"Date: "+GetDate()+"GMT" + #CRLF$+
"Server: PureServer v0.0" + #CRLF$+
"Content-Length: "+Str(gFileLen) + #CRLF$+
"Content-Type: "+ContentType$ + #CRLF$ + #CRLF$
headerLen = Len(header$)
gFileLen + headerLen
*Document = AllocateMemory(gFileLen)
*ptr = *Document
*ptr + PokeS(*Document,header$,headerLen,#PB_UTF8)
CopyMemory(*FileBuffer,*ptr,htmlLen)
FreeMemory(*FileBuffer)
ProcedureReturn *Document
Else
ProcedureReturn 0
EndIf
EndProcedure
Par dépit j'ai essayé le Atomic Web server qui est dans le dossier \Examples\Sources_Advanced de PB, qui biiiien évidemment ne marche pas non plus Lui,il est toujours cassé, mais c'est pas grave ^^ (aucune réaction à la requête, aucun affichage... Bref je preds pied et j'ai vraiement besoin d'aide, je suis dans le noir complet... je vais finir par abandonner cette idée et conclure qu'il est IMPOSSIBLE de faire un serveur en PB... Ben si en fait c'était possible
