def checkFreshness(self, request, date, clientIP): request = HttpParser.addIfModified(request, date) serverSocket = self.sendReqToWebServer(request) response = self.getResponseFromServer(serverSocket, clientIP) if (response == [] or response == None): #empty response or not enouph charge return "" else: if (HttpParser.isModified(response[0])): return response else: return None
def logProxySentRequestToWebServer(self, message): header = HttpParser.getHeader(message) if header == None: return header = header.decode(errors="ignore").rstrip("\r\n") self.log(" Proxy sent request to server with headers:\n") self.log(_DIVIDER + header + _DIVIDER)
def logClientRequestToProxy(self, message): header = HttpParser.getHeader(message) if header == None: return header = header.decode(errors="ignore").rstrip("\r\n") self.log("Client sent request to proxy with headers:\n") self.log(_DIVIDER + header + _DIVIDER)
def logProxySendDataToClient(self, message): header = HttpParser.getHeader(message) if header == None: return header = header.decode(errors="ignore").rstrip("\r\n") self.log("Proxy sent response to client with headers:\n") self.log(_DIVIDER + header + _DIVIDER)
def getWebServerSocketInfo(request): url = HttpParser.getUrl(request) http_pos = url.find("://") # find pos of :// if (http_pos==-1): temp = url else: temp = url[(http_pos+3):] # get the rest of url port_pos = temp.find(":") # find the port pos (if any) # find end of web server webserver_pos = temp.find("/") if webserver_pos == -1: webserver_pos = len(temp) webserver = "" port = -1 if (port_pos==-1 or webserver_pos < port_pos): # default port port = 80 webserver = temp[:webserver_pos] else: # specific port port = int((temp[(port_pos+1):])[:webserver_pos-port_pos-1]) webserver = temp[:port_pos] return port, webserver
def logRecieveDataFromWebServer(self, message): header = HttpParser.getHeader(message) if header == None: return # print("got header") # print(header) header = header.decode(errors="ignore").rstrip("\r\n") self.log("Server sent response to proxy with headers:\n") self.log(_DIVIDER + header + _DIVIDER)
def prepareForWebServer(request): request = HttpParser.changeHttpVersion(request) request = HttpParser.removeHttpFromMessage(request) request = HttpParser.changeAcceptEncoding(request) request = HttpParser.changeConnection(request) request = HttpParser.replaceUrl(request) request = HttpParser.removeProxyHeader(request) return request
def handleRequest(self, clientSocket, clientAddress, incomingRequest): cacheHit, cacheResponse, cacheDate = self.cacheHandler.checkInCache( HttpParser.getUrl(incomingRequest)) if (cacheHit): # cache item is fresh self.logHandler.logCacheIsFresh() self.sendResponseToClient(cacheResponse, clientSocket) self.logHandler.logSendFromCache() else: if (cacheResponse == None): # not in cache self.logHandler.logNotInCache() serverSocket = self.sendReqToWebServer(incomingRequest) response = self.getResponseFromServer(serverSocket, clientAddress[0]) isNoCache = HttpParser.noCache( HttpParser.getHeader(response[0])) if (not isNoCache): # pragma no cache in response header self.logHandler.logSaveInCache() self.cacheHandler.saveInCache( HttpParser.getUrl(incomingRequest), response) self.logHandler.logSaveDone() if (response == [] or response == None): #empty response or not enough charge return else: self.sendResponseToClient(response, clientSocket) else: # item in cache, check for freshness self.logHandler.logCheckForFreshness() response = self.checkFreshness(incomingRequest, cacheDate, clientAddress[0]) if (response == None): # is fresh self.logHandler.logCacheIsFresh() self.logHandler.logSendFromCache() self.sendResponseToClient(cacheResponse, clientSocket) self.cacheHandler.hit(HttpParser.getUrl(incomingRequest), cacheResponse) elif (response == ""): # response is empty return else: # not fresh self.logHandler.logModified() self.sendResponseToClient(response, clientSocket) self.cacheHandler.hit(HttpParser.getUrl(incomingRequest), response)
def proxyThread(self, clientSocket, clientAddress): # get the request from browser try: incomingRequest = clientSocket.recv(200000) if (len(incomingRequest) <= 0): return self.logHandler.logClientRequestToProxy(incomingRequest) restriction = self.restrictionHandler.checkForRestriction( HttpParser.getHost(incomingRequest)) self.logHandler.logRestriction(restriction) if restriction == -1: return elif restriction == 0: pass else: time.sleep(restriction / 1000) incomingRequest = self.privacyHandler.setPrivacy(incomingRequest) self.logHandler.logPrivacy() self.handleRequest(clientSocket, clientAddress, incomingRequest) except: pass
def setPrivacy(self, request): if (self.config["enable"] == False): return request return HttpParser.replaceUserAgent(request, self.config["userAgent"])
def hit(self, key, response): self.remove(key) isNoCache = HttpParser.noCache(HttpParser.getHeader(response[0])) if(not isNoCache): # pragma no cache in response header self.saveNewMessage(self, key, response)
def saveNewMessage(self, key, message): gmtDatetime = datetime.fromtimestamp(mktime(gmtime())) item = cacheItem(key, gmtDatetime, HttpParser.getExpireDate(HttpParser.getHeader(message[0])), message) self.cache.append(item)