From bea731efe7c48cb98281ef461a87fcdd6781c6ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Skaar=2C=20Bj=C3=B8rn-Andre?= Date: Tue, 16 May 2023 10:04:36 +0200 Subject: [PATCH 1/6] Support larger files by hosting the html-contents in a temporary file. --- src/sgis/maps/explore.py | 5 ++++- src/sgis/maps/httpserver.py | 17 +++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/sgis/maps/explore.py b/src/sgis/maps/explore.py index 71e0fe86..04a60fe2 100644 --- a/src/sgis/maps/explore.py +++ b/src/sgis/maps/explore.py @@ -4,6 +4,7 @@ clipmap functions from the 'maps' module. """ import warnings +import os from statistics import mean import branca as bc @@ -197,7 +198,9 @@ def _explore(self, **kwargs): self._create_continous_map() if self.browser: - run_html_server(self.map._repr_html_()) + with open(os.getcwd() + "/temp.html", "w") as f: + f.write(self.map._repr_html_()) + run_html_server(os.getcwd() + "/temp.html") else: display(self.map) diff --git a/src/sgis/maps/httpserver.py b/src/sgis/maps/httpserver.py index 2379b5af..8d8b9fe2 100644 --- a/src/sgis/maps/httpserver.py +++ b/src/sgis/maps/httpserver.py @@ -1,11 +1,11 @@ import os import webbrowser -from http.server import BaseHTTPRequestHandler, HTTPServer +from http.server import SimpleHTTPRequestHandler, HTTPServer from IPython.core.display import HTML, display -def run_html_server(contents: str | None = None, port: int = 3000): +def run_html_server(contents_path: str | None = None, port: int = 3000): """ Run a simple, temporary http web server for serving static HTML content. """ @@ -27,21 +27,22 @@ def run_html_server(contents: str | None = None, port: int = 3000): f"Click http://localhost:{port}/stop to stop server." ) - class HTTPServerRequestHandler(BaseHTTPRequestHandler): + class HTTPServerRequestHandler(SimpleHTTPRequestHandler): """ A handler of request for the server, hosting static content. """ - def do_GET(self): """Handle GET requests.""" self.send_response(200) - self.send_header("Content-type", "text/html") + self.send_header('Content-type', 'text/html') self.end_headers() - if self.path == "/stop": - self.wfile.write(bytes("The server is stopped", encoding="utf-8")) + if self.path == '/stop': + self.wfile.write(bytes('The server is stopped', encoding='utf-8')) + os.remove(contents_path) raise KeyboardInterrupt else: - self.wfile.write(bytes(contents, encoding="utf-8")) + self.path = contents_path + return SimpleHTTPRequestHandler.do_GET(self) HTTPServerRequestHandler.allow_reuse_address = True From 1829eeb7878ee7a271a5d8ab7d81fd0d54f0a762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Skaar=2C=20Bj=C3=B8rn-Andre?= Date: Tue, 16 May 2023 10:30:50 +0200 Subject: [PATCH 2/6] Use tmpfile --- src/sgis/maps/explore.py | 8 ++++---- src/sgis/maps/httpserver.py | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/sgis/maps/explore.py b/src/sgis/maps/explore.py index 04a60fe2..105a7a44 100644 --- a/src/sgis/maps/explore.py +++ b/src/sgis/maps/explore.py @@ -4,7 +4,7 @@ clipmap functions from the 'maps' module. """ import warnings -import os +import tempfile from statistics import mean import branca as bc @@ -198,9 +198,9 @@ def _explore(self, **kwargs): self._create_continous_map() if self.browser: - with open(os.getcwd() + "/temp.html", "w") as f: - f.write(self.map._repr_html_()) - run_html_server(os.getcwd() + "/temp.html") + file_name = tempfile.mkdtemp(suffix='.html') + self.map.save(file_name) + run_html_server(file_name) else: display(self.map) diff --git a/src/sgis/maps/httpserver.py b/src/sgis/maps/httpserver.py index 8d8b9fe2..06aebd90 100644 --- a/src/sgis/maps/httpserver.py +++ b/src/sgis/maps/httpserver.py @@ -1,6 +1,7 @@ import os import webbrowser -from http.server import SimpleHTTPRequestHandler, HTTPServer +import shutil +from http.server import BaseHTTPRequestHandler, HTTPServer from IPython.core.display import HTML, display @@ -27,7 +28,7 @@ def run_html_server(contents_path: str | None = None, port: int = 3000): f"Click http://localhost:{port}/stop to stop server." ) - class HTTPServerRequestHandler(SimpleHTTPRequestHandler): + class HTTPServerRequestHandler(BaseHTTPRequestHandler): """ A handler of request for the server, hosting static content. """ @@ -41,8 +42,8 @@ def do_GET(self): os.remove(contents_path) raise KeyboardInterrupt else: - self.path = contents_path - return SimpleHTTPRequestHandler.do_GET(self) + with open(contents_path, 'rb') as contents: + shutil.copyfileobj(contents, self.wfile) HTTPServerRequestHandler.allow_reuse_address = True From 795f23cea7ddfc029d890a86d7830c13e2001509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Skaar=2C=20Bj=C3=B8rn-Andre?= Date: Tue, 16 May 2023 10:34:29 +0200 Subject: [PATCH 3/6] Fix typo --- src/sgis/maps/explore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sgis/maps/explore.py b/src/sgis/maps/explore.py index 105a7a44..b2133f2c 100644 --- a/src/sgis/maps/explore.py +++ b/src/sgis/maps/explore.py @@ -198,7 +198,7 @@ def _explore(self, **kwargs): self._create_continous_map() if self.browser: - file_name = tempfile.mkdtemp(suffix='.html') + file_name = tempfile.mktemp(suffix='.html') self.map.save(file_name) run_html_server(file_name) else: From d40d460115d4510401be8ff6655290776c7babc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Skaar=2C=20Bj=C3=B8rn-Andre?= Date: Tue, 16 May 2023 11:10:29 +0200 Subject: [PATCH 4/6] Fixed insecure method --- src/sgis/maps/explore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sgis/maps/explore.py b/src/sgis/maps/explore.py index b2133f2c..c87756ea 100644 --- a/src/sgis/maps/explore.py +++ b/src/sgis/maps/explore.py @@ -198,7 +198,7 @@ def _explore(self, **kwargs): self._create_continous_map() if self.browser: - file_name = tempfile.mktemp(suffix='.html') + fd, file_name = tempfile.mkstemp(suffix='.html') self.map.save(file_name) run_html_server(file_name) else: From a86fe04c74ab23fc8cdea3e0ff8462cf7ebafdee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Skaar=2C=20Bj=C3=B8rn-Andre?= Date: Tue, 16 May 2023 12:08:00 +0200 Subject: [PATCH 5/6] Fixed code smell --- src/sgis/maps/explore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sgis/maps/explore.py b/src/sgis/maps/explore.py index c87756ea..6e467850 100644 --- a/src/sgis/maps/explore.py +++ b/src/sgis/maps/explore.py @@ -198,7 +198,7 @@ def _explore(self, **kwargs): self._create_continous_map() if self.browser: - fd, file_name = tempfile.mkstemp(suffix='.html') + _, file_name = tempfile.mkstemp(suffix='.html') self.map.save(file_name) run_html_server(file_name) else: From be5681b8c000f114c841700a66e439dd01159cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Skaar=2C=20Bj=C3=B8rn-Andre?= Date: Tue, 16 May 2023 17:41:23 +0200 Subject: [PATCH 6/6] Add content-length header --- src/sgis/maps/httpserver.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sgis/maps/httpserver.py b/src/sgis/maps/httpserver.py index 06aebd90..03c009ac 100644 --- a/src/sgis/maps/httpserver.py +++ b/src/sgis/maps/httpserver.py @@ -35,6 +35,8 @@ class HTTPServerRequestHandler(BaseHTTPRequestHandler): def do_GET(self): """Handle GET requests.""" self.send_response(200) + fileSize = os.path.getsize(contents_path) + self.send_header("Content-Length", str(fileSize)) self.send_header('Content-type', 'text/html') self.end_headers() if self.path == '/stop':