2

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...

3 Answers 3

15

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
Sign up to request clarification or add additional context in comments.

Comments

1

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

6 Comments

Yes, but this doesn't disable the cache from the server...I want that the server doesn't store any cache...is this possible?
self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0')
it will prevent from caching, I don't think python will cache files.. Have you tried to refresh the server?
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.
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!
|
1

If the purpose of this server is only for the local test (which I think is the most common usecase) you can also disable cache for your Chrome browser.

The detailed instructions to disable cache are here.

1 Comment

As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.