Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

[C] Transparenter Proxyserver im eigenbau - nur ohne gzip?

Synthetic_codes / 2 Antworten / Baumansicht Nickles

Moinsen allseits.

Ich bin ja via UMTS on, wie einige hier vielleicht wissen. Bei UMTS gibt es providerseitig ein paar einschränkungen, zb dass der inhalt zwangskomprimiert wird. Dem kann man durch einfügen der beiden Header Pragma und Cache-Control jeweils mit den Werten "No-Cache" entgegenwirken. Dies lässt sich auf 2 wege bewerkstelligen:

1. Per Browseraddon
2. So wie mein provider das internet verkrüppelt, mit einem Transparenten Proxy

Nun, ersteres funktioniert am PC, meine PMPs aber verwenden Opera und lassen sich nicht mit plugins erweitern.

Bisher versuchte ich das ganze auf meinem Router(OpenWRT Kamikaze) mit tinyproxy aufzusetzen. Nachdem ich aber an der konfiguration desselben letztendlich scheiterte, ist mir der ganze dren zu dämlich geworden, und ich habe mir auf die schnelle meinen eigenen Proxy in C zusammengeschustert.

Das teil funzt auch grundsätzlich, es fügt die benötigten header ein und die Geschwindigkeit ist Ok. Jetzt zum haken:

Wenn ich eine Seite aufrufe, mötzt mein Firefox dass er die encodierung nicht versteht. Nach ein paar minuten überlegen kam ich auf die idee, dass es an der GZip Encodierung liegen könnte, also erweiterte ich meinen Proxy, um den Accept-Encoding Header aus dem Request auszufiltern. Siehe da es funktioniert.

nun gut, daraufhin stellt sich jetzt nur die Frage(da ich meinen übertraffic bezahlen muss und 5GB nicht wirklich viel sind, abgesehen davon dass sich die ladezeiten ja verlängern ohne die GZip Kompression), was ich an meinem Code verändern muss, damit gzip encodierte inhalte(ich denke mal das trifft dann ganz allgemein auf binäre inhalte zu) übertragen werden.

'); DROP TABLE users;--
bei Antwort benachrichtigen
Synthetic_codes Nachtrag zu: „[C] Transparenter Proxyserver im eigenbau - nur ohne gzip?“
Optionen

Hier der betreffende Codeausschnitt: EDIT: Sry für die schreckliche Formatierung ich wars ned!


EDIT 2: http://pastebin.com/m7e36409e
ich hab die sourcen ma bei pastebin geupped, da ist das viel hübscher


dns = gethostbyname(hostname); //Hostname auflösen
if(dns == NULL)
{
showErr(1, sock); //Nicht gefunden? Dann fehlerseite
}
else
{
cl.sin_family = AF_INET;
cl.sin_port = htons(80);
memcpy(&cl.sin_addr, dns->h_addr_list[0],dns->h_length);
if(connect(cli, (struct sockaddr *)&cl,sizeof(cl))) //Das übliche verbindungszeuchg
{
showErr(2,sock);
}
else
{
for(cx = 0;cx<(ct+1);cx++) //Übertragung des Requests an den zielserver
{
send(cli, headers[cx],strlen(headers[cx]),0);
}
send(cli,"\r\n",2,0); //Das ende des Requests mit \r\n quittieren
while(1)
{
memset(&buf,0,sizeof(buf)); //buf ist ein 16Byte grosses char Array
t = recv(cli,buf,sizeof(buf)-1,0);//vom ziel empfangen und anzahl empfangener byte speichern. es werden max 15 byte gelesen, byte nr 16 terminiert den string(\0)
if(t == 0)
break; //nichts gelesen? Dann EOF oder Fehler
else
{
send(sock,buf,strlen(buf),0); //Die empangenen Daten an den Client weiterleiten
}
}
}
}


Ich hoffe jemand hat ne idee wie ich weiterkomme

'); DROP TABLE users;--
bei Antwort benachrichtigen
Synthetic_codes Nachtrag zu: „Hier der betreffende Codeausschnitt: EDIT: Sry für die schreckliche...“
Optionen

ok is mir jetz ein wenig peinlich...

aber is kein wunder wenns ned funzt, weil man bei send die pufferlänge mit strlen misst und binärdaten senden will unso^^

Sry *schäm*

'); DROP TABLE users;--
bei Antwort benachrichtigen