diff --git a/webservice/serve_overview.py b/webservice/serve_overview.py
index 919d48c153aa102b3dc0dfed40e5b0d5b7f8bd6a..a5c79809eebc5a818393db0f8094be6414a0322e 100644
--- a/webservice/serve_overview.py
+++ b/webservice/serve_overview.py
@@ -6,6 +6,7 @@ from collections import OrderedDict
 from datetime import datetime, timezone
 from http.server import BaseHTTPRequestHandler, HTTPServer
 from pathlib import Path
+from shutil import copyfileobj
 from subprocess import check_output
 from typing import Optional
 
@@ -45,9 +46,6 @@ class RequestHandler(BaseHTTPRequestHandler):
     conf_was_init = False
 
     def init_config(self):
-
-        global cal_config
-
         self.total_jobs_cmd = config["shell-commands"]["total-jobs"]
         self.tail_log_cmd = config["shell-commands"]["tail-log"]
         self.cat_log_cmd = config["shell-commands"]["cat-log"]
@@ -57,98 +55,111 @@ class RequestHandler(BaseHTTPRequestHandler):
         for template, tfile in config["templates"].items():
             with open(tfile, "r") as tf:
                 self.templates[template] = tf.read()
-        global pdf_queue
+
         self.pdf_queue = pdf_queue
         self.conf_was_init = True
 
+    def serve_css(self):
+        """Serve /serve_overview.css"""
+        self.send_response(200)
+        self.send_header('Content-type', 'text/css')
+        self.end_headers()
+        self.wfile.write(self.templates["css"].encode('utf-8'))
+
+    def serve_pdf(self):
+        """Serve pdf?id """
+        puuid = self.path.split("?")[1]
+        fpath = self.pdf_queue.get(puuid, None)
+        if fpath is None:
+            return self.send_error(404)
+        self.send_response(200)
+        self.send_header('Content-type', 'application/pdf')
+        self.send_header('Content-Length', str(os.stat(fpath).st_size))
+        self.end_headers()
+        with open(fpath, "rb") as f:
+            copyfileobj(f, self.wfile)
+
+    def serve_dark_overview(self):
+        # Send headers
+        self.send_response(200)
+        self.send_header('Content-type', 'text/html')
+        self.end_headers()
+        host = config["server-config"]["host"]
+        port = config["server-config"]["port"]
+        reports = {}
+        for instrument, detectors in cal_config['dark'].items():
+            reports[instrument] = {}
+            for detector in detectors:
+                tmpl = f'/gpfs/exfel/d/cal/caldb_store/xfel/reports/{instrument}/{detector}/dark/*pdf'
+                files = glob.glob(tmpl)
+                files.sort(key=os.path.getmtime, reverse=True)
+                file_info = []
+                for i, file in enumerate(files):
+                    if (len(file_info) % 2) == 0:
+                        bgcolor = 'EEEEEE'
+                    else:
+                        bgcolor = 'FFFFFF'
+                    time = os.stat(file).st_mtime
+                    d_time = datetime.fromtimestamp(time).replace(
+                        tzinfo=timezone.utc)
+                    s_time = d_time.strftime('%y-%m-%d %H:%M')
+                    file_info.append([file, s_time, bgcolor])
+
+                reports[instrument][detector] = file_info
+
+        tmpl = Template(self.templates["dark-overview"])
+        message = tmpl.render(reports=reports, host=host, port=port)
+
+        self.wfile.write(bytes(message, "utf8"))
+
+    def serve_file_from_gpfs(self):
+        """Serve a file from a path starting with /gpfs"""
+        if self.path.endswith(".html"):
+            mimetype = 'text/html'
+        elif self.path.endswith(".jpg"):
+            mimetype = 'image/jpg'
+        elif self.path.endswith(".gif"):
+            mimetype = 'image/gif'
+        elif self.path.endswith(".png"):
+            mimetype = 'image/png'
+        elif self.path.endswith(".pdf"):
+            mimetype = 'application/pdf'
+        elif self.path.endswith(".js"):
+            mimetype = 'application/javascript'
+        elif self.path.endswith(".css"):
+            mimetype = 'text/css'
+        else:
+            return self.send_error(404)
+
+        if os.path.isfile(self.path):
+            self.send_response(200)
+            self.send_header('Content-Length', str(os.stat(self.path).st_size))
+            self.send_header('Content-type', mimetype)
+            self.end_headers()
+            with open(self.path, "rb") as f:
+                copyfileobj(f, self.wfile)
+        else:
+            self.send_error(404)
+
     def do_GET(self):
 
         if not self.conf_was_init:
             self.init_config()
