Quand un navigateur fait une requête HTTP, cela ressemble à ceci:
GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close
… À laquelle le serveur doit envoyer une réponse qui ressemble à ceci:
HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337
<!DOCTYPE html>
<html>
<head><title>cats - Google Search</title>
<body>
<h1>About 415,000,000 results</h1>
…
</body>
</html>
Tout code exécuté sur le serveur qui écoute les demandes sur un socket TCP, lit la demande et répond avec la réponse appropriée suffira. Une méthode idiote consiste simplement à envoyer une réponse prédéfinie à quiconque se connecte au port TCP 80 à l'aide d'un script shell:
$ nc -l 8000 <<'RESPONSE'
HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337
<!DOCTYPE html>
<html>
<head><title>cats - Google Search</title>
<body>
<h1>About 415,000,000 results</h1>
…
</body>
</html>
RESPONSE
Bien entendu, cette technique semble à peine conforme au protocole HTTP .
Ce programme Python simple, qui utilise la http.server
bibliothèque de Python 3, constitue une avancée supplémentaire à partir de cette réponse prédéfinie.
#!/usr/bin/python3
import http.server
class Handler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
payload = '<!DOCTYPE html>... insert cats here ...'.encode('UTF-8')
self.send_response(200)
self.send_header('Content-Type', 'text/html; charset=UTF-8')
self.send_header('Content-Length', len(payload))
self.end_headers()
self.wfile.write(payload)
http.server.HTTPServer(('', 80), Handler).serve_forever()
Le serveur HTTP peut être écrit dans n'importe quelle langue. ce n'est qu'un exemple. Évidemment, cet exemple est très rudimentaire. La charge utile est codée en dur - le programme ignore complètement le contenu de la requête - l'URL, la chaîne de requête, l'en-tête Accept-Language, etc. Vous pouvez ajouter du code pour générer des réponses significatives basées sur la requête, complexe. En outre, les programmeurs préfèrent se concentrer sur l'écriture de l'application Web sans avoir à s'inquiéter des détails de la gestion d'une requête HTTP.
Une solution plus appropriée consisterait à utiliser un serveur Web, tel que Apache HTTPD , IIS ou nginx . Un serveur Web est simplement un programme qui écoute sur les sockets TCP appropriés, accepte plusieurs demandes (éventuellement simultanément) et décide comment générer une réponse en fonction de l'URL de la demande, des en-têtes et d'autres règles. Idéalement, de nombreux détails, tels que SSL, le contrôle d'accès et les limites de ressources, sont gérés via la configuration plutôt que par le code. La plupart du temps, le serveur Web formulera une réponse composée uniquement du contenu des fichiers du système de fichiers.
Pour le contenu dynamique, cependant, le serveur Web peut être configuré pour exécuter du code afin de générer la réponse. CGI est l’un des mécanismes permettant de le faire: le serveur définit certaines variables d’environnement en fonction de la demande, exécute un programme et copie sa sortie dans le socket TCP. Une solution légèrement plus sophistiquée consisterait à avoir un module qui ajoute la prise en charge du serveur Web pour appeler du code dans un autre langage de programmation (par exemple, mod_php pour Apache ). Une autre option consiste à écrire le serveur Web dans la même langue que l'application Web, auquel cas l'envoi de la demande est simplement un appel de fonction. C'est le cas des serveurs node.js et Java tels que Apache Tomcat .
Le choix de la technologie dépend vraiment de vous et dépend du langage de programmation que vous préférez utiliser, de l’environnement d’hébergement à votre disposition, des exigences de performances, de l’opinion publique et des modes à la mode. CGI, par exemple, n’a pas été privilégié ces derniers temps, car la nécessité de lancer des programmes externes limite l’évolutivité.