2012-03-08 13 views

risposta

4

Questa è una vecchia domanda, ma è ancora al primo posto in Google per me, quindi suppongo che una risposta appropriata potrebbe essere utile a qualcuno accanto a me.

La soluzione risulta essere molto semplice. nel do_GET(), do_POST, ecc, è sufficiente aggiungere il seguente:

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 essere il contenuto effettivo (come in HTML, JavaScript o altre risorse HTML) e il 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, avete codice di funzionamento completo da qualche parte? –

+0

Ovviamente, le precedenti erano copia-incolla di quel codice. Ma poi di nuovo, i frammenti di cui sopra dicono tutto e il codice completo funziona anche come un ponte JSON che sarebbe un po 'offuscare il fine di questa domanda. Comunque, mandami una mail se hai bisogno di maggiori informazioni o del codice. – velis

+0

grazie - ti ho appena lasciato una linea. –

0

Sulla @velis risposta di cui sopra, ecco come lo faccio. gGestione dei piccoli dati non vale la pena e può aumentare le sue dimensioni. Testato con il cliente 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

Come tanti altri, ho usato python -m SimpleHTTPServer per il test locale. Questo è ancora il risultato migliore su google e mentre https://github.com/ksmith97/GzipSimpleHTTPServer è una soluzione piacevole, impone gzip anche se non richiesto e non c'è alcun flag per abilitarlo/disabilitarlo.

Ho deciso di scrivere un piccolo strumento cli che supporti questo. E 'andare, così la procedura regolare installazione è semplice:

go get github.com/rhardih/serve

Se si dispone già di $GOPATH aggiunto $PATH, questo è tutto ciò che serve. Ora hai serve come comando.

https://github.com/rhardih/serve