middleware.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. __package__ = 'archivebox.api'
  2. from django.http import HttpResponse
  3. class ApiCorsMiddleware:
  4. """Attach permissive CORS headers for API routes (token-based auth)."""
  5. def __init__(self, get_response):
  6. self.get_response = get_response
  7. def __call__(self, request):
  8. if request.path.startswith('/api/'):
  9. if request.method == 'OPTIONS' and request.META.get('HTTP_ACCESS_CONTROL_REQUEST_METHOD'):
  10. response = HttpResponse(status=204)
  11. return self._add_cors_headers(request, response)
  12. response = self.get_response(request)
  13. return self._add_cors_headers(request, response)
  14. return self.get_response(request)
  15. def _add_cors_headers(self, request, response):
  16. origin = request.META.get('HTTP_ORIGIN')
  17. if not origin:
  18. return response
  19. response['Access-Control-Allow-Origin'] = '*'
  20. response['Access-Control-Allow-Methods'] = 'GET, POST, PUT, PATCH, DELETE, OPTIONS'
  21. response['Access-Control-Allow-Headers'] = (
  22. 'Authorization, X-ArchiveBox-API-Key, Content-Type, X-CSRFToken'
  23. )
  24. response['Access-Control-Max-Age'] = '600'
  25. return response