2008-12-29 6 views
0

J'écris un simple script python pour pouvoir tester mes sites Web à partir d'une adresse IP différente.Python Proxy Script

L'URL d'une page est donnée dans la chaîne de requête, le script extrait la page et l'affiche à l'utilisateur. Le code ci-dessous est utilisé pour réécrire les balises qui contiennent des URL mais je ne pense pas que ce soit complet/totalement correct.

def rel2abs(rel_url, base=loc): 
    return urlparse.urljoin(base, rel_url) 

def is_proxy_else_abs(tag, attr): 
    if tag in ('a',): 
     return True 
    if tag in ('form', 'img', 'link') and attr in ('href', 'src', 'action', 'background'): 
     return False 

def repl(matchobj): 
    if is_proxy_else_abs(matchobj.group(1).lower(), matchobj.group(3).lower()): 
     return r'<%s %s %s="http://%s?%s" ' %(proxy_script_url, matchobj.group(1), matchobj.group(2), matchobj.group(3), urllib.urlencode({'loc':rel2abs(matchobj.group(5))})) 
    else: 
     return r'<%s %s %s="%s" ' %(matchobj.group(1), matchobj.group(2), matchobj.group(3), rel2abs(matchobj.group(5))) 

def fix_urls(page): 
    get_link_re = re.compile(r"""<(a|form|img|link) ([^>]*?)(href|src|action|background)\s*=\s*("|'?)([^>]*?)\4""", re.I|re.DOTALL) 
    page = get_link_re.sub(repl, page) 
    return page 

L'idée est que « a » attributs href de la balise doivent être acheminés par le script proxy, mais css, javascript, images, formes etc ne doit pas être, si ceux-ci doivent être prises absolue si elles sont relatives à la page d'origine.

Le problème est le code ne fonctionne pas toujours, css peut être écrit de plusieurs façons, etc. Existe-t-il une expression rationnelle plus complète que je peux utiliser?

+0

Probablement une question stupide, mais avez-vous envisagé d'écrire simplement un vrai proxy http? Avec un vrai proxy, vous ne devriez pas avoir à réécrire quoi que ce soit puisque votre navigateur sera explicitement configuré pour l'utiliser. Cela fonctionnera généralement beaucoup mieux et sera beaucoup plus facile à écrire. – Zoredache

Répondre