'client side caching be able to write responses to the disk and fetch them from the disk when I get a cache hit

I need to add client side caching functionality to my client, I don't need to implement any replacement or validation policies.Just be able to write responses to the disk (i.e., the cache) and fetch them from the disk when I get a cache hit. For this, I need to implement some internal data structure in my client to keep track of which objects are cached and where they are on the disk. I can keep this data structure in the main memory; there is no need to make it persist across shutdowns.

Here's the Code I tried to write the caching part but it isn't working I need your help please:

import socket
import selectors
import os

commands = []
requests = []
request_methods = []
filenames = []
host_names = []
port_numbers = []
cached_objects = {}
sel = selectors.DefaultSelector()

with open('commands.txt', encoding='UTF-8', mode='r') as f:
    commands = f.readlines()

def parse_file():
    for count in range(len(commands)):
        request_method = commands[count].split(' ')[0]
        request_methods.append(request_method)

        filename = commands[count].split(' ')[1]
        filenames.append(filename)

        host_name = commands[count].split(' ')[2].strip('\n')
        host_names.append(host_name)

        try:
            port_number = commands[count].split(' ')[3].strip('\n')
            port_numbers.append(port_number)
        except Exception as e:
            port_number = 80
            port_numbers.append(port_number)
        requests.append(generate_request(request_method, filename, host_name))

def generate_request(request_method, filename, host_name):
    request = ''
    if request_method == "GET":
        request += request_method + ' /' + filename + ' HTTP/1.0\r\n'
        request += 'Host:' + host_name + '\r\n\r\n'
        print(request)

    elif request_method == "POST":
        request += request_method + ' /' + filename + ' HTTP/1.0\r\n'
        request += 'Host:' + host_name + '\r\n'
        request += '\r\n'
        #Reading POST File From ClientFiles
        print(filename)
        f = open(filename,"r")
        request += f.read()
        print(request)

    return request

def start_connections(host, port, request, filename, request_method):
    server_addr = (host, port)
    events = selectors.EVENT_READ | selectors.EVENT_WRITE
    # connid = count + 1
    print(f"Starting connection to {server_addr}")
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect_ex(server_addr)
    sock.sendall(bytes(request, 'UTF-8'))
    data = sock.recv(4092)
    response = data.decode()
    cached_objects[request] = response # <<<<<<<<<<<<<<<<<<
    # TODO: Fix Name of the file
    fileReady = "Clientfiles/"
    head, tail = os.path.split(filename)
    fileReady += tail
    print("\n RESPONSE " + response + "\n response end")
    try:
        if request_method == "GET":
            payload = response.split('\r\n\r\n', 1)[1]
            print("MyPayload " + payload)
            f = open(fileReady, "w")
            f.write(payload)
            f.close()
    except Exception as e:
        print(e)

    print("From Server :", response)
    print("\n\n")
    sel.register(sock, events)


def check_cache(request):
    for i in range(len(commands)):
        request = requests[i]
        if request in cached_objects.keys():
            response = cached_objects[request] # <<<<<<<<<<<<<<<<<<
            print("\n RESPONSE From cache " + response + "\n response end") # <<<<<<<<<<<<<<<<<<
            # i = i + 1 # <<<<<<<<<<<<<<<<<<
        else:
            start_connections(host_names[i], int(port_numbers[i]), requests[i], filenames[i], request_methods[i])

parse_file()

check_cache(generate_request.request)


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source