Сообщение с кодом состояния HTTP App Engine

Я обнаружил несоответствие между dev_appserver Java и работающим сервером App Engine.

На моем локальном сервере разработки у меня есть сервлет, который возвращает:

return response.sendError(response.SC_BAD_REQUEST, "Please log in to comment");

Когда я захожу на страницу, я получаю в заголовке сообщение с кодом состояния:

Status Code:400 Please log in to comment

Проблема возникает, когда я развертываю это в App Engine. При доступе к тому же сервлету я получаю этот «Неверный запрос» вместо «Пожалуйста, войдите, чтобы прокомментировать»:

Status Code:400 Bad Request

Сообщение с кодом состояния Please log in to comment отображается в HTML-коде содержимого, но не в заголовке, как в среде разработки.

Почему это?

Изменить

Вот трассировки curl -vvvv как для dev_appserver, так и для производства:

трассировка скручивания dev_appserver:

> POST /add-comment HTTP/1.1
> User-Agent: Mozilla/4.0
> Host: localhost:8080
> Accept: */*
> Content-Length: 9
> Content-Type: application/x-www-form-urlencoded
>         
< HTTP/1.1 400 Please log in to comment
< Content-Type: text/html; charset=iso-8859-1
< Cache-Control: must-revalidate,no-cache,no-store
< Content-Length: 1406
< Server: Jetty(6.1.x)

След производственного завитка:

> POST /add-comment HTTP/1.1
> User-Agent: Mozilla/4.0
> Host: www.xxx.org
> Accept: */*
> Content-Length: 9
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 400 Bad Request
< Content-Type: text/html; charset=utf-8
< Vary: Accept-Encoding
< Date: Thu, 18 Aug 2011 14:04:26 GMT
< Server: Google Frontend
< Cache-Control: private
< Transfer-Encoding: chunked

person Luca Matteis    schedule 17.08.2011    source источник
comment
Можете ли вы добавить трассировку curl -vvvv для двух вызовов, devappserver и production?   -  person proppy    schedule 17.08.2011


Ответы (2)


Я бы сказал, что система prod является правильной реализацией. Javadocs для sendError() говорят:

Отправляет ответ об ошибке клиенту, используя указанный статус. По умолчанию сервер создает ответ, который выглядит как страница ошибки сервера в формате HTML, содержащая указанное сообщение, устанавливая тип содержимого "текст/html", оставляя файлы cookie и другие заголовки без изменений. Если для веб-приложения было сделано объявление страницы ошибки, соответствующее переданному коду состояния, оно будет возвращено вместо предложенного параметра msg.

Если ответ уже был зафиксирован, этот метод создает исключение IllegalStateException. После использования этого метода ответ следует считать зафиксированным и в него не следует записывать.

Я выделил часть. Это говорит о том, что он просто возвращает html-страницу с сообщением, когда это возможно. Он не говорит, что использует его в коде состояния HTTP (которого я лично тоже нигде не видел :()

person ZeissS    schedule 18.08.2011
comment
Интересный. Хотя вроде ты прав. Ничего не говорит о сообщении кода состояния. Jetty (dev_appserver), кажется, показывает это как сообщение о состоянии HTTP, но другие могут этого не делать. Интересно, есть ли способ заставить это в среде App Engine - я думаю, что люди могут установить свое собственное сообщение о состоянии в заголовке. - person Luca Matteis; 18.08.2011

Это не проблема конкретно sendError. Метод setStatus будет вести себя так же. В обычной Java и sendError, и setStatus задают описание состояния. Проблема заключается в том, что производственный сервер App Engine всегда задает для описания состояния стандартное описание для каждого кода.

person mgiuca    schedule 14.08.2012