Dart Documentationhttp_serverHttpBodyHandler

HttpBodyHandler class

HttpBodyHandler is a helper class for processing and collecting HTTP message data in an easy-to-use HttpBody object. The content body is parsed, depending on the Content-Type header field. When the full body is read and parsed the body content is made available. The class can be used to process both server requests and client responses.

The following content types are recognized:

text/ *
application/json
application/x-www-form-urlencoded
multipart/form-data

For content type text/\* the body is decoded into a string. The 'charset' parameter of the content type specifies the encoding used for decoding. If no 'charset' is present the default encoding of ISO-8859-1 is used.

For content type application/json the body is decoded into a string which is then parsed as JSON. The resulting body is a Map. The 'charset' parameter of the content type specifies the encoding used for decoding. If no 'charset' is present the default encoding of UTF-8 is used.

For content type application/x-www-form-urlencoded the body is a query string which is then split according to the rules for splitting a query string. The resulting body is a Map<String, String>. If the same name is present several times in the query string, then the last value seen for this name will be in the resulting map. The encoding US-ASCII is always used for decoding the body.

For content type multipart/form-data the body is parsed into it's different fields. The resulting body is a Map<String, dynamic>, where the value is a String for normal fields and a HttpBodyFileUpload instance for file upload fields. If the same name is present several times, then the last value seen for this name will be in the resulting map.

When using content type multipart/form-data the encoding of fields with String values is determined by the browser sending the HTTP request with the form data. The encoding is specified either by the attribute accept-charset on the HTML form, or by the content type of the web page containing the form. If the HTML form has an accept-charset attribute the browser will use the encoding specified there. If the HTML form has no accept-charset attribute the browser determines the encoding from the content type of the web page containing the form. Using a content type of text/html; charset=utf-8 for the page and setting accept-charset on the HTML form to utf-8 is recommended as the default for HttpBodyHandler is UTF-8. It is important to get these encoding values right, as the actual multipart/form-data HTTP request sent by the browser does not contain any information on the encoding. If something else than UTF-8 is used defaultEncoding needs to be set in the HttpBodyHandler constructor and calls to processRequest and processResponse.

For all other content types the body will be treated as uninterpreted binary data. The resulting body will be of type List<int>.

To use with the HttpServer for request messages, HttpBodyHandler can be used as either a StreamTransformer or as a per-request handler (see processRequest).

HttpServer server = ...
server.transform(new HttpBodyHandler())
    .listen((HttpRequestBody body) {
      ...
    });

To use with the HttpClient for response messages, HttpBodyHandler can be used as a per-request handler (see processResponse).

HttpClient client = ...
client.get(...)
    .then((HttpClientRequest response) => response.close())
    .then(HttpBodyHandler.processResponse)
    .then((HttpClientResponseBody body) {
      ...
    });
class HttpBodyHandler
   implements StreamTransformer<HttpRequest, HttpRequestBody> {
 var _transformer;

 /**
  * Create a new [HttpBodyHandler] to be used with a [Stream]<[HttpRequest]>,
  * e.g. a [HttpServer].
  *
  * If the page is served using different encoding than UTF-8, set
  * [defaultEncoding] accordingly. This is required for parsing
  * `multipart/form-data` content correctly. See the class comment
  * for more information on `multipart/form-data`.
  */
 HttpBodyHandler({Encoding defaultEncoding: UTF8})
     : _transformer = new _HttpBodyHandlerTransformer(defaultEncoding);

 /**
  * Process and parse an incoming [HttpRequest]. The returned [HttpRequestBody]
  * contains a [response] field for accessing the [HttpResponse].
  *
  * See [HttpBodyHandler] constructor for more info on [defaultEncoding].
  */
 static Future<HttpRequestBody> processRequest(
     HttpRequest request,
     {Encoding defaultEncoding: UTF8}) {
   return _HttpBodyHandler.processRequest(request, defaultEncoding);
 }

 /**
  * Process and parse an incoming [HttpClientResponse].
  *
  * See [HttpBodyHandler] constructor for more info on [defaultEncoding].
  */
 static Future<HttpClientResponseBody> processResponse(
     HttpClientResponse response,
     {Encoding defaultEncoding: UTF8}) {
   return _HttpBodyHandler.processResponse(response, defaultEncoding);
 }

 Stream<HttpRequestBody> bind(Stream<HttpRequest> stream) {
   return _transformer.bind(stream);
 }
}

Implements

StreamTransformer<HttpRequest, HttpRequestBody>

Static Methods

Future<HttpRequestBody> processRequest(HttpRequest request, {Encoding defaultEncoding: UTF8}) #

Process and parse an incoming HttpRequest. The returned HttpRequestBody contains a response field for accessing the HttpResponse.

See HttpBodyHandler constructor for more info on defaultEncoding.

static Future<HttpRequestBody> processRequest(
   HttpRequest request,
   {Encoding defaultEncoding: UTF8}) {
 return _HttpBodyHandler.processRequest(request, defaultEncoding);
}

Future<HttpClientResponseBody> processResponse(HttpClientResponse response, {Encoding defaultEncoding: UTF8}) #

Process and parse an incoming HttpClientResponse.

See HttpBodyHandler constructor for more info on defaultEncoding.

static Future<HttpClientResponseBody> processResponse(
   HttpClientResponse response,
   {Encoding defaultEncoding: UTF8}) {
 return _HttpBodyHandler.processResponse(response, defaultEncoding);
}

Constructors

new HttpBodyHandler({Encoding defaultEncoding: UTF8}) #

Create a new HttpBodyHandler to be used with a Stream<HttpRequest>, e.g. a HttpServer.

If the page is served using different encoding than UTF-8, set defaultEncoding accordingly. This is required for parsing multipart/form-data content correctly. See the class comment for more information on multipart/form-data.

HttpBodyHandler({Encoding defaultEncoding: UTF8})
   : _transformer = new _HttpBodyHandlerTransformer(defaultEncoding);

Methods

Stream<HttpRequestBody> bind(Stream<HttpRequest> stream) #

Stream<HttpRequestBody> bind(Stream<HttpRequest> stream) {
 return _transformer.bind(stream);
}