Как использовать Content-Encoding: gzip с Python SimpleHTTPServer - PullRequest
6 голосов
/ 08 марта 2012

Я использую python -m SimpleHTTPServer для обслуживания каталога для локального тестирования в веб-браузере. Часть содержимого включает в себя большие файлы данных. Я хотел бы иметь возможность gzip их и иметь SimpleHTTPServer обслуживать их с Content-Encoding: gzip.

Есть ли простой способ сделать это?

Ответы [ 5 ]

8 голосов
/ 09 февраля 2014

Так как это был лучший результат Google, я решил опубликовать свою простую модификацию скрипта, который заставил gzip работать.

https://github.com/ksmith97/GzipSimpleHTTPServer

4 голосов
/ 12 июня 2013

Это старый вопрос, но он все еще занимает первое место в Google для меня, поэтому я полагаю, что правильный ответ может быть полезен для кого-то рядом со мной.

Решение оказывается очень простым. в do_GET (), do_POST и т. д. вам нужно только добавить следующее:

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 - ваш фактический контент (как в HTML, javascript или других ресурсах HTML) и 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()
2 голосов
/ 27 апреля 2016

Как и многие другие, я также использовал python -m SimpleHTTPServer для локального тестирования.Это по-прежнему лучший результат в Google, и хотя https://github.com/ksmith97/GzipSimpleHTTPServer является хорошим решением, оно применяет gzip, даже если его не запрашивают, и нет флага для его включения / отключения.

Я решил написать крошечноеCli инструмент, который поддерживает это.Ну что ж, обычная процедура установки проста:

go get github.com/rhardih/serve

Если у вас уже есть $GOPATH, добавленный к $PATH, это все, что вам нужно.Теперь у вас есть serve в качестве команды.

https://github.com/rhardih/serve

0 голосов
/ 20 сентября 2014

Опираясь на ответ @velis выше, вот как я это делаю.gZipping небольшие данные не стоит времени и может увеличить их размер.Протестировано с клиентом 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)
0 голосов
/ 25 апреля 2012

Посмотрев на документацию SimpleHTTPServer , пути нет. Тем не менее, я рекомендую lighttpd с модулем mod_compress .

...