Tynamo™-aJile Features & Restrictions

This document discusses the features and restrictions of the Tynamo™-aJile server.

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 authentication.
  • Multiline headers.
  • Support for nonstandard HTTP methods.
  • URL rewriting for sessions.
  • Quoted cookie values.
  • Authenticated GET and POST servlets do not require any change to the code other than changing the superclass from HttpServlet to AuthenticatedHttpServlet.
  • Remote server shutdown.
  • Pays attention to UnavailableExceptions.
  • 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 limitations that must be considered and accounted for in your designs.

aJile Version Limitations

  • The java.util.Locale, java.io.PrintWriter, and java.io.BufferedReader classes are unsupported, so any methods in the servlet API that use them are removed. Specifically, the request and response objects are affected.

    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.

  • Floating point to string conversion is not perfected yet, and may display long repeating decimals. e.g. "0.09999999" instead of "0.1".
  • The current version of the aJile firmware (3.16.09) uses the maximum TCP timeout, and so sockets can be unavailable for two full minutes. This was circumvented by using the ethernet0.tcp.twomsl system property. It is set to 10 seconds (specified in ms), but can be changed. This may be fixed in a future release of their software.

Servlet 2.2 Restrictions

  • Response buffer size of 0. This means that simply retrieving an output stream or writer will commit the response.
  • No relative URLs permitted in HttpServletResponse.sendRedirect.
  • 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.
  • 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.
  • Changes from the Servlet/2.2 API:
    • Not included:
      • javax.servlet.ServletContext: getResource(String)
      • javax.servlet.ServletRequest: getLocale(),getReader()
      • javax.servlet.ServletResponse: getLocale(),getWriter(),setLocale(java.util.Locale)
      • javax.servlet.http.HttpServletRequest: getUserPrincipal()
    • Changed:
      • javax.servlet.GenericServlet does not implement java.io.Serializable
      • javax.servlet.http.HttpServlet does not implement java.io.Serializable
      • javax.servlet.http.Cookie does not implement Cloneable
    • Because the firmware (3.16.09) does not support reflection, javax.servlet.http.HttpServlet cannot determine which methods to put into the "Allow" header when a "405 Method Not Allowed" error is sent.

HTTP/1.1 Limitations

  • The "Expect" header is not supported.
  • Path parameters are only allowed at the end of a path.
  • Persistent connections are not used with the "chunked" transfer encoding.