def proxy_thread(conn, request): ''' Arbeitet eine Anfrage vom Webserver ab, die nicht im Cache ist ''' url = requestHandler.getURL(request) temp = requestHandler.delete_http(url) webserver, port = requestHandler.find_webserver(temp) try: # erzeugt einen Socket fuer die Verbindung zum Webserver s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((webserver, port)) if "connection: keep-alive" in request.lower(): p = request.replace("Connection: keep-alive", "Connection: close") # setzt die Connection der Anfrage auf "close" else: p = request # Abfangen wenn kein Accept-Eintrag im Header ist if "Accept-Encoding" in p: p = re.sub("Accept-Encoding:.*\r\n", "", p) # loescht den Eintrag "Accept-Encoding" aus dem Anfrage-String s.send(p) data = "" while 1: d = s.recv(MAX_DATA_RECV) # Daten vom Webserver data += d if (len(d) <= 0): # solange die Antwort nicht leer ist break cacheHandler.writeFile(url, data) page = makeErlebnis(data) conn.send(page) # sendet die Antwort an den Browser s.close() conn.close() except socket.error, exc: import traceback traceback.print_exc() if s: s.close() if conn: conn.close() print "Runtime Error:", exc sys.exit(1)
proxy_thread(req[keyList[0]][0], req[keyList[0]][1]) req.pop(keyList[0]) keyList.remove(keyList[0]) req = {} listIn, listOut, listTmp = select.select([sock_b, sock_udp, sock_r], [], [], to) for sock in listIn: #sock hoert auf browser if sock == sock_b: so = sock.accept() conn = so[0] request = conn.recv(MAX_DATA_RECV) if request != "": cache_filename = cacheHandler.pathInHash(requestHandler.getURL(request)) d = cacheHandler.checkFile(cache_filename) #wenn wir die Anfrage selbst haben if d != "": conn.send(d) conn.close() #sonst: Broadcast else: keyList.append(cache_filename) req[cache_filename] = (conn, request) broadcast(cache_filename, PORT_UDP) #timeout fuer Anfrage setzen timeLis.append(time.mktime(time.localtime()) + 0.2) #sock erhaelt Anfrage von Broadcast if sock == sock_udp: