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.
There are a number of features that serparate this server from the pack.
- Conditionally HTTP/1.1 compilant.
- Servlet 2.2 compilant (minus some minor things specified in
- 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
- Remote server shutdown.
- Pays attention to
- 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.
- There is a small delay when loading the server and servlets for the
first time. Subsequent requests to the same resource should be
SNAP Version Restrictions
- The server must be restarted for timezone changes to take effect
(still the case in firmware 0.14.0).
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
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
InputStream object, with a constructor that
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
RequestDispatcher.forward, or when the amount of
content specified in the "Content-Length" header has been written to
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
A "Retry-After" header is sent during when servicing, but the container
does not wait to recreate the servlet for another request during
javax.servlet.context.tempdir context attribute is
not set if a valid directory is not specified in the
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
- 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
- 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