2012-03-08 20 views

Respuesta

4

Esta es una vieja pregunta, pero todavía ocupa el n. ° 1 en Google para mí, por lo que supongo que una respuesta adecuada podría ser útil para alguien a mi lado.

La solución resulta ser muy simple. en el do_GET(), do_POST, etc, sólo tiene que añadir lo siguiente:

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 ser su contenido real (como en HTML, JavaScript u otros recursos HTML) y la 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, ¿tiene código de funcionamiento completa en alguna parte? –

+0

Por supuesto, lo anterior eran copias directas de ese código. Pero, una vez más, los fragmentos anteriores lo dicen todo y el código de funcionamiento completo también sirve como un puente JSON que podría difuminar el objetivo de esta pregunta. De todos modos, envíenme un correo si necesita más información o el código. – velis

+0

gracias, simplemente te dejé una línea. –

0

Basándose en @velis respuesta anterior, aquí es cómo lo hago. GZip pequeño de datos no vale la pena el tiempo y puede aumentar su tamaño. Probado con el cliente de 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

Como tantos otros, he estado usando python -m SimpleHTTPServer, para probar también. Este sigue siendo el mejor resultado en google y mientras que https://github.com/ksmith97/GzipSimpleHTTPServer es una buena solución, impone gzip incluso si no se solicita y no hay ninguna marca que lo habilite/deshabilite.

Decidí escribir una pequeña herramienta cli que sea compatible con esto. Es ir, por lo que el procedimiento de instalación normal es simplemente:

go get github.com/rhardih/serve

Si ya tiene $GOPATH añaden a $PATH, eso es todo lo que necesita. Ahora tiene serve como un comando.

https://github.com/rhardih/serve

Cuestiones relacionadas