web-dev-qa-db-fra.com

Activer le contrôle d'accès sur un serveur HTTP simple

J'ai le script shell suivant pour un serveur HTTP très simple:

#!/bin/sh

echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000

Je me demandais comment activer ou ajouter un en-tête CORS like Access-Control-Allow-Origin: * sur ce serveur?

91
MChan

Malheureusement, le simple serveur HTTP est vraiment aussi simple qu'il ne permet aucune personnalisation, en particulier pour les en-têtes qu'il envoie. Vous pouvez cependant créer vous-même un serveur HTTP simple, en utilisant la plupart de SimpleHTTPRequestHandler, et ajouter simplement l'en-tête souhaité.

Pour cela, créez simplement un fichier simple-cors-http-server.py (ou autre) et, en fonction de la version Python que vous utilisez, insérez l’un des codes suivants.

Alors vous pouvez faire python simple-cors-http-server.py et il lancera votre serveur modifié qui définira l'en-tête CORS pour chaque réponse.

Avec le Shebang en haut, rendez le fichier exécutable et placez-le dans votre PATH. Vous pouvez simplement l'exécuter à l'aide de simple-cors-http-server.py.

Solution Python 3

Python 3 utilise SimpleHTTPRequestHandler et HTTPServer à partir du module http.server pour exécuter le serveur:

#!/usr/bin/env python3
from http.server import HTTPServer, SimpleHTTPRequestHandler, test
import sys

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __== '__main__':
    test(CORSRequestHandler, HTTPServer, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)

Solution Python 2

Python 2 utilise SimpleHTTPServer.SimpleHTTPRequestHandler et le module BaseHTTPServer pour exécuter le serveur.

#!/usr/bin/env python2
from SimpleHTTPServer import SimpleHTTPRequestHandler
import BaseHTTPServer

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __== '__main__':
    BaseHTTPServer.test(CORSRequestHandler, BaseHTTPServer.HTTPServer)

Solution Python 2 & 3

Si vous avez besoin de compatibilité pour Python 3 et Python 2, vous pouvez utiliser ce script polyglotte qui fonctionne dans les deux versions. Il essaie d’abord d’importer à partir des emplacements Python 3, puis retourne à Python 2:

#!/usr/bin/env python
try:
    # Python 3
    from http.server import HTTPServer, SimpleHTTPRequestHandler, test as test_orig
    import sys
    def test (*args):
        test_orig(*args, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)
except ImportError: # Python 2
    from BaseHTTPServer import HTTPServer, test
    from SimpleHTTPServer import SimpleHTTPRequestHandler

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __== '__main__':
    test(CORSRequestHandler, HTTPServer)
143
poke

Essayez une alternative comme http-server

Comme SimpleHTTPServer n’est pas vraiment le type de serveur que vous déployez en production, je suppose ici que vous vous moquez de savoir quel outil vous utilisez tant que vous exposez vos fichiers à http://localhost:3000 avec les en-têtes CORS ligne de commande simple

# install (it requires nodejs/npm)
npm install http-server -g

#run
http-server -p 3000 --cors

Quelques outils connexes qui pourraient vous être utiles

  • ngrok : lors de l'exécution de ngrok http 3000, il crée une URL https://$random.ngrok.com qui permet à quiconque d'accéder à votre serveur http://localhost:3000. Il peut exposer au monde ce qui fonctionne localement sur votre ordinateur (y compris les backends/apis locaux)

  • localtunnel : presque identique à ngrok

  • now : lors de l'exécution de now, il télécharge vos actifs statiques en ligne et les déploie vers https://$random.now.sh. Ils restent en ligne pour toujours, sauf décision contraire de votre part. Le déploiement est rapide (sauf le premier) grâce à diffing. Il convient désormais au déploiement de code SPA/frontend de production. Il peut également déployer des applications Docker et NodeJS. Ce n'est pas vraiment gratuit, mais ils ont un plan gratuit.

73
Sebastien Lorber

J'ai eu le même problème et est venu à cette solution:

class Handler(SimpleHTTPRequestHandler):
    def send_response(self, *args, **kwargs):
        SimpleHTTPRequestHandler.send_response(self, *args, **kwargs)
        self.send_header('Access-Control-Allow-Origin', '*')

J'ai simplement créé une nouvelle classe héritant de SimpleHTTPRequestHandler qui ne modifie que la méthode send_response.

0
Hugo Trentesaux