This class provides an output stream for requests. The stream must first
be associated with a request before it may be used; this is done by
passing it to one of the request methods in HTTPConnection. Example:
OutputStream out = new HttpOutputStream(12345);
rsp = con.Post("/cgi-bin/my_cgi", out);
out.write(...);
out.close();
if (rsp.getStatusCode() >= 300)
...
There are two constructors for this class, one taking a length parameter,
and one without any parameters. If the stream is created with a length
then the request will be sent with the corresponding Content-length header
and anything written to the stream will be written on the socket immediately.
This is the preferred way. If the stream is created without a length then
one of two things will happen: if, at the time of the request, the server
is known to understand HTTP/1.1 then each write() will send the data
immediately using the chunked encoding. If, however, either the server
version is unknown (because this is first request to that server) or the
server only understands HTTP/1.0 then all data will be written to a buffer
first, and only when the stream is closed will the request be sent.
Another reason that using the HttpOutputStream(length)
constructor is recommended over the HttpOutputStream() one is
that some HTTP/1.1 servers do not allow the chunked transfer encoding to
be used when POSTing to a cgi script. This is because the way the cgi API
is defined the cgi script expects a Content-length environment variable.
If the data is sent using the chunked transfer encoding however, then the
server would have to buffer all the data before invoking the cgi so that
this variable could be set correctly. Not all servers are willing to do
this.
If you cannot use the HttpOutputStream(length) constructor and
are having problems sending requests (usually a 411 response) then you can
try setting the system property HTTPClient.dontChunkRequests to
true (this needs to be done either on the command line or
somewhere in the code before the HTTPConnection is first accessed). This
will prevent the client from using the chunked encoding in this case and
will cause the HttpOutputStream to buffer all the data instead, sending it
only when close() is invoked.
The behaviour of a request sent with an output stream may differ from
that of a request sent with a data parameter. The reason for this is that
the various modules cannot resend a request which used an output stream.
Therefore such things as authorization and retrying of requests won't be
done by the HTTPClient for such requests.
version: 0.3-2 18/06/1999 author: Ronald Tschalär since: V0.3 |