Features & Restrictions

This server was written with two things in mind:

  1. Compliance with the specifications, and
  2. Efficiency: High speed & Low memory usage

Every design decision in this project considered these two points.

Below are listed the notable features and minor restrictions of this server.

Notable Features

There are a number of features that serparate this server from the pack. These include:
  • Conditionally HTTP/1.1 compilant.
  • Servlet 2.2 compilant (minus some minor things specified in restrictions).
  • Persistent connections.
  • Understands the "Chunked" transfer-coding.
  • Basic and Digest authentication.
  • Multiline headers.
  • Support for nonstandard HTTP methods.
  • URL rewriting for sessions.
  • Quoted cookie values.
  • Authenticated servlets do not require any change to the code other than changing the superclass from HttpServlet to com.qindesign.servlet.AuthenticatedHttpServlet.
  • Remote server shutdown.
  • Pays attention to UnavailableExceptions.
  • Template processing.
  • The author's goal is compilance with the specifications.


This server was designed explicitly for an embedded Java platform. Hence, there are a few minor restrictions that must be considered and accounted for in your designs.

Misc. Notes

  • There is a small delay when loading the server and servlets for the first time. Subsequent requests to the same resource should be quicker.

SNAP Version Restrictions

  • The server must be restarted for timezone changes to take effect (still the case in firmware 0.14.0).
  • The java.io.PrintWriter class is unsupported, so any methods in the servlet API that use them are removed. Specifically, the response object is affected.
  • It is recommended that the log files be stored in a ramdisk to minimize wear on the flash. Please consult the "Information about the flash" section of the FAQ in the SNAP documentation for more details.

NOTE: There is a class called com.qindesign.io.ReadLineInputStream in the Tynamo™ core library that you can use for reading data line by line. There is a readLine() method that returns null when there are no more lines to be read. This is a regular InputStream object, with a constructor that takes another InputStream as an argument.

Servlet 2.2 Restrictions

  • Response buffer size of 0. This means that simply retrieving an output stream or writer will commit the response.
  • The response is not "closed" after HttpServletResponse.sendError, HttpServletResponse.sendRedirect, RequestDispatcher.forward, or when the amount of content specified in the "Content-Length" header has been written to the response.
    Except for the case of exceeding the specified content length, there are no checks performed that catch a servlet writing out content after these events.
  • No JSP.
  • Currently only one ServletContext for all requested paths.
  • Must add cookies and sessions before the response is committed.
  • Does not pay attention to the time indicated by UnavailableException. A "Retry-After" header is sent during when servicing, but the container does not wait to recreate the servlet for another request during initialization.
  • The javax.servlet.context.tempdir context attribute is not set if a valid directory is not specified in the servlet.tempdir configuration property.
  • The destroy method is called on a servlet immediately after a permanent UnavailableException is detected. This means that the servlet author should take care to properly synchronize and manage any resources used during the service method.
  • There is a similar note for when the server is shut down. The destroy method is called immediately, and any threads running in the service method are not given a chance to complete. In other words, the server defined time limit is zero.

HTTP/1.1 Restrictions

  • The "Expect" header is not fully supported: Only a (case-insensitive) value of "100-continue" is recognized, and if this is encountered, a 100 (Continue) status is sent right away.
  • Persistent connections are not used with the "chunked" transfer encoding.