Как я могу обслуживать изображения в формате GZIP из Google App Engine

#python #http #google-app-engine #webapp2

#python #http #google-app-engine #webapp2

Вопрос:

Я пытаюсь получить доступ к ссылкам для включения изображений на Facebook. Отладчик Facebook share сообщает, что изображения не кодируются с помощью gzip, что, по-видимому, является обязательным требованием.

Используя curl, я могу подтвердить то, что Facebook говорит. Во всех документах, которые я могу найти, говорится, что кодирование в формате gzip должно происходить автоматически, поэтому я не уверен, как это исправить.

Вот результат curl:

 $ curl -v -D /tmp/h -H "Accept-Encoding: gzip" http://m.kaon.com/ss/5907657076506624.jpg > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 172.217.3.115...
* TCP_NODELAY set
* Connected to m.kaon.com (172.217.3.115) port 80 (#0)
> GET /ss/5907657076506624.jpg HTTP/1.1
> Host: m.kaon.com
> User-Agent: curl/7.54.0
> Accept: */*
> Accept-Encoding: gzip
> 
< HTTP/1.1 200 OK
< Cache-Control: no-cache
< Content-Type: image/jpeg
< X-Cloud-Trace-Context: 5b0c467df46cb34732e5721733742742
< Date: Wed, 13 Mar 2019 15:11:08 GMT
< Server: Google Frontend
< Content-Length: 128384
< 
{ [3516 bytes data]
100  125k  100  125k    0     0   620k      0 --:--:-- --:--:-- --:--:--  623k
* Connection #0 to host m.kaon.com left intact
$ cat /tmp/h
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: image/jpeg
X-Cloud-Trace-Context: 5b0c467df46cb34732e5721733742742
Date: Wed, 13 Mar 2019 15:11:08 GMT
Server: Google Frontend
Content-Length: 128384
  

И вот код, который обслуживает изображение:

 class SSHandler(webapp2.RequestHandler):
  def get(self, id):
    a = ScreenShotModel.get_by_id(int(id))
    self.response.headers['Content-Type'] = 'image/jpeg'
    self.response.out.write(a.image)
  

Есть ли какой-то параметр app.yaml, которого мне не хватает, или, возможно, мне нужно добавить что-то еще в заголовки? Или я должен сам искать заголовок accept-encoding и выполнять gzip в моем коде python?

Комментарии:

1. Вы пробовали добавлять в свой код self.response.headers['Content-Encoding'] = 'gzip' , чтобы добавить в заголовок тип кодировки?

2. Было бы очень удивительно, если бы это сработало. В любом случае, я попробовал это, и это ничего не изменило. Фактически, GAE удалил это. GAE не позволяет вам устанавливать заголовок content-encoding. cloud.google.com/appengine/docs/standard/go/reference / …

3. Facebook спонтанно начал принимать мои изображения без gzip’d, поэтому, я думаю, мне не нужен этот ответ. Но мне все еще интересно, знает ли кто-нибудь ответ.

Ответ №1:

Нет смысла архивировать jpeg. Он уже сжат.

Существует набор разрешенных типов mime для сжатия. JPEG не является одним из них.

Типичными из белого списка являются:

текст / обычный, текст / html, приложение / javascript и т. Д

Комментарии:

1. JPEG сжимается поблочно, и фактически, GZIP в формате JPEG часто создает файлы гораздо меньшего размера, потому что между блоками есть сходство. Вполне допустимо захотеть архивировать JPEG, и странно, что GAE, похоже, этого не разрешает.