示例#1
0
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)
示例#2
0
                    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: