2012-03-08 15 views

Odpowiedz

4

To jest stare pytanie, ale wciąż zajmuje pierwsze miejsce w Google dla mnie, więc przypuszczam, że odpowiednia odpowiedź może być przydatna dla kogoś przy mnie.

Rozwiązanie okazuje się bardzo proste. w do_GET(), do_POST, itp, trzeba tylko dodać:

content = self.gzipencode(strcontent) 
...your other headers, etc... 
self.send_header("Content-length", str(len(str(content)))) 
self.send_header("Content-Encoding", "gzip") 
self.end_headers() 
self.wfile.write(content) 
self.wfile.flush() 

strcontent jest rzeczywista zawartość (jak w HTML, JavaScript lub innych zasobów HTML) i gzipencode:

def gzipencode(self, content): 
    import StringIO 
    import gzip 
    out = StringIO.StringIO() 
    f = gzip.GzipFile(fileobj=out, mode='w', compresslevel=5) 
    f.write(content) 
    f.close() 
    return out.getvalue() 
+0

Velis, masz gdzieś kompletny kod funkcjonowania? –

+0

Oczywiście powyższe były prostymi kopiami-pastami tego kodu. Ale znowu, powyższe fragmenty mówią wszystko i cały funkcjonujący kod pełni także funkcję mostu JSON, który mógłby zamazać cel tego pytania. W każdym razie, wyślij mi wiadomość, jeśli potrzebujesz więcej informacji lub kodu. – velis

+0

dzięki - po prostu podrzuciłem ci linię. –

0

Opierając się na @velis odpowiedzieć powyżej, oto jak to zrobić. gZipping małych danych nie jest warte czasu i może zwiększyć jego rozmiar. Testowane z klientem Dalvik.

def do_GET(self): 
    ... get content 
    self.send_response(returnCode)  # 200, 401, etc 
    ...your other headers, etc... 
    if len(content) > 100:      # don't bother compressing small data 
     if 'accept-encoding' in self.headers: # case insensitive 
      if 'gzip' in self.headers['accept-encoding']: 
       content = gzipencode(content) # gzipencode defined above in @velis answer 
       self.send_header('content-encoding', 'gzip') 
    self.send_header('content-length', len(content)) 
    self.end_headers()   # send a blank line 
    self.wfile.write(content) 
2

Podobnie jak wiele innych, używam również testów lokalnych. Jest to nadal najlepszy wynik w Google, a gdy https://github.com/ksmith97/GzipSimpleHTTPServer jest dobrym rozwiązaniem, wymusza gzip, nawet jeśli nie jest wymagany, i nie ma flagi do włączenia/wyłączenia go.

Postanowiłem napisać małe narzędzie cli, które obsługuje to. To idź, więc regularne zainstalować Procedura jest prosta:

go get github.com/rhardih/serve

Jeśli masz już $GOPATH dodany do $PATH, to wszystko, czego potrzebujesz. Teraz masz jako serve polecenie.

https://github.com/rhardih/serve

Powiązane problemy