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