This document discusses the features and restrictions of the
Tynamo™-aJile server.
This server was written with two things in mind:
- Compliance with the specifications, and
- 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
UnavailableException s.
- The author's goal is compilance with the specifications.
Restrictions
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.
|