Proxy w c++

0

Witam serdecznie

Mam ogromny problem z napisaniem w 100% działającego proxy. Może zacznę od tego jak działa mój algorytm:

  • serwer odbiera żądanie od przeglądarki
  • odczytuje nazwę hosta z żądania i łączy się z nim na porcie 80
  • do hosta za pomocą send() wysyłam to co dostałem od przeglądarki, np.:
GET http://www.google.pl/ HTTP/1.0
User-Agent: Opera/9.80 (X11; Linux i686; U; pl) Presto/2.2.15 Version/10.10
Host: www.google.pl
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: pl-PL,pl;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Cookie: NID=29=a7Y0Y5_PjXXggDbHdXDy6Frq-eHgai1zakWjDqCGfd90LeTDmmLTdP356f8s-_5TOC9i5zlMfe8Sv69YevlZNZWH-6UtRm7PYzIcVT1P5BM6BoCTj8t78NPc6_QR0dpU; PREF=ID=a7c32ca1e29e401c:U=0aaa385d1c13a939:TM=1259855956:LM=1259857420:S=lCH1H6WYbbEXrDMB
Cookie2: $Version=1
Proxy-Connection: Keep-Alive
  • W zamian od hosta otrzymuje dwa łańcuchy znaków:
HTTP/1.0 200 OK
Date: Fri, 04 Dec 2009 08:36:53 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Server: gws
Content-Length: 3727
X-XSS-Protection: 0


oraz
moze darujmy sobie nic nie wnoszące smieci [mf]

I tu się pojawia problem. Zakładam że drugi *char jaki został wysłany to zgodnie z Content-Encoding: gzip spakowana strona w gzip. I teraz zaczyna się magia.
W przypadku gdy połączę oba łańcuchy w jeden i odeślę do przeglądarki to:

  1. wyświetlają mi się krzaczki:
    j. w. [mf]
  2. Jeśli przesyłam tylko pierwszą odpowiedź to dostaje coś takiego:
<!doctype html><html onmousemove="google&&google.fade&&google.fade()"><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>Google</title><script>window.google={kEI:"WswYS_vBI8_0_Aaoi6jnAw",kEXPI:"22108,22761,22984,23000,23026,23050",kCSI:{e:"22108,22761,22984,23000,23026,23050",ei:"WswYS_vBI8_0_Aaoi6jnAw"},kHL:"pl",time:function(){return(new Date).getTime()},log:function(b,d,c){var a=new Image,e=google,g=e.lc,f=e.li;a.onerror=(a.onload=(a.onabort=function(){delete g[f]}));g[f]=a;c=c||"/gen_204?atyp=i&ct="+b+"&cad="+d+"&zx="+google.time();a.src=c;e.li=f+1},lc:[],li:0};

window.google.sn="webhp";window.google.timers={load:{t:{start:(new Date).getTime()}}};try{}catch(u){}window.google.jsrt_kill=1;

var _gjwl=location;function _gjuc(){var e=_gjwl.href.indexOf("#");if(e>=0){var a=_gjwl.href.substring(e);if(a.indexOf("&q=")>0||a.indexOf("#q=")>=0){a=a.substring(1);if(a.indexOf("#")==-1){for(var c=0;c<a.length;){var d=c;if(a.charAt(d)=="&")++d;var b=a.indexOf("&",d);if(b==-1)b=a.length;var f=a.substring(d,b);if(f.indexOf("fp=")==0){a=a.substring(0,c)+a.substring(b,a.length);b=c}else if(f=="cad=h")return 0;c=b}_gjwl.href="/search?"+a+"&cad=h";return 1}}}return 0}function _gjp(){!(window._gjwl.hash&&

window._gjuc())&&setTimeout(_gjp,500)};

window._gjp && _gjp()</script><style>td{line-height:.8em;}.gac_m td{line-height:17px;}form{margin-bottom:20px;}body,td,a,p,.h{font-family:arial,sans-serif}.h{color:#36c;font-size:20px}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}em{font-weight:bold;font-style:normal}.lst{font:17px arial,sans-serif;margin-bottom:.2em;vertical-align:bottom;}input{font-family:inherit}.lsb,.gac_sb{font-size:15px;height:1.85em!important;margin:.2em;}#fctr,#ghead,#pmocntr,#sbl,#tba,#tbe,.fade{opacity:0;}#fctr,#ghead,#pmocntr,#sbl,#tba,#tbe,.fade{background:#fff;}#gbar{float:left;height:22px}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}#gbs,.gbm{background:#fff;left:0;position:absolute;text-align:left;visibility:hidden;z-index:1000}.gbm{border:1px solid;border-color:#c9d7f1 #36c #36c #a2bae7;z-index:1001}#guser{padding-bottom:7px !important;text-align:right}#gbar,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser{font-size:13px;padding-cr,#guser

Przy czym ostatnia linijka powtarza się x razy.
3) jeśli prześle tylko 2 odpowiedz od przeglądarki... przeglądarka chce to zapisać...
4) próbując wysłać najpierw pierwszą później 2 odpowiedz dostaje błąd od send().

ma ktoś jakieś sugestie jak powinienem rozwiązać problem? ;>

Pozdrawiam
Korson

0

Bez kodu nic się nie poradzi...

0

kod mam dobry... nie wiem... tzn teoretycznie już wiem... jak zmusić hosta aby nie odsyłał mi skompresowanej strony, a tekst.

Content-Encoding: identity - podobno wystarczy ustawić taki nagłówek zamiast tego co przysyła przeglądarka... przynajmniej tak uważa znajomy... wieczorem jak wrócę na mieszkanie zmienię nagłówek i dam znać czy proxy działa poprawnie.

0

kod to najwyrazniej masz niepoprawny, poniewaz gdyby byl, to i z gzip bys problemu nie mial. moze sie myle, ale dla Ciebie payload - tresc strony - powinien byc calkowicie obojetny i czy to html czy dane binarne - jeden pies, tylko przerzucasz strumien bajtow dalej..

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.