Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to properly send an HTTP message to the client

I'm working on a RESTful web service in Java. I need a good way to send error messages to the client if something's wrong.

According to the Javadoc, HttpServletResponse.setStatus(int status, String message) is deprecated "due to ambiguous meaning of the message parameter."

Is there a preferred way to set the status message or "reason phrase" of the response? The sendError(int, String) method doesn't do it.

EDIT: To clarify, I want to modify the HTTP status line, i.e. "HTTP/1.1 404 Not Found", not the body content. Specifically, I'd like to send responses like "HTTP/1.1 400 Missing customerNumber parameter".

like image 807
Adam Crume Avatar asked Jul 08 '09 22:07

Adam Crume


People also ask

What is a proper HTTP response?

After receiving and interpreting a request message, a server responds with an HTTP response message: A Status-line. Zero or more header (General|Response|Entity) fields followed by CRLF. An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields. Optionally a message-body.

How do I send a HTTP request?

The most common HTTP request methods have a call shortcut (such as http. get and http. post), but you can make any type of HTTP request by setting the call field to http. request and specifying the type of request using the method field.

What are the 3 parts to a HTTP response message?

An HTTP response contains: A status line. A series of HTTP headers, or header fields. A message body, which is usually needed.

What is HTTP message format?

An HTTP message contains components that are appropriate to its type. The bit stream containing headers and body is parsed and represented within the message tree when an input request is received by an HTTPInput node, or when a response from a web service is received by the HTTPRequest node.


2 Answers

I don't think any RESTful client would expect to look at the reason phrase to figure out what went wrong; most RESTful services I've seen/used will send the standard status info and an expanded message in the body of the response. sendError(int, String) is ideal for that situation.

like image 116
Hank Gay Avatar answered Sep 24 '22 17:09

Hank Gay


If you're using Tomcat, see the setting org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER:

http://tomcat.apache.org/tomcat-5.5-doc/config/systemprops.html

  • If this is true custom HTTP status messages will be used within HTTP headers. Users must ensure that any such message is ISO-8859-1 encoded, particularly if user provided input is included in the message, to prevent a possible XSS vulnerability. If not specified the default value of false will be used.

See this page for some detail on the original vulnerability:

http://www.securityfocus.com/archive/1/archive/1/495021/100/0/threaded

like image 33
ars Avatar answered Sep 24 '22 17:09

ars