[CGI/C++] HTTP compression

Pagina: 1
Acties:

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik probeer HTTP compressie toe te voegen aan mijn CGI scripts, maar het wil niet lukken. Wat doe ik fout?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <zlib.h>
#include "virtual_binary.h"

using namespace std;

Cvirtual_binary php_deflate_string(Cvirtual_binary s)
{
    unsigned long cb_d = s.size() + (s.size() + 999) / 1000 + 12;
    Cvirtual_binary d;
    byte* w = d.write_start(10 + cb_d);
    w[0] = 0x1f;
    w[1] = 0x8b;
    w[2] = Z_DEFLATED;
    w[3] = w[4] = w[5] = w[6] = w[7] = w[8] = 0;
    w[9] = 3;
    w += 10;
    compress(w, &cb_d, s.data(), s.size());
    d.size(10 + cb_d);
    return d;
}

int main()
{
    string v = "<html>Hi!</html>";
    /*
    for (int i = 0; i < 16 << 10; i++)
        v += "<!-- -->\n";
    */
    string a_encoding = "gzip, deflate"; // HTTP_ACCEPT_ENCODING
    /*
    if (a_encoding.find("deflate") != string::npos)
        coding = CODING_DEFLATE;
    else
        return s;
    */
    Cvirtual_binary d(v.c_str(), v.size());
    d = php_deflate_string(d);
    cout << "Content-Encoding: deflate" << endl
        // << "Content-Length: " << d.size() << endl
        << "Content-Type: text/html" << endl
        << "Vary: Accept-Encoding" << endl
        << endl;
    cout.write(reinterpret_cast<const char*>(d.data()), d.size());
    ofstream("gzip_out", ios::binary).write(reinterpret_cast<const char*>(d.data()), d.size());
    return 0;
}

  • The End
  • Registratie: Maart 2000
  • Laatst online: 14-09 15:55

The End

!Beginning

Ja, wat gaat er fout?

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
IE wil de pagina niet laden. Ik denk dat het komt doordat cout niet in binary mode staat en ook andere dingen dan '\r' aanpast.

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Weet je zeker dat je niet al perongeluk output verstuurt???

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ja, dat gaat niet fout. Heb ik met telnet gecontroleerd. Ik heb het op een andere computer met nieuwe code opnieuw geprobeerd en nu lijkt het wel te werken (onder Windows).
code:
1
2
_setmode(stdout->_file, _O_BINARY);
fwrite(reinterpret_cast<const char*>(d.data()), d.size(), 1, stdout);

Maar nu lijkt Linux _setmode en <io.h> niet te kennen. Hoe veranderd ik de mode daar dan?

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Linux lijkt het (toch) niet nodig te hebben en het werkt nu.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Cvirtual_binary xcc_z::gzip(const byte* s, int cb_s)
{
    Cvirtual_binary d;
    unsigned long cb_d = cb_s + (cb_s + 999) / 1000 + 12;
    byte* w = d.write_start(10 + cb_d + 8);
    *w++ = 0x1f;
    *w++ = 0x8b;
    *w++ = Z_DEFLATED;
    *w++ = *w++ = *w++ = *w++ = *w++ = *w++ = 0;
    *w++ = 3;
    {
        z_stream stream;
        stream.zalloc = NULL;
        stream.zfree = NULL;
        stream.opaque = NULL;
        deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY);
        stream.next_in = const_cast<byte*>(s);
        stream.avail_in = cb_s;
        stream.next_out = w;
        stream.avail_out = cb_d;
        deflate(&stream, Z_FINISH);
        w = stream.next_out;
    }
    *reinterpret_cast<int*>(w) = crc32(crc32(0, NULL, 0), s, cb_s);
    w += 4;
    *reinterpret_cast<int*>(w) = cb_s;
    w += 4;
    d.size(w - d.data());
    return d;
}

Cvirtual_binary xcc_z::gzip(string v)
{
    return gzip(reinterpret_cast<const byte*>(v.c_str()), v.length());
}

if (get_env("HTTP_ACCEPT_ENCODING").find("gzip") == string::npos)
{
    cout << endl
        << page;
}
else
{
    Cvirtual_binary d = xcc_z::gzip("<!-- gzip -->" + page);
    cout << "Content-Encoding: gzip" << endl
        << endl;
    cout.flush();
#ifdef _MSC_VER
    _setmode(stdout->_file, _O_BINARY);
#endif
    fwrite(reinterpret_cast<const char*>(d.data()), d.size(), 1, stdout);
}

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Het werkt toch niet helemaal dus. Script: http://xccu.sourceforge.net/cgi-bin/test.cgi

Zolang je de pagina gewoon benadert gaat het goed, maar als je vernieuwd (F5) mist het bovenste gedeelte van de HTML uitvoer.

  • tom kuipers
  • Registratie: Juli 1999
  • Laatst online: 23-02-2025
Datzelfe probleem bij het vernieuwen heb ik ook (vanuit php gzipen)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Met welke browser? Ik heb IE 5.00. Met Netscape 4.5 heb ik dit probleem niet (maar wel CSS problemen).

  • tom kuipers
  • Registratie: Juli 1999
  • Laatst online: 23-02-2025
IE5, en tevens bij het gebruiken van de Back button heb ik dat probleem.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik ga in het weekend even wat Etherealen en kijken wat het probleem is en waar het zich bevind.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

het zit m denk ik in de headers. Ik bedoel, waarom zou het de eerste keer goed gaan, maar als je refreshed ineens niet meer

Misschien moet je eens kijken wat er allemaal aan headers wordt doorgesteurd de eerste keer en bij een refresh, en dan de verschillen gaan vergelijken

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ja, daar zat ik ook aan te denken. Maar ik heb dus nog geen kans gehad die headers te bekijken. Het kan natuurlijk ook een bug in IE zijn. Het viel me namelijk op dat een refresh enorm snel wordt uitgevoerd en dat er misschien dus helemaal geen request wordt verstuurd maar dat het uit de cache gebeurd en dat daar iets mis gaat.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik heb de headers bekeken en ik kon niks verdachts vinden.
Met IE 6.0 gaat het onder Windows 98 fout en onder Windows XP goed.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Kuch, maybe redelijk offtopic :)
Maar dit probleem heb ik met GoT ook. (en met geen een andere website heb ik dit :? ); dat je gewoon naar een topic toe kan gaan, maar zodra ik f5 of back doe, dan gaat het helemaal verkeerd, en laadt hij de pagina niet meer.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Lijkt me eigenlijk best relevant. Wat gebeurd er als je HTTP compressie uit zet en dan op F5 drukt? En welke browser?

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op maandag 04 februari 2002 09:08 schreef OlafvdSpek het volgende:
Lijkt me eigenlijk best relevant. Wat gebeurd er als je HTTP compressie uit zet en dan op F5 drukt? En welke browser?
Ik heb op mijn pc 2 profielen; 'werk' & 'prive' ( >:) ); win2k; allebei IE 6.0. Alleen 'prive' heeft er last van. Op 'werk' staat compressie aan. Zodra ik tijd heb zal ik ff switchen naar prive :)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Dus op prive staat compressie uit? En toch heb je er last van?

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op maandag 04 februari 2002 12:25 schreef OlafvdSpek het volgende:
Dus op prive staat compressie uit? En toch heb je er last van?
Dat zeg ik niet :)
ik ga het nu wel ff testen :)


edit: wtf :?
Naja, nu werkt het iig wel, maar ik draai nu ook over een netwerk, en thuis ga ik direct met een modem. (ja is laptop). Maar http_comp staat iig aan. Ik zal vanavond testen of het ook thuis werkt.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Het enige verschil in request headers is:
first try: Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, */*
second try: Accept: */*

First try:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
GET /cgi-bin/test.cgi HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, */*
Accept-Language: nl
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)
Host: xcc.tiberian.com
Connection: Keep-Alive
Cookie: last_shown_msg=3251; enable_smilies=1; link=; link_title=; mail=OvdSpek@LIACS.NL; name=Olaf+van+der+Spek; notify_icq=1; notify_mail=0; signature=Olaf+van+der+Spek; uin=43235472; last_shown_msg=2858; enable_smilies=1; link=; link_title=; mail=OvdSpek@LIACS.NL; name=Olaf+van+der+Spek; notify_icq=1; notify_mail=0; signature=Olaf+van+der+Spek; uin=43235472

HTTP/1.1 200 OK
Date: Mon, 04 Feb 2002 11:51:45 GMT
Server: Apache/1.3.20 (Unix) PHP/4.0.6
Connection: Close
Content-Encoding: gzip
Set-cookie: last_shown_msg_session=2858
Transfer-Encoding: chunked
Content-Type: text/html

a85
<gzip data>
0

Second try:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GET /cgi-bin/test.cgi HTTP/1.1
Accept: */*
Accept-Language: nl
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)
Host: xcc.tiberian.com
Connection: Keep-Alive
Cookie: last_shown_msg_session=2858; last_shown_msg=3251; enable_smilies=1; link=; link_title=; mail=OvdSpek@LIACS.NL; name=Olaf+van+der+Spek; notify_icq=1; notify_mail=0; signature=Olaf+van+der+Spek; uin=43235472; last_shown_msg=2858; enable_smilies=1; link=; link_title=; mail=OvdSpek@LIACS.NL; name=Olaf+van+der+Spek; notify_icq=1; notify_mail=0; signature=Olaf+van+der+Spek; uin=43235472

HTTP/1.1 200 OK
Date: Mon, 04 Feb 2002 11:52:40 GMT
Server: Apache/1.3.20 (Unix) PHP/4.0.6
Connection: Close
Content-Encoding: gzip
Transfer-Encoding: chunked
Content-Type: text/html

a85
<gzip data>
0

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
woei!
Gaat goed zo zonder compressie :)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Dat was te verwachten. Het zou juist met HTTP compresssie aan ook goed moeten gaan.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Wat me opvalt is dat als ik in PHP HTTP compressie gebruik, dat IE dan de uncompressed size weergeeft bij properties en met mijn eigen code geeft IE de compressed size weer.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op zondag 10 februari 2002 12:39 schreef OlafvdSpek het volgende:
Wat me opvalt is dat als ik in PHP HTTP compressie gebruik, dat IE dan de uncompressed size weergeeft bij properties en met mijn eigen code geeft IE de compressed size weer.
Probeer mozilla, die geeft bij mijn weten de compressed size bij een php-compressed page.

Of de php-compressie werkt natuurlijk gewoon niet bij php :)
(maar dat kan je checken met je access_log van apache)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Staat dat gewoon bij page info?
Welke versie van Mozilla heb ik daarvoor nodig?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op zondag 10 februari 2002 15:21 schreef OlafvdSpek het volgende:
Staat dat gewoon bij page info?
Welke versie van Mozilla heb ik daarvoor nodig?
Humm, ik meende dat ik dat ooit had gezien, blijkbaar niet dus :(

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Maar behalve IE lijkt geen browser er last van te hebben.
Pagina: 1