Page 2 sur 4

Re: Atomic web Serveur (Unicode)

Publié : sam. 11/févr./2017 9:49
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)

Re: Atomic web Serveur (Unicode)

Publié : sam. 11/févr./2017 11:49
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.

Re: Atomic web Serveur (Unicode)

Publié : sam. 11/févr./2017 15:11
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?

Re: Atomic web Serveur (Unicode)

Publié : sam. 11/févr./2017 17:43
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.

Re: Atomic web Serveur (Unicode)

Publié : sam. 11/févr./2017 20:03
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

Re: Atomic web Serveur (Unicode)

Publié : sam. 11/févr./2017 21:01
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...

Re: Atomic web Serveur (Unicode)

Publié : sam. 11/févr./2017 22:05
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.

Re: Atomic web Serveur (Unicode)

Publié : dim. 12/févr./2017 12:28
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))

Re: Atomic web Serveur (Unicode)

Publié : dim. 12/févr./2017 13:28
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.

Re: Atomic web Serveur (Unicode)

Publié : dim. 12/févr./2017 13:44
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 ? ^^

Re: Atomic web Serveur (Unicode)

Publié : dim. 12/févr./2017 14:09
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 ...

Re: Atomic web Serveur (Unicode)

Publié : dim. 12/févr./2017 15:35
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:

Re: Atomic web Serveur (Unicode)

Publié : dim. 12/févr./2017 15:44
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 ..

Re: Atomic web Serveur (Unicode)

Publié : dim. 12/févr./2017 15:55
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.

Re: Atomic web Serveur (Unicode)

Publié : dim. 12/févr./2017 17:26
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()...