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 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
UnavailableException s.
- Template processing.
- 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 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.
|