1

I found this server online and I edited it a bit. Here is the code:

from http.server import BaseHTTPRequestHandler, HTTPServer
from xml.dom import minidom
import os


class MyHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        self.data_string = self.rfile.read(int(self.headers['Content-Length']))
        self.send_response(200)
        self.end_headers()
        valore = str(self.data_string)[2:-1]
        response = ["",""]
        response[0],response[1] = processData(valore)
        if response[0] == 1:
            sep = ""
            message = ""
            for res in response[1]:
                message += res
            response = sep.join(message)
            self.wfile.write(bytes(message, "utf-8"))

    def do_GET(self):
        # Send response status code
        self.send_response(200)
        # Send headers
        if self.path.endswith("html"):
            self.send_header('Content-type', 'text/html')
            self.end_headers()
        elif self.path.endswith("css"):
            self.send_header('Content-type', 'text/css')
            self.end_headers()
        elif self.path.endswith("js"):
            self.send_header('Content-type', 'application/javascript')
            self.end_headers()
        elif self.path.endswith(".ico"):
            print(self.rawpath)
        if not self.path.endswith("jpeg") and not self.path.endswith("jpg") and not self.path.endswith("png") and not self.path.endswith("gif"):
            with open(self.path[1:], 'r') as myfile:
                data = myfile.read()
            # Write content as utf-8 data
            self.wfile.write(bytes(data, "utf8"))
        if self.path.endswith("jpeg"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/jpeg')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        elif self.path.endswith("png"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/png')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        elif self.path.endswith("gif"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/gif')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        elif self.path.endswith("jpg"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/jpeg')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        return

def run():
    print('starting server...')

    # Server settings
    # Choose port 8080, for port 80, which is normally used for a http server, you need root access
    server_address = ('192.168.2.245', 8081)
    httpd = HTTPServer(server_address, MyHandler)
    print('running server...')
    httpd.serve_forever()


def processData(data):
    XMLlist = []
    data = data.split(":")
    if data[0] == "XMLlist":
        path = os.path.realpath(__file__)
        path = os.path.dirname(path)
        for filename in os.listdir(path):
            if filename.endswith('.xml'):
                XMLlist.append(filename[:-3])
        return 1,XMLlist
                #fullname = os.path.join(path, filename)
    else:
        file = open('default.xml', 'r')
        tree = minidom.parse(file)
        tree.getElementsByTagName(data[0])[0].childNodes[0].replaceWholeText(data[1])
        file = open('default.xml', 'w')
        tree.writexml(file)
        file.close()
        return 0, 1


run()

The server works just fine and I need to remove cache. When I try to refresh an Image from the html page with the same name, the server return me the cached image... Do you have any advice?

Thank you and sorry for my english...

G. Threepwood
  • 454
  • 8
  • 23

2 Answers2

7

http.server does not send "no cache" header, so we need to send "no cache" header

# NoCacheHTTPServer.py

import http.server

PORT = 8000

class NoCacheHTTPRequestHandler(
    http.server.SimpleHTTPRequestHandler
):
    def send_response_only(self, code, message=None):
        super().send_response_only(code, message)
        self.send_header('Cache-Control', 'no-store, must-revalidate')
        self.send_header('Expires', '0')

if __name__ == '__main__':
    http.server.test(
        HandlerClass=NoCacheHTTPRequestHandler,
        port=PORT
    )

Run in CLI

python NoCacheHTTPServer.py
Steely Wing
  • 16,239
  • 8
  • 58
  • 54
2

Try refresh the browser by pressing Ctrl+F5 or Shift+F5

StefansArya
  • 2,802
  • 3
  • 24
  • 25
  • 1
    Yes, but this doesn't disable the cache from the server...I want that the server doesn't store any cache...is this possible? – G. Threepwood Feb 20 '17 at 09:55
  • `self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0')` – StefansArya Feb 20 '17 at 09:59
  • it will prevent from caching, I don't think python will cache files.. Have you tried to refresh the server? – StefansArya Feb 20 '17 at 10:00
  • yes, I refresh the server every change. Maybe I'm wrong and it isn't a server problem. I tell to the image to refresh itself with another image with the same name and the image still the same even if the source image is changed. – G. Threepwood Feb 20 '17 at 10:04
  • I solved the problem. It was the browser. I was using Firefox with disabled chaced. I tried with Chrome and everything works! I'm sorry for the taking your time, thank you for the help! – G. Threepwood Feb 20 '17 at 10:12
  • See also https://stackoverflow.com/a/25708957/239657 (similar, adds some more headers) EDIT: see also https://stackoverflow.com/a/31852117/239657 for browser default behavior and advice to use only `Cache-Control`. – Beni Cherniavsky-Paskin Apr 07 '19 at 13:43