Atomic web Serveur (Unicode)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Atomic web Serveur (Unicode)

Message par Kwai chang caine »

C'est impressionnant cette page CSS, avec même un test inclus 8O
Le WEB ça va vraiment très vite, pour moi le CSS la dernière fois que je me suis penché dessus c'était une liste d'instructions imbuvables.
Peut être qu'un jour j'arriverais à aimer le WEB.... :mrgreen:

Merci de ton sujet et de ce lien 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Atomic web Serveur (Unicode)

Message par Ar-S »

falsam a écrit : Lien pour rappel : http://109.13.115.206:6832/index.html
Mort pour le moment
Sinon je suis un peu babé sur ce coup.

Pourriez vous faire un exemple concret avec les variables adéquate.
Une fois que l'atomic web est lancé. Comment gère-t-il le contenu de la page index par exemple ?
Un input qui demande un NOM et selon la réponse renvoyée afficher Bienvenu admin si le NOM est admin ou "DESOLE MAUVAIS NOM" si la réponse n'est pas admin.

J'espère ne pas être à coté de la plaque mais j'avoue ne pas saisir le fonctionnement de la bête entre traitement local et en ligne.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Atomic web Serveur (Unicode)

Message par djes »

Pfiou, c'est du boulot d'expliquer tout ça. Tu connais un peu le client/serveur, les requêtes http put/get ou pas du tout?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Atomic web Serveur (Unicode)

Message par falsam »

Ar-S a écrit :Mort pour le moment
De nouveau en ligne. Je coupe mon serveur le soir et je ne relance pas systématiquement.
Ar-S a écrit :Une fois que l'atomic web est lancé. Comment gère-t-il le contenu de la page index par exemple ?
Voici un extrait de la page index.html dans laquelle se trouve deux variables {{userip}} pour l'adresse IP et {{countviews}} pour le compteur de vues.

Code : Tout sélectionner

<!-- Show client ip -->
...
<div class="w3-center">
	<p>Votre adresse ip <strong>{{userip}}</strong></p>
</div>
....
<!-- Footer -->
<div class="w3-bottom">
	<p class="w3-padding-medium">Powered by <a href="http://www.w3schools.com/w3css/default.asp" target="_blank">w3.css</a> 
	& <a href="http://purebasic.fr" target="_blank">PureBasic</a>
	- {{countviews}} views</p>
</div>
1 - Le contenu de la page demandée par l'utilisateur est dans une mémoire tampon.

Code : Tout sélectionner

*BufferOffset
2 - Comme je ne sais pas faire autrement, je place cette zone mémoire dans un string (BufferOffset.s).

Code : Tout sélectionner

BufferOffset = PeekS(*BufferOffset, -1, #PB_UTF8)
3 - Je remplace les variables par les valeurs souhaiter. Exemple avec l'adresse IP et le compteur de vue.

Code : Tout sélectionner

Result = ReplaceString(BufferOffset, "{{userip}}", IPString(GetClientIP(ClientID))) : BufferOffset = Result
Result = ReplaceString(BufferOffset, "{{countviews}}", Str(CountViews\count)) 
Le résultat contenu est de nouveau placé dans une mémoire tampon puis envoyé au client (Le navigateur) avec la commande SendNetworkData().
Ar-s a écrit :Un input qui demande un NOM et selon la réponse renvoyée afficher Bienvenu admin si le NOM est admin ou "DESOLE MAUVAIS NOM" si la réponse n'est pas admin.
je n'ai pas encore traités les données POST mais j'ai mon idée sachant que le serveur est capable de reconnaître la page demandée.

Parser une chaine connect.html?login=admin&password=1234 n'est pas compliqué

Etant encore en phase de test je ne publie pas encore le code.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Atomic web Serveur (Unicode)

Message par Ar-S »

Merci, c'est déjà une bonne base qui m'a décanté le cerveau. :P
ça reste pas simple tout de même...
Ton code tu le mets dans le fichier atomic ou tu l'insères via un include ?
@Djes
client/serveur on va dire que je connais le principe.
Le client interagit sur une page (form, jeu etc..), tout est balancé au serveur qui traite, valide et renvois les nouvelles données ?

J'ai ma page web

Code : Tout sélectionner

<!DOCTYPE html>
<html>
<head>
<link href="ars.css" rel="stylesheet" />
<title>Atomic Web Server Ar-S Test</title>
</head>
<body>

<div class="titre"> Atomic Web Server (<em>Unicode</em>) </div>

<p style='text-align:center'>Ceci est la première page de votre site web. / This is the first page of your website.</p>
<p> IP : {{userip}} - Visite : {{countviews}}

</body>
</html>
Mon CSS: ars.css

Code : Tout sélectionner

<style type="text/css">
body{ text-align:center;  font-size:12px; background-color:#A3B0C8; min-width:960px; }
.titre{ background-color:#A3B0C8; position:relative; width:960px; text-align:center; margin:0 auto; height:35px; font-size:24px; text-shadow: 1px 1px #dddddd;}
</style>
Si tu as le temps de coder l'atomic pour l'exemple.
Merci
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Atomic web Serveur (Unicode)

Message par djes »

:)
Ta page web ne demande rien de dynamique au serveur. C'est une page "statique", le serveur va l'envoyer telle quelle, éventuellement tu peux le programmer pour qu'il repère dans le code source certaines choses et qu'il les modifie avant de l'envoyer... Non, pour faire un formulaire, il faut au moins que tu aies la balise <form> qui permet d'interroger le serveur. C'est la base. Pour aller plus loin, on a, à partir du javascript et d'extensions des navigateurs, créé l'AJAX (j'imagine déjà les commentaires de KCC...). Ça permet de créer une page dynamique, qui va interroger régulièrement le serveur, et se modifier en fonction des réponses. Javascript est le langage "client" qui modifie la page. Le serveur est le même, il attend une requête, et envoie une réponse, comme d'habitude.

Le fait que le serveur soit programmé en Purebasic, plutôt qu'en C ou en Java n'a aucune importance, du moment qu'il sait recevoir des requêtes HTTP et envoyer des réponses HTTP. Et ça, c'est juste un protocole, un langage. Il suffit de créer un programme qui sait comprendre certaines commandes et répondre de la bonne façon, comme le fait l'atomic web server.

Quant au CSS, ce n'est qu'une façon pratique de formater les éléments d'une page, c'est une feuille de style. On nomme les styles, on peut les utiliser x fois dans un document, et quand on change le style, toutes les occurrences sont changées automatiquement. Le CSS permet en outre de redéfinir toutes les balises HTML, un peu comme si à chaque fois qu'on utilisait print(), on écrivait en rouge ou en vert selon un fichier de préférences...
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Atomic web Serveur (Unicode)

Message par falsam »

A chaque lecture de page HTML, Atomic Web Server récupère la page à lire contenue le buffer de lecture en testant ce qui se trouve après "GET /". Exemple : GET /index.html HTTP/1/1
Le code d'extraction est celui-çi : https://github.com/falsam/AtomicWebServ ... pb#L78-L87

Contrainte : Dans une prochaine version des variables pourraient être incluses
Exemple : GET /index.html?login=admin&password=1234 HTTP/1/1

Exemple de ce que peut contenir la variable Buffer.s
GET /index.html HTTP/1.1
Host: 109.13.115.206:6834
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
GET /style.css HTTP/1.1
Host: 109.13.115.206:6834
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/css,*/*;q=0.1
Referer: http://109.13.115.206:6834/index.html
Accept-Encoding: gzip, deflate, sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
GET /favicon.ico HTTP/1.1
Host: 109.13.115.206:6834
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: image/webp,image/*,*/*;q=0.8
Referer: http://109.13.115.206:6834/index.html
Accept-Encoding: gzip, deflate, sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
J'aimerais pouvoir :
- Simplifier la procédure d'extraction,
- Continuer à stocker la page à lire dans la variable RequestedFile
- Stocker les variables reçus (Si variables) dans la variable RequestedVariable.

Merci de votre aide.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Atomic web Serveur (Unicode)

Message par falsam »

J'ai finalement remplacé

Code : Tout sélectionner

;Extract page html from GET /yourpage.html HTTP/1.1
MaxPosition = FindString(Buffer, Chr(13), 5)
Position = FindString(Buffer, " ", 5)
If Position < MaxPosition
  RequestedFile = Mid(Buffer, 6, Position-5)      ; Automatically remove the leading '/'
  RequestedFile = RTrim(RequestedFile)
Else
  RequestedFile = Mid(Buffer, 6, MaxPosition-5)   ; When a command like 'GET /' is sent..
par

Code : Tout sélectionner

RequestedFile = Trim(Mid(StringField(Buffer, 1, "HTTP"), 6))
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Atomic web Serveur (Unicode)

Message par djes »

Oui voilà, c'est juste une recherche et extraction de chaîne. Mes codes datent, et sont bourrés de trim, de stringfield et autres. Sinon, une url est toujours formée de la même façon, alors ce n'est pas trop dur. Ensuite il faut repérer les &, le ?, les =
Il doit y avoir un code quelque part pour traiter une requête post.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Atomic web Serveur (Unicode)

Message par falsam »

Merci djes. je suis en mode decryptage de cet exemple qui je le rappelle est fourni avec PB.

Voila qui m'interpelle et peut être que tu peux me répondre. Pourquoi avant de faire appel à la procédure BuildRequestHeader() on ajoute 200 à la taille de *FileBuffer

FileLength contient la taille de la page à envoyer au client

Code : Tout sélectionner

*FileBuffer   = AllocateMemory(FileLength + 200) ;MemoryStringLength(@ContentType))
*BufferOffset = BuildRequestHeader(*FileBuffer, FileLength, ContentType)
Rappel de la procédure

Code : Tout sélectionner

Procedure BuildRequestHeader(*FileBuffer, FileLength, ContentType.s)
  Protected Length
  Protected Week.s = "Sun, Mon,Tue,Wed,Thu,Fri,Sat"
  Protected MonthsOfYear.s = "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec" 
  
  Protected DayOfWeek.s = StringField("Sun, Mon,Tue,Wed,Thu,Fri,Sat", DayOfWeek(Date()) + 1, ",")
  Protected Day = Day(Date())
  Protected Month.s = StringField("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", Month(Date()), ",")
  Protected Year.s = Str(Year(Date()))
  Protected Time.s = FormatDate("%hh:%ii:%ss GMT", Date())
  
  Length = PokeS(*FileBuffer, "HTTP/1.1 200 OK" + #CRLF$, -1, #PB_UTF8)                                                             : *FileBuffer + Length
  Length = PokeS(*FileBuffer, "Date: " + DayOfWeek + ", " + Day + " " + Month + " " + Year + " " + Time  + #CRLF$, -1, #PB_UTF8)    : *FileBuffer + Length
  Length = PokeS(*FileBuffer, "Server: "+ Title + #CRLF$, -1, #PB_UTF8)                                                             : *FileBuffer + Length
  Length = PokeS(*FileBuffer, "Content-Length: " + Str(FileLength) + #CRLF$, -1, #PB_UTF8)                                          : *FileBuffer + Length
  Length = PokeS(*FileBuffer, "Content-Type: " + ContentType + #CRLF$, -1, #PB_UTF8)                                                : *FileBuffer + Length
  Length = PokeS(*FileBuffer, #CRLF$, -1, #PB_UTF8)                                                                                 : *FileBuffer + Length
  
  ProcedureReturn *FileBuffer
EndProcedure
Au final *FileBuffer ne contient rien à par #CRLF ? ^^
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Atomic web Serveur (Unicode)

Message par Zorro »

il me semble me souvenir, que les '+200' sont la pour éviter un débordement possible du buffer
c'est une securité juste pour eviter un depassement de memoire ...

je dis ça de memoire ...
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Atomic web Serveur (Unicode)

Message par falsam »

Zorro a écrit :il me semble me souvenir, que les '+200' sont la pour éviter un débordement possible du buffer
c'est une securité juste pour eviter un depassement de memoire ...
Allons bon !! Est que cela voudrait dire que si je fais

Code : Tout sélectionner

FileLength = Lof(0)
alors le buffer crée avec cette taille ne sera pas forcément suffisant pour recevoir le contenu de se même fichier ? Ce + 200 me parait étrange mais il est vrai que si je supprime ce '+ 200' alors j'ai un IMA à l'exécution de la procédure BuildRequestHeader().

/me est perplexe et perturber :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Atomic web Serveur (Unicode)

Message par Zorro »

on avait deja abordé le sujet a propos de Allocatememory

http://www.purebasic.fr/french/viewtopi ... Memory+bug

une histoire d'unicode (encore ) et de caractere de fin de chaine ..
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Atomic web Serveur (Unicode)

Message par falsam »

Zorro a écrit :on avait deja abordé le sujet a propos de Allocatememory
Je l'avais oublié ce topic qui me remémore ces soucis d'allocation mémoire. Merci pour ce rappel. Je vais relire.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Atomic web Serveur (Unicode)

Message par JohnJohnsonSHERMAN »

C'est un probléme que j'ai eu aussi sur ma version de serveur Web... A mon avis, le +200 est là pour laisser de la place au header qui se met au début du buffer, avant le fichier.... Et on ne peut pas connaître par avance la taille du header... :) D'ou ce +200 qui laisse de la place au header en début de buffer.
On pourrait faire plus propre avec des CopyMemory()...
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Répondre