523 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			523 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <HTML><HEAD><TITLE>Tcl Built-In Commands - Http manual page</TITLE></HEAD><BODY>
 | |
| <DL>
 | |
| <DD><A HREF="http.htm#M2" NAME="L469">NAME</A>
 | |
| <DL><DD>Http - Client-side implementation of the HTTP/1.0 protocol.</DL>
 | |
| <DD><A HREF="http.htm#M3" NAME="L470">SYNOPSIS</A>
 | |
| <DL>
 | |
| <DD><B>package require http ?2.4?</B>
 | |
| <DD><B>::http::config </B><I>?options?</I>
 | |
| <DD><B>::http::geturl </B><I>url ?options?</I>
 | |
| <DD><B>::http::formatQuery </B><I>list</I>
 | |
| <DD><B>::http::reset </B><I>token</I>
 | |
| <DD><B>::http::wait </B><I>token</I>
 | |
| <DD><B>::http::status </B><I>token</I>
 | |
| <DD><B>::http::size </B><I>token</I>
 | |
| <DD><B>::http::code </B><I>token</I>
 | |
| <DD><B>::http::ncode </B><I>token</I>
 | |
| <DD><B>::http::data </B><I>token</I>
 | |
| <DD><B>::http::error </B><I>token</I>
 | |
| <DD><B>::http::cleanup </B><I>token</I>
 | |
| <DD><B>::http::register </B><I>proto port command</I>
 | |
| <DD><B>::http::unregister </B><I>proto</I>
 | |
| </DL>
 | |
| <DD><A HREF="http.htm#M4" NAME="L471">DESCRIPTION</A>
 | |
| <DD><A HREF="http.htm#M5" NAME="L472">COMMANDS</A>
 | |
| <DL>
 | |
| <DD><A HREF="http.htm#M6" NAME="L473"><B>::http::config</B> ?<I>options</I>?</A>
 | |
| <DL>
 | |
| <DD><A HREF="http.htm#M7" NAME="L474"><B>-accept</B> <I>mimetypes</I></A>
 | |
| <DD><A HREF="http.htm#M8" NAME="L475"><B>-proxyhost</B> <I>hostname</I></A>
 | |
| <DD><A HREF="http.htm#M9" NAME="L476"><B>-proxyport</B> <I>number</I></A>
 | |
| <DD><A HREF="http.htm#M10" NAME="L477"><B>-proxyfilter</B> <I>command</I></A>
 | |
| <DD><A HREF="http.htm#M11" NAME="L478"><B>-useragent</B> <I>string</I></A>
 | |
| </DL>
 | |
| <DD><A HREF="http.htm#M12" NAME="L479"><B>::http::geturl</B> <I>url</I> ?<I>options</I>?</A>
 | |
| <DL>
 | |
| <DD><A HREF="http.htm#M13" NAME="L480"><B>-binary</B> <I>boolean</I></A>
 | |
| <DD><A HREF="http.htm#M14" NAME="L481"><B>-blocksize</B> <I>size</I></A>
 | |
| <DD><A HREF="http.htm#M15" NAME="L482"><B>-channel</B> <I>name</I></A>
 | |
| <DD><A HREF="http.htm#M16" NAME="L483"><B>-command</B> <I>callback</I></A>
 | |
| <DD><A HREF="http.htm#M17" NAME="L484"><B>-handler</B> <I>callback</I></A>
 | |
| <DD><A HREF="http.htm#M18" NAME="L485"><B>-headers</B> <I>keyvaluelist</I></A>
 | |
| <DD><A HREF="http.htm#M19" NAME="L486"><B>-progress</B> <I>callback</I></A>
 | |
| <DD><A HREF="http.htm#M20" NAME="L487"><B>-query</B> <I>query</I></A>
 | |
| <DD><A HREF="http.htm#M21" NAME="L488"><B>-queryblocksize</B> <I>size</I></A>
 | |
| <DD><A HREF="http.htm#M22" NAME="L489"><B>-querychannel</B> <I>channelID</I></A>
 | |
| <DD><A HREF="http.htm#M23" NAME="L490"><B>-queryprogress</B> <I>callback</I></A>
 | |
| <DD><A HREF="http.htm#M24" NAME="L491"><B>-timeout</B> <I>milliseconds</I></A>
 | |
| <DD><A HREF="http.htm#M25" NAME="L492"><B>-type</B> <I>mime-type</I></A>
 | |
| <DD><A HREF="http.htm#M26" NAME="L493"><B>-validate</B> <I>boolean</I></A>
 | |
| </DL>
 | |
| <DD><A HREF="http.htm#M27" NAME="L494"><B>::http::formatQuery</B> <I>key value</I> ?<I>key value</I> ...?</A>
 | |
| <DD><A HREF="http.htm#M28" NAME="L495"><B>::http::reset</B> <I>token</I> ?<I>why</I>?</A>
 | |
| <DD><A HREF="http.htm#M29" NAME="L496"><B>::http::wait</B> <I>token</I></A>
 | |
| <DD><A HREF="http.htm#M30" NAME="L497"><B>::http::data</B> <I>token</I></A>
 | |
| <DD><A HREF="http.htm#M31" NAME="L498"><B>::http::error</B> <I>token</I></A>
 | |
| <DD><A HREF="http.htm#M32" NAME="L499"><B>::http::status</B> <I>token</I></A>
 | |
| <DD><A HREF="http.htm#M33" NAME="L500"><B>::http::code</B> <I>token</I></A>
 | |
| <DD><A HREF="http.htm#M34" NAME="L501"><B>::http::ncode</B> <I>token</I></A>
 | |
| <DD><A HREF="http.htm#M35" NAME="L502"><B>::http::size</B> <I>token</I></A>
 | |
| <DD><A HREF="http.htm#M36" NAME="L503"><B>::http::cleanup</B> <I>token</I></A>
 | |
| <DD><A HREF="http.htm#M37" NAME="L504"><B>::http::register</B> <I>proto port command</I></A>
 | |
| <DD><A HREF="http.htm#M38" NAME="L505"><B>::http::unregister</B> <I>proto</I></A>
 | |
| </DL>
 | |
| <DD><A HREF="http.htm#M39" NAME="L506">ERRORS</A>
 | |
| <DL>
 | |
| <DD><A HREF="http.htm#M40" NAME="L507">ok</A>
 | |
| <DD><A HREF="http.htm#M41" NAME="L508">eof</A>
 | |
| <DD><A HREF="http.htm#M42" NAME="L509">error</A>
 | |
| </DL>
 | |
| <DD><A HREF="http.htm#M43" NAME="L510">STATE ARRAY</A>
 | |
| <DL>
 | |
| <DD><A HREF="http.htm#M44" NAME="L511"><B>body</B></A>
 | |
| <DD><A HREF="http.htm#M45" NAME="L512"><B>charset</B></A>
 | |
| <DD><A HREF="http.htm#M46" NAME="L513"><B>coding</B></A>
 | |
| <DD><A HREF="http.htm#M47" NAME="L514"><B>currentsize</B></A>
 | |
| <DD><A HREF="http.htm#M48" NAME="L515"><B>error</B></A>
 | |
| <DD><A HREF="http.htm#M49" NAME="L516"><B>http</B></A>
 | |
| <DD><A HREF="http.htm#M50" NAME="L517"><B>meta</B></A>
 | |
| <DL>
 | |
| <DD><A HREF="http.htm#M51" NAME="L518"><B>Content-Type</B></A>
 | |
| <DD><A HREF="http.htm#M52" NAME="L519"><B>Content-Length</B></A>
 | |
| <DD><A HREF="http.htm#M53" NAME="L520"><B>Location</B></A>
 | |
| </DL>
 | |
| <DD><A HREF="http.htm#M54" NAME="L521"><B>posterror</B></A>
 | |
| <DD><A HREF="http.htm#M55" NAME="L522"><B>status</B></A>
 | |
| <DD><A HREF="http.htm#M56" NAME="L523"><B>totalsize</B></A>
 | |
| <DD><A HREF="http.htm#M57" NAME="L524"><B>type</B></A>
 | |
| <DD><A HREF="http.htm#M58" NAME="L525"><B>url</B></A>
 | |
| </DL>
 | |
| <DD><A HREF="http.htm#M59" NAME="L526">EXAMPLE</A>
 | |
| <DD><A HREF="http.htm#M60" NAME="L527">SEE ALSO</A>
 | |
| <DD><A HREF="http.htm#M61" NAME="L528">KEYWORDS</A>
 | |
| </DL><HR>
 | |
| <H3><A NAME="M2">NAME</A></H3>
 | |
| Http - Client-side implementation of the HTTP/1.0 protocol.
 | |
| <H3><A NAME="M3">SYNOPSIS</A></H3>
 | |
| <B>package require http ?2.4?</B><BR>
 | |
| <B>::http::config </B><I>?options?</I><BR>
 | |
| <B>::http::geturl </B><I>url ?options?</I><BR>
 | |
| <B>::http::formatQuery </B><I>list</I><BR>
 | |
| <B>::http::reset </B><I>token</I><BR>
 | |
| <B>::http::wait </B><I>token</I><BR>
 | |
| <B>::http::status </B><I>token</I><BR>
 | |
| <B>::http::size </B><I>token</I><BR>
 | |
| <B>::http::code </B><I>token</I><BR>
 | |
| <B>::http::ncode </B><I>token</I><BR>
 | |
| <B>::http::data </B><I>token</I><BR>
 | |
| <B>::http::error </B><I>token</I><BR>
 | |
| <B>::http::cleanup </B><I>token</I><BR>
 | |
| <B>::http::register </B><I>proto port command</I><BR>
 | |
| <B>::http::unregister </B><I>proto</I><BR>
 | |
| <H3><A NAME="M4">DESCRIPTION</A></H3>
 | |
| The <B>http</B> package provides the client side of the HTTP/1.0
 | |
| protocol.  The package implements the GET, POST, and HEAD operations
 | |
| of HTTP/1.0.  It allows configuration of a proxy host to get through
 | |
| firewalls.  The package is compatible with the <B>Safesock</B> security
 | |
| policy, so it can be used by untrusted applets to do URL fetching from
 | |
| a restricted set of hosts. This package can be extened to support
 | |
| additional HTTP transport protocols, such as HTTPS, by providing
 | |
| a custom <B><A HREF="../TkCmd/socket.htm">socket</A></B> command, via <B>http::register</B>.
 | |
| <P>
 | |
| The <B>::http::geturl</B> procedure does a HTTP transaction.
 | |
| Its <I>options </I> determine whether a GET, POST, or HEAD transaction
 | |
| is performed.  
 | |
| The return value of <B>::http::geturl</B> is a token for the transaction.
 | |
| The value is also the name of an array in the ::http namespace
 | |
| that contains state information about the transaction.  The elements
 | |
| of this array are described in the STATE ARRAY section.
 | |
| <P>
 | |
| If the <B>-command</B> option is specified, then
 | |
| the HTTP operation is done in the background.
 | |
| <B>::http::geturl</B> returns immediately after generating the
 | |
| HTTP request and the callback is invoked
 | |
| when the transaction completes.  For this to work, the Tcl event loop
 | |
| must be active.  In Tk applications this is always true.  For pure-Tcl
 | |
| applications, the caller can use <B>::http::wait</B> after calling
 | |
| <B>::http::geturl</B> to start the event loop.
 | |
| <H3><A NAME="M5">COMMANDS</A></H3>
 | |
| <DL>
 | |
| <P><DT><A NAME="M6"><B>::http::config</B> ?<I>options</I>?</A><DD>
 | |
| The <B>::http::config</B> command is used to set and query the name of the
 | |
| proxy server and port, and the User-Agent name used in the HTTP
 | |
| requests.  If no options are specified, then the current configuration
 | |
| is returned.  If a single argument is specified, then it should be one
 | |
| of the flags described below.  In this case the current value of
 | |
| that setting is returned.  Otherwise, the options should be a set of
 | |
| flags and values that define the configuration:
 | |
| <P>
 | |
| <DL>
 | |
| <P><DT><A NAME="M7"><B>-accept</B> <I>mimetypes</I></A><DD>
 | |
| The Accept header of the request.  The default is */*, which means that
 | |
| all types of documents are accepted.  Otherwise you can supply a 
 | |
| comma separated list of mime type patterns that you are
 | |
| willing to receive.  For example, "image/gif, image/jpeg, text/*".
 | |
| <P><DT><A NAME="M8"><B>-proxyhost</B> <I>hostname</I></A><DD>
 | |
| The name of the proxy host, if any.  If this value is the
 | |
| empty string, the URL host is contacted directly.
 | |
| <P><DT><A NAME="M9"><B>-proxyport</B> <I>number</I></A><DD>
 | |
| The proxy port number.
 | |
| <P><DT><A NAME="M10"><B>-proxyfilter</B> <I>command</I></A><DD>
 | |
| The command is a callback that is made during
 | |
| <B>::http::geturl</B>
 | |
| to determine if a proxy is required for a given host.  One argument, a
 | |
| host name, is added to <I>command</I> when it is invoked.  If a proxy
 | |
| is required, the callback should return a two element list containing
 | |
| the proxy server and proxy port.  Otherwise the filter should return
 | |
| an empty list.  The default filter returns the values of the
 | |
| <B>-proxyhost</B> and <B>-proxyport</B> settings if they are
 | |
| non-empty.
 | |
| <P><DT><A NAME="M11"><B>-useragent</B> <I>string</I></A><DD>
 | |
| The value of the User-Agent header in the HTTP request.  The default
 | |
| is <B>"Tcl http client package 2.2."</B>
 | |
| <P></DL>
 | |
| <P><DT><A NAME="M12"><B>::http::geturl</B> <I>url</I> ?<I>options</I>?</A><DD>
 | |
| The <B>::http::geturl</B> command is the main procedure in the package.
 | |
| The <B>-query</B> option causes a POST operation and
 | |
| the <B>-validate</B> option causes a HEAD operation;
 | |
| otherwise, a GET operation is performed.  The <B>::http::geturl</B> command
 | |
| returns a <I>token</I> value that can be used to get
 | |
| information about the transaction.  See the STATE ARRAY and ERRORS section for
 | |
| details.  The <B>::http::geturl</B> command blocks until the operation
 | |
| completes, unless the <B>-command</B> option specifies a callback
 | |
| that is invoked when the HTTP transaction completes.
 | |
| <B>::http::geturl</B> takes several options:
 | |
| <P>
 | |
| <DL>
 | |
| <P><DT><A NAME="M13"><B>-binary</B> <I>boolean</I></A><DD>
 | |
| Specifies whether to force interpreting the url data as binary.  Normally
 | |
| this is auto-detected (anything not beginning with a <B><A HREF="../TclCmd/text.htm">text</A></B> content
 | |
| type or whose content encoding is <B>gzip</B> or <B>compress</B> is
 | |
| considered binary data).
 | |
| <P><DT><A NAME="M14"><B>-blocksize</B> <I>size</I></A><DD>
 | |
| The blocksize used when reading the URL.
 | |
| At most <I>size</I> bytes are read at once.  After each block, a call to the
 | |
| <B>-progress</B> callback is made (if that option is specified).
 | |
| <P><DT><A NAME="M15"><B>-channel</B> <I>name</I></A><DD>
 | |
| Copy the URL contents to channel <I>name</I> instead of saving it in
 | |
| <B>state(body)</B>.
 | |
| <P><DT><A NAME="M16"><B>-command</B> <I>callback</I></A><DD>
 | |
| Invoke <I>callback</I> after the HTTP transaction completes.
 | |
| This option causes <B>::http::geturl</B> to return immediately.
 | |
| The <I>callback</I> gets an additional argument that is the <I>token</I> returned
 | |
| from <B>::http::geturl</B>. This token is the name of an array that is
 | |
| described in the STATE ARRAY section.  Here is a template for the
 | |
| callback:
 | |
| <PRE>proc httpCallback {token} {
 | |
|     upvar #0 $token state
 | |
|     # Access state as a Tcl array
 | |
| }</PRE>
 | |
| <P><DT><A NAME="M17"><B>-handler</B> <I>callback</I></A><DD>
 | |
| Invoke <I>callback</I> whenever HTTP data is available; if present, nothing
 | |
| else will be done with the HTTP data.  This procedure gets two additional
 | |
| arguments: the socket for the HTTP data and the <I>token</I> returned from
 | |
| <B>::http::geturl</B>.  The token is the name of a global array that is described
 | |
| in the STATE ARRAY section.  The procedure is expected to return the number
 | |
| of bytes read from the socket.  Here is a template for the callback:
 | |
| <PRE>proc httpHandlerCallback {socket token} {
 | |
|     upvar #0 $token state
 | |
|     # Access socket, and state as a Tcl array
 | |
|     ...
 | |
|     (example: set data [read $socket 1000];set nbytes [string length $data])
 | |
|     ...
 | |
|     return nbytes
 | |
| }</PRE>
 | |
| <P><DT><A NAME="M18"><B>-headers</B> <I>keyvaluelist</I></A><DD>
 | |
| This option is used to add extra headers to the HTTP request.  The
 | |
| <I>keyvaluelist</I> argument must be a list with an even number of
 | |
| elements that alternate between keys and values.  The keys become
 | |
| header field names.  Newlines are stripped from the values so the
 | |
| header cannot be corrupted.  For example, if <I>keyvaluelist</I> is
 | |
| <B>Pragma no-cache</B> then the following header is included in the
 | |
| HTTP request:
 | |
| <PRE>Pragma: no-cache</PRE>
 | |
| <P><DT><A NAME="M19"><B>-progress</B> <I>callback</I></A><DD>
 | |
| The <I>callback</I> is made after each transfer of data from the URL.
 | |
| The callback gets three additional arguments: the <I>token</I> from
 | |
| <B>::http::geturl</B>, the expected total size of the contents from the
 | |
| <B>Content-Length</B> meta-data, and the current number of bytes
 | |
| transferred so far.  The expected total size may be unknown, in which
 | |
| case zero is passed to the callback.  Here is a template for the
 | |
| progress callback:
 | |
| <PRE>proc httpProgress {token total current} {
 | |
|     upvar #0 $token state
 | |
| }</PRE>
 | |
| <P><DT><A NAME="M20"><B>-query</B> <I>query</I></A><DD>
 | |
| This flag causes <B>::http::geturl</B> to do a POST request that passes the
 | |
| <I>query</I> to the server. The <I>query</I> must be a x-url-encoding
 | |
| formatted query.  The <B>::http::formatQuery</B> procedure can be used to
 | |
| do the formatting.
 | |
| <P><DT><A NAME="M21"><B>-queryblocksize</B> <I>size</I></A><DD>
 | |
| The blocksize used when posting query data to the URL.
 | |
| At most 
 | |
| <I>size</I>
 | |
| bytes are written at once.  After each block, a call to the
 | |
| <B>-queryprogress</B>
 | |
| callback is made (if that option is specified).
 | |
| <P><DT><A NAME="M22"><B>-querychannel</B> <I>channelID</I></A><DD>
 | |
| This flag causes <B>::http::geturl</B> to do a POST request that passes the
 | |
| data contained in <I>channelID</I> to the server. The data contained in <I>channelID</I> must be a x-url-encoding
 | |
| formatted query unless the <B>-type</B> option below is used.
 | |
| If a Content-Length header is not specified via the <B>-headers</B> options,
 | |
| <B>::http::geturl</B> attempts to determine the size of the post data
 | |
| in order to create that header.  If it is
 | |
| unable to determine the size, it returns an error.
 | |
| <P><DT><A NAME="M23"><B>-queryprogress</B> <I>callback</I></A><DD>
 | |
| The <I>callback</I> is made after each transfer of data to the URL
 | |
| (i.e. POST) and acts exactly like the <B>-progress</B> option (the
 | |
| callback format is the same).
 | |
| <P><DT><A NAME="M24"><B>-timeout</B> <I>milliseconds</I></A><DD>
 | |
| If <I>milliseconds</I> is non-zero, then <B>::http::geturl</B> sets up a timeout
 | |
| to occur after the specified number of milliseconds.
 | |
| A timeout results in a call to <B>::http::reset</B> and to
 | |
| the <B>-command</B> callback, if specified.
 | |
| The return value of <B>::http::status</B> is <B>timeout</B>
 | |
| after a timeout has occurred.
 | |
| <P><DT><A NAME="M25"><B>-type</B> <I>mime-type</I></A><DD>
 | |
| Use <I>mime-type</I> as the <B>Content-Type</B> value, instead of the
 | |
| default value (<B>application/x-www-form-urlencoded</B>) during a
 | |
| POST operation.
 | |
| <P><DT><A NAME="M26"><B>-validate</B> <I>boolean</I></A><DD>
 | |
| If <I>boolean</I> is non-zero, then <B>::http::geturl</B> does an HTTP HEAD
 | |
| request.  This request returns meta information about the URL, but the
 | |
| contents are not returned.  The meta information is available in the
 | |
| <B>state(meta) </B> variable after the transaction.  See the STATE
 | |
| ARRAY section for details.
 | |
| <P></DL>
 | |
| <P><DT><A NAME="M27"><B>::http::formatQuery</B> <I>key value</I> ?<I>key value</I> ...?</A><DD>
 | |
| This procedure does x-url-encoding of query data.  It takes an even
 | |
| number of arguments that are the keys and values of the query.  It
 | |
| encodes the keys and values, and generates one string that has the
 | |
| proper & and = separators.  The result is suitable for the
 | |
| <B>-query</B> value passed to <B>::http::geturl</B>.
 | |
| <P><DT><A NAME="M28"><B>::http::reset</B> <I>token</I> ?<I>why</I>?</A><DD>
 | |
| This command resets the HTTP transaction identified by <I>token</I>, if
 | |
| any.  This sets the <B>state(status)</B> value to <I>why</I>, which defaults to <B>reset</B>, and then calls the registered <B>-command</B> callback.
 | |
| <P><DT><A NAME="M29"><B>::http::wait</B> <I>token</I></A><DD>
 | |
| This is a convenience procedure that blocks and waits for the
 | |
| transaction to complete.  This only works in trusted code because it
 | |
| uses <B><A HREF="../TkCmd/vwait.htm">vwait</A></B>.  Also, it's not useful for the case where
 | |
| <B>::http::geturl</B> is called <I>without</I> the <B>-command</B> option
 | |
| because in this case the <B>::http::geturl</B> call doesn't return
 | |
| until the HTTP transaction is complete, and thus there's nothing to
 | |
| wait for.
 | |
| <P><DT><A NAME="M30"><B>::http::data</B> <I>token</I></A><DD>
 | |
| This is a convenience procedure that returns the <B>body</B> element
 | |
| (i.e., the URL data) of the state array.
 | |
| <P><DT><A NAME="M31"><B>::http::error</B> <I>token</I></A><DD>
 | |
| This is a convenience procedure that returns the <B><A HREF="../TkCmd/error.htm">error</A></B> element
 | |
| of the state array.
 | |
| <P><DT><A NAME="M32"><B>::http::status</B> <I>token</I></A><DD>
 | |
| This is a convenience procedure that returns the <B>status</B> element of
 | |
| the state array.
 | |
| <P><DT><A NAME="M33"><B>::http::code</B> <I>token</I></A><DD>
 | |
| This is a convenience procedure that returns the <B>http</B> element of the
 | |
| state array.
 | |
| <P><DT><A NAME="M34"><B>::http::ncode</B> <I>token</I></A><DD>
 | |
| This is a convenience procedure that returns just the numeric return
 | |
| code (200, 404, etc.) from the <B>http</B> element of the state array.
 | |
| <P><DT><A NAME="M35"><B>::http::size</B> <I>token</I></A><DD>
 | |
| This is a convenience procedure that returns the <B>currentsize</B>
 | |
| element of the state array, which represents the number of bytes
 | |
| received from the URL in the <B>::http::geturl</B> call.
 | |
| <P><DT><A NAME="M36"><B>::http::cleanup</B> <I>token</I></A><DD>
 | |
| This procedure cleans up the state associated with the connection
 | |
| identified by <I>token</I>.  After this call, the procedures
 | |
| like <B>::http::data</B> cannot be used to get information
 | |
| about the operation.  It is <I>strongly</I> recommended that you call
 | |
| this function after you're done with a given HTTP request.  Not doing
 | |
| so will result in memory not being freed, and if your app calls
 | |
| <B>::http::geturl</B> enough times, the memory leak could cause a
 | |
| performance hit...or worse.
 | |
| <P><DT><A NAME="M37"><B>::http::register</B> <I>proto port command</I></A><DD>
 | |
| This procedure allows one to provide custom HTTP transport types
 | |
| such as HTTPS, by registering a prefix, the default port, and the
 | |
| command to execute to create the Tcl <B>channel</B>. E.g.:
 | |
| <PRE>package require http
 | |
| package require tls
 | |
| 
 | |
| http::register https 443 ::tls::socket
 | |
| 
 | |
| set token [http::geturl https://my.secure.site/]</PRE>
 | |
| <P><DT><A NAME="M38"><B>::http::unregister</B> <I>proto</I></A><DD>
 | |
| This procedure unregisters a protocol handler that was previously
 | |
| registered via <B>http::register</B>.
 | |
| 
 | |
| <P></DL>
 | |
| <H3><A NAME="M39">ERRORS</A></H3>
 | |
| The <B>http::geturl</B> procedure will raise errors in the following cases:
 | |
| invalid command line options,
 | |
| an invalid URL,
 | |
| a URL on a non-existent host,
 | |
| or a URL at a bad port on an existing host.
 | |
| These errors mean that it
 | |
| cannot even start the network transaction.
 | |
| It will also raise an error if it gets an I/O error while
 | |
| writing out the HTTP request header.
 | |
| For synchronous <B>::http::geturl</B> calls (where <B>-command</B> is
 | |
| not specified), it will raise an error if it gets an I/O error while
 | |
| reading the HTTP reply headers or data.  Because <B>::http::geturl</B>
 | |
| doesn't return a token in these cases, it does all the required
 | |
| cleanup and there's no issue of your app having to call
 | |
| <B>::http::cleanup</B>.
 | |
| <P>
 | |
| For asynchronous <B>::http::geturl</B> calls, all of the above error
 | |
| situations apply, except that if there's any error while 
 | |
| reading the
 | |
| HTTP reply headers or data, no exception is thrown.  This is because
 | |
| after writing the HTTP headers, <B>::http::geturl</B> returns, and the
 | |
| rest of the HTTP transaction occurs in the background.  The command
 | |
| callback can check if any error occurred during the read by calling
 | |
| <B>::http::status</B> to check the status and if it's <I>error</I>,
 | |
| calling <B>::http::error</B> to get the error message.
 | |
| <P>
 | |
| Alternatively, if the main program flow reaches a point where it needs
 | |
| to know the result of the asynchronous HTTP request, it can call
 | |
| <B>::http::wait</B> and then check status and error, just as the
 | |
| callback does.
 | |
| <P>
 | |
| In any case, you must still call
 | |
| <B>http::cleanup</B> to delete the state array when you're done.
 | |
| <P>
 | |
| There are other possible results of the HTTP transaction
 | |
| determined by examining the status from <B>http::status</B>.
 | |
| These are described below.
 | |
| <P>
 | |
| <DL>
 | |
| <P><DT><A NAME="M40">ok</A><DD>
 | |
| If the HTTP transaction completes entirely, then status will be <B>ok</B>.
 | |
| However, you should still check the <B>http::code</B> value to get
 | |
| the HTTP status.  The <B>http::ncode</B> procedure provides just
 | |
| the numeric error (e.g., 200, 404 or 500) while the <B>http::code</B>
 | |
| procedure returns a value like "HTTP 404 File not found".
 | |
| <P><DT><A NAME="M41">eof</A><DD>
 | |
| If the server closes the socket without replying, then no error
 | |
| is raised, but the status of the transaction will be <B><A HREF="../TkCmd/eof.htm">eof</A></B>.
 | |
| <P><DT><A NAME="M42">error</A><DD>
 | |
| The error message will also be stored in the <B><A HREF="../TkCmd/error.htm">error</A></B> status
 | |
| array element, accessible via <B>::http::error</B>.
 | |
| <P></DL>
 | |
| <P>
 | |
| Another error possibility is that <B>http::geturl</B> is unable to
 | |
| write all the post query data to the server before the server
 | |
| responds and closes the socket.
 | |
| The error message is saved in the <B>posterror</B> status array
 | |
| element and then  <B>http::geturl</B> attempts to complete the
 | |
| transaction.
 | |
| If it can read the server's response
 | |
| it will end up with an <B>ok</B> status, otherwise it will have
 | |
| an <B><A HREF="../TkCmd/eof.htm">eof</A></B> status.
 | |
| 
 | |
| <H3><A NAME="M43">STATE ARRAY</A></H3>
 | |
| The <B>::http::geturl</B> procedure returns a <I>token</I> that can be used to
 | |
| get to the state of the HTTP transaction in the form of a Tcl array.
 | |
| Use this construct to create an easy-to-use array variable:
 | |
| <PRE>upvar #0 $token state</PRE>
 | |
| Once the data associated with the url is no longer needed, the state
 | |
| array should be unset to free up storage.
 | |
| The <B>http::cleanup</B> procedure is provided for that purpose.
 | |
| The following elements of
 | |
| the array are supported:
 | |
| <P>
 | |
| <DL>
 | |
| <P><DT><A NAME="M44"><B>body</B></A><DD>
 | |
| The contents of the URL.  This will be empty if the <B>-channel</B>
 | |
| option has been specified.  This value is returned by the <B>::http::data</B> command.
 | |
| <P><DT><A NAME="M45"><B>charset</B></A><DD>
 | |
| The value of the charset attribute from the <B>Content-Type</B> meta-data
 | |
| value.  If none was specified, this defaults to the RFC standard
 | |
| <B>iso8859-1</B>, or the value of <B>$::http::defaultCharset</B>.  Incoming
 | |
| text data will be automatically converted from this charset to utf-8.
 | |
| <P><DT><A NAME="M46"><B>coding</B></A><DD>
 | |
| A copy of the <B>Content-Encoding</B> meta-data value.
 | |
| <P><DT><A NAME="M47"><B>currentsize</B></A><DD>
 | |
| The current number of bytes fetched from the URL.
 | |
| This value is returned by the <B>::http::size</B> command.
 | |
| <P><DT><A NAME="M48"><B>error</B></A><DD>
 | |
| If defined, this is the error string seen when the HTTP transaction
 | |
| was aborted.
 | |
| <P><DT><A NAME="M49"><B>http</B></A><DD>
 | |
| The HTTP status reply from the server.  This value
 | |
| is returned by the <B>::http::code</B> command.  The format of this value is:
 | |
| <PRE><I>HTTP/1.0 code string</I></PRE>
 | |
| The <I>code</I> is a three-digit number defined in the HTTP standard.
 | |
| A code of 200 is OK.  Codes beginning with 4 or 5 indicate errors.
 | |
| Codes beginning with 3 are redirection errors.  In this case the
 | |
| <B>Location</B> meta-data specifies a new URL that contains the
 | |
| requested information.
 | |
| <P><DT><A NAME="M50"><B>meta</B></A><DD>
 | |
| The HTTP protocol returns meta-data that describes the URL contents.
 | |
| The <B>meta</B> element of the state array is a list of the keys and
 | |
| values of the meta-data.  This is in a format useful for initializing
 | |
| an array that just contains the meta-data:
 | |
| <PRE>array set meta $state(meta)</PRE>
 | |
| Some of the meta-data keys are listed below, but the HTTP standard defines
 | |
| more, and servers are free to add their own.
 | |
| <P>
 | |
| <DL>
 | |
| <P><DT><A NAME="M51"><B>Content-Type</B></A><DD>
 | |
| The type of the URL contents.  Examples include <B>text/html</B>,
 | |
| <B>image/gif,</B> <B>application/postscript</B> and
 | |
| <B>application/x-tcl</B>.
 | |
| <P><DT><A NAME="M52"><B>Content-Length</B></A><DD>
 | |
| The advertised size of the contents.  The actual size obtained by
 | |
| <B>::http::geturl</B> is available as <B>state(size)</B>.
 | |
| <P><DT><A NAME="M53"><B>Location</B></A><DD>
 | |
| An alternate URL that contains the requested data.
 | |
| <P></DL>
 | |
| <P><DT><A NAME="M54"><B>posterror</B></A><DD>
 | |
| The error, if any, that occurred while writing
 | |
| the post query data to the server.
 | |
| <P><DT><A NAME="M55"><B>status</B></A><DD>
 | |
| Either <B>ok</B>, for successful completion, <B>reset</B> for
 | |
| user-reset, <B>timeout</B> if a timeout occurred before the transaction
 | |
| could complete, or <B><A HREF="../TkCmd/error.htm">error</A></B> for an error condition.  During the
 | |
| transaction this value is the empty string.
 | |
| <P><DT><A NAME="M56"><B>totalsize</B></A><DD>
 | |
| A copy of the <B>Content-Length</B> meta-data value.
 | |
| <P><DT><A NAME="M57"><B>type</B></A><DD>
 | |
| A copy of the <B>Content-Type</B> meta-data value.
 | |
| <P><DT><A NAME="M58"><B>url</B></A><DD>
 | |
| The requested URL.
 | |
| <P></DL>
 | |
| <H3><A NAME="M59">EXAMPLE</A></H3>
 | |
| <PRE># Copy a URL to a file and print meta-data
 | |
| proc ::http::copy { url file {chunk 4096} } {
 | |
|     set out [open $file w]
 | |
|     set token [geturl $url -channel $out -progress ::http::Progress \
 | |
| 	-blocksize $chunk]
 | |
|     close $out
 | |
|     # This ends the line started by http::Progress
 | |
|     puts stderr ""
 | |
|     upvar #0 $token state
 | |
|     set max 0
 | |
|     foreach {name value} $state(meta) {
 | |
| 	if {[string length $name] > $max} {
 | |
| 	    set max [string length $name]
 | |
| 	}
 | |
| 	if {[regexp -nocase ^location$ $name]} {
 | |
| 	    # Handle URL redirects
 | |
| 	    puts stderr "Location:$value"
 | |
| 	    return [copy [string trim $value] $file $chunk]
 | |
| 	}
 | |
|     }
 | |
|     incr max
 | |
|     foreach {name value} $state(meta) {
 | |
| 	puts [format "%-*s %s" $max $name: $value]
 | |
|     }
 | |
| 
 | |
|     return $token
 | |
| }
 | |
| proc ::http::Progress {args} {
 | |
|     puts -nonewline stderr . ; flush stderr
 | |
| }</PRE>
 | |
| <H3><A NAME="M60">SEE ALSO</A></H3>
 | |
| <B>safe</B>, <B><A HREF="../TkCmd/socket.htm">socket</A></B>, <B>safesock</B>
 | |
| <H3><A NAME="M61">KEYWORDS</A></H3>
 | |
| <A href="../Keywords/S.htm#security policy">security policy</A>, <A href="../Keywords/S.htm#socket">socket</A>
 | |
| <HR><PRE>
 | |
| <A HREF="../copyright.htm">Copyright</A> © 1995-1997 Sun Microsystems, Inc.
 | |
| <A HREF="../copyright.htm">Copyright</A> © 1998-2000 by Ajuba Solutions.
 | |
| <A HREF="../copyright.htm">Copyright</A> © 1995-1997 Roger E. Critchlow Jr.</PRE>
 | |
| </BODY></HTML>
 | 