-        # Send response status code
-        self.send_response(200)
+
         if "/serve_overview.css" in self.path:
-            self.send_header('Content-type', 'text/css')
-            self.end_headers()
-            for s in self.templates["css"].split("\n"):
-                self.wfile.write(s.encode())
-            return
+            return self.serve_css()
 
         if "pdf?" in self.path:
-            puuid = self.path.split("?")[1]
-            fpath = self.pdf_queue.get(puuid, None)
-            if fpath is None:
-                return
-            self.send_header('Content-type', 'application/pdf')
-            self.end_headers()
-            with open(fpath, "rb") as f:
-                self.wfile.write(f.read())
-            return
+            return self.serve_pdf()
 
         if "dark?" in self.path:
-            # Send headers
-            self.send_header('Content-type', 'text/html')
-            self.end_headers()
-            host = config["server-config"]["host"]
-            port = config["server-config"]["port"]
-            reports = {}
-            for instrument, detectors in cal_config['dark'].items():
-                reports[instrument] = {}
-                for detector in detectors:
-                    tmpl = f'/gpfs/exfel/d/cal/caldb_store/xfel/reports/{instrument}/{detector}/dark/*pdf'
-                    files = glob.glob(tmpl)
-                    files.sort(key=os.path.getmtime, reverse=True)
-                    file_info = []
-                    for i, file in enumerate(files):
-                        if (len(file_info) % 2) == 0:
-                            bgcolor = 'EEEEEE'
-                        else:
-                            bgcolor = 'FFFFFF'
-                        time = os.stat(file).st_mtime
-                        d_time = datetime.fromtimestamp(time).replace(
-                            tzinfo=timezone.utc)
-                        s_time = d_time.strftime('%y-%m-%d %H:%M')
-                        file_info.append([file, s_time, bgcolor])
-
-                    reports[instrument][detector] = file_info
-
-            tmpl = Template(self.templates["dark-overview"])
-            message = tmpl.render(reports=reports, host=host, port=port)
-
-            self.wfile.write(bytes(message, "utf8"))
-            return
+            return self.serve_dark_overview()
 
         if "/gpfs" in self.path:
-            sendReply = False
-            if self.path.endswith(".html"):
-                mimetype = 'text/html'
-                sendReply = True
-            if self.path.endswith(".jpg"):
-                mimetype = 'image/jpg'
-                sendReply = True
-            if self.path.endswith(".gif"):
-                mimetype = 'image/gif'
-                sendReply = True
-            if self.path.endswith(".png"):
-                mimetype = 'image/png'
-                sendReply = True
-            if self.path.endswith(".pdf"):
-                mimetype = 'application/pdf'
-                sendReply = True
-            if self.path.endswith(".js"):
-                mimetype = 'application/javascript'
-                sendReply = True
-            if self.path.endswith(".css"):
-                mimetype = 'text/css'
-                sendReply = True
-
-            if sendReply == True and os.path.isfile(self.path):
-                with open(self.path, "rb") as f:
-                    self.send_header('Content-type', mimetype)
-                    self.end_headers()
-                    self.wfile.write(f.read())
-            return
+            return self.serve_file_from_gpfs()
 
+        # Send response status code
+        self.send_response(200)
 
         # Send headers
         self.send_header('Content-type', 'text/html')