Skip to content

Commit 1546129

Browse files
authored
set cors when running web server (#128)
* set cors to make pyscript run safely * add test to check that the patched FolderBasedHTTPRequestHandler actually patches all CORS headers correctly * add missing Cross-Origin-Resource-Policy header --------- Co-authored-by: Fabio Pliger <fpliger@anaconda.com>
1 parent f48c452 commit 1546129

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

src/pyscript/plugins/run.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ class FolderBasedHTTPRequestHandler(SimpleHTTPRequestHandler):
3030
def __init__(self, *args, **kwargs):
3131
super().__init__(*args, directory=folder, **kwargs)
3232

33+
def end_headers(self):
34+
self.send_header("Cross-Origin-Opener-Policy", "same-origin")
35+
self.send_header("Cross-Origin-Embedder-Policy", "require-corp")
36+
self.send_header("Cross-Origin-Resource-Policy", "cross-origin")
37+
SimpleHTTPRequestHandler.end_headers(self)
38+
3339
return FolderBasedHTTPRequestHandler
3440

3541

tests/test_run_cli_cmd.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
from __future__ import annotations
22

3+
import http.client
4+
import http.server
5+
import threading
36
from pathlib import Path
47
from unittest import mock
58

69
import pytest
710
from utils import CLIInvoker, invoke_cli # noqa: F401
811

12+
from pyscript.plugins.run import get_folder_based_http_request_handler
13+
914
BASEPATH = str(Path(__file__).parent)
1015

1116

@@ -103,3 +108,32 @@ def test_run_server_with_valid_combinations(
103108
assert result.exit_code == 0
104109
# EXPECT start_server_mock function to be called with the expected values
105110
start_server_mock.assert_called_once_with(*expected_values)
111+
112+
113+
class TestFolderBasedHTTPRequestHandler:
114+
def setup_method(self, method):
115+
# Create a test server instance with the custom handler
116+
CustomHTTPRequestHandler = get_folder_based_http_request_handler(Path("."))
117+
self.server = http.server.HTTPServer(("127.0.0.1", 0), CustomHTTPRequestHandler)
118+
self.server_thread = threading.Thread(target=self.server.serve_forever)
119+
self.server_thread.daemon = True
120+
self.server_thread.start()
121+
122+
# Get the port the server is listening on
123+
self.server_address = self.server.socket.getsockname()
124+
125+
def teardown_method(self, method):
126+
# Clean up the server
127+
self.server.shutdown()
128+
self.server_thread.join()
129+
130+
def test_headers(self):
131+
# Given a request to the test server
132+
connection = http.client.HTTPConnection(*self.server_address)
133+
connection.request("GET", "/")
134+
response = connection.getresponse()
135+
136+
# Expect the custom headers to be present in the response
137+
assert response.getheader("Cross-Origin-Opener-Policy") == "same-origin"
138+
assert response.getheader("Cross-Origin-Embedder-Policy") == "require-corp"
139+
assert response.getheader("Cross-Origin-Resource-Policy") == "cross-origin"

0 commit comments

Comments
 (0)