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.
Programmieren - alles kontrollieren 4.938 Themen, 20.667 Beiträge
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