http.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:20k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1995-1997 Sun Microsystems, Inc.
  3. '" Copyright (c) 1998-2000 by Ajuba Solutions.
  4. '" Copyright (c) 2004 ActiveState Corporation.
  5. '"
  6. '" See the file "license.terms" for information on usage and redistribution
  7. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  8. '" 
  9. '" RCS: @(#) $Id: http.n,v 1.18.2.3 2004/10/27 12:52:40 dkf Exp $
  10. '" 
  11. .so man.macros
  12. .TH "http" n 2.5 http "Tcl Bundled Packages"
  13. .BS
  14. '" Note:  do not modify the .SH NAME line immediately below!
  15. .SH NAME
  16. http - Client-side implementation of the HTTP/1.0 protocol.
  17. .SH SYNOPSIS
  18. fBpackage require http ?2.5?fR
  19. .sp
  20. fB::http::config fI?options?fR
  21. .sp
  22. fB::http::geturl fIurl ?options?fR
  23. .sp
  24. fB::http::formatQueryfP fIkey valuefP ?fIkey valuefP ...?
  25. .sp
  26. fB::http::resetfP fItokenfP ?fIwhyfP?
  27. .sp
  28. fB::http::wait fItokenfR
  29. .sp
  30. fB::http::status fItokenfR
  31. .sp
  32. fB::http::size fItokenfR
  33. .sp
  34. fB::http::code fItokenfR
  35. .sp
  36. fB::http::ncode fItokenfR
  37. .sp
  38. fB::http::data fItokenfR
  39. .sp
  40. fB::http::error fItokenfR
  41. .sp
  42. fB::http::cleanup fItokenfR
  43. .sp
  44. fB::http::register fIproto port commandfR
  45. .sp
  46. fB::http::unregister fIprotofR
  47. .BE
  48. .SH DESCRIPTION
  49. .PP
  50. The fBhttpfR package provides the client side of the HTTP/1.0
  51. protocol.  The package implements the GET, POST, and HEAD operations
  52. of HTTP/1.0.  It allows configuration of a proxy host to get through
  53. firewalls.  The package is compatible with the fBSafesockfR security
  54. policy, so it can be used by untrusted applets to do URL fetching from
  55. a restricted set of hosts. This package can be extended to support
  56. additional HTTP transport protocols, such as HTTPS, by providing
  57. a custom fBsocketfR command, via fB::http::registerfR.
  58. .PP
  59. The fB::http::geturlfR procedure does a HTTP transaction.
  60. Its fIoptions fR determine whether a GET, POST, or HEAD transaction
  61. is performed.  
  62. The return value of fB::http::geturlfR is a token for the transaction.
  63. The value is also the name of an array in the ::http namespace
  64. that contains state information about the transaction.  The elements
  65. of this array are described in the STATE ARRAY section.
  66. .PP
  67. If the fB-commandfP option is specified, then
  68. the HTTP operation is done in the background.
  69. fB::http::geturlfR returns immediately after generating the
  70. HTTP request and the callback is invoked
  71. when the transaction completes.  For this to work, the Tcl event loop
  72. must be active.  In Tk applications this is always true.  For pure-Tcl
  73. applications, the caller can use fB::http::waitfR after calling
  74. fB::http::geturlfR to start the event loop.
  75. .SH COMMANDS
  76. .TP
  77. fB::http::configfP ?fIoptionsfR?
  78. The fB::http::configfR command is used to set and query the name of the
  79. proxy server and port, and the User-Agent name used in the HTTP
  80. requests.  If no options are specified, then the current configuration
  81. is returned.  If a single argument is specified, then it should be one
  82. of the flags described below.  In this case the current value of
  83. that setting is returned.  Otherwise, the options should be a set of
  84. flags and values that define the configuration:
  85. .RS
  86. .TP
  87. fB-acceptfP fImimetypesfP
  88. The Accept header of the request.  The default is */*, which means that
  89. all types of documents are accepted.  Otherwise you can supply a 
  90. comma-separated list of mime type patterns that you are
  91. willing to receive.  For example, "image/gif, image/jpeg, text/*".
  92. .TP
  93. fB-proxyhostfP fIhostnamefP
  94. The name of the proxy host, if any.  If this value is the
  95. empty string, the URL host is contacted directly.
  96. .TP
  97. fB-proxyportfP fInumberfP
  98. The proxy port number.
  99. .TP
  100. fB-proxyfilterfP fIcommandfP
  101. The command is a callback that is made during
  102. fB::http::geturlfR
  103. to determine if a proxy is required for a given host.  One argument, a
  104. host name, is added to fIcommandfR when it is invoked.  If a proxy
  105. is required, the callback should return a two-element list containing
  106. the proxy server and proxy port.  Otherwise the filter should return
  107. an empty list.  The default filter returns the values of the
  108. fB-proxyhostfR and fB-proxyportfR settings if they are
  109. non-empty.
  110. .TP
  111. fB-urlencodingfP fIencodingfP
  112. The fIencodingfR used for creating the x-url-encoded URLs with
  113. fB::http::formatQueryfR.  The default is fButf-8fR, as specified by RFC
  114. 2718.  Prior to http 2.5 this was unspecified, and that behavior can be
  115. returned by specifying the empty string (fB{}fR), although
  116. fIiso8859-1fR is recommended to restore similar behavior but without the
  117. fB::http::formatQueryfR throwing an error processing non-latin-1
  118. characters.
  119. .TP
  120. fB-useragentfP fIstringfP
  121. The value of the User-Agent header in the HTTP request.  The default
  122. is fB"Tcl http client package 2.4."fR
  123. .RE
  124. .TP
  125. fB::http::geturlfP fIurlfP ?fIoptionsfP? 
  126. The fB::http::geturlfR command is the main procedure in the package.
  127. The fB-queryfR option causes a POST operation and
  128. the fB-validatefR option causes a HEAD operation;
  129. otherwise, a GET operation is performed.  The fB::http::geturlfR command
  130. returns a fItokenfR value that can be used to get
  131. information about the transaction.  See the STATE ARRAY and ERRORS section for
  132. details.  The fB::http::geturlfR command blocks until the operation
  133. completes, unless the fB-commandfR option specifies a callback
  134. that is invoked when the HTTP transaction completes.
  135. fB::http::geturlfR takes several options:
  136. .RS
  137. .TP
  138. fB-binaryfP fIbooleanfP
  139. Specifies whether to force interpreting the URL data as binary.  Normally
  140. this is auto-detected (anything not beginning with a fBtextfR content
  141. type or whose content encoding is fBgzipfR or fBcompressfR is
  142. considered binary data).
  143. .TP
  144. fB-blocksizefP fIsizefP
  145. The block size used when reading the URL.
  146. At most fIsizefR bytes are read at once.  After each block, a call to the
  147. fB-progressfR callback is made (if that option is specified).
  148. .TP
  149. fB-channelfP fInamefP
  150. Copy the URL contents to channel fInamefR instead of saving it in
  151. fBstate(body)fR.
  152. .TP
  153. fB-commandfP fIcallbackfP
  154. Invoke fIcallbackfP after the HTTP transaction completes.
  155. This option causes fB::http::geturlfP to return immediately.
  156. The fIcallbackfP gets an additional argument that is the fItokenfR returned
  157. from fB::http::geturlfR. This token is the name of an array that is
  158. described in the STATE ARRAY section.  Here is a template for the
  159. callback:
  160. .RS
  161. .CS
  162. proc httpCallback {token} {
  163.     upvar #0 $token state
  164.     # Access state as a Tcl array
  165. }
  166. .CE
  167. .RE
  168. .TP
  169. fB-handlerfP fIcallbackfP
  170. Invoke fIcallbackfP whenever HTTP data is available; if present, nothing
  171. else will be done with the HTTP data.  This procedure gets two additional
  172. arguments: the socket for the HTTP data and the fItokenfR returned from
  173. fB::http::geturlfR.  The token is the name of a global array that is described
  174. in the STATE ARRAY section.  The procedure is expected to return the number
  175. of bytes read from the socket.  Here is a template for the callback:
  176. .RS
  177. .CS
  178. proc httpHandlerCallback {socket token} {
  179.     upvar #0 $token state
  180.     # Access socket, and state as a Tcl array
  181.     ...
  182.     (example: set data [read $socket 1000];set nbytes [string length $data])
  183.     ...
  184.     return nbytes
  185. }
  186. .CE
  187. .RE
  188. .TP
  189. fB-headersfP fIkeyvaluelistfP
  190. This option is used to add extra headers to the HTTP request.  The
  191. fIkeyvaluelistfR argument must be a list with an even number of
  192. elements that alternate between keys and values.  The keys become
  193. header field names.  Newlines are stripped from the values so the
  194. header cannot be corrupted.  For example, if fIkeyvaluelistfR is
  195. fBPragma no-cachefR then the following header is included in the
  196. HTTP request:
  197. .CS
  198. Pragma: no-cache
  199. .CE
  200. .TP
  201. fB-progressfP fIcallbackfP
  202. The fIcallbackfR is made after each transfer of data from the URL.
  203. The callback gets three additional arguments: the fItokenfR from
  204. fB::http::geturlfR, the expected total size of the contents from the
  205. fBContent-LengthfR meta-data, and the current number of bytes
  206. transferred so far.  The expected total size may be unknown, in which
  207. case zero is passed to the callback.  Here is a template for the
  208. progress callback:
  209. .RS
  210. .CS
  211. proc httpProgress {token total current} {
  212.     upvar #0 $token state
  213. }
  214. .CE
  215. .RE
  216. .TP
  217. fB-queryfP fIqueryfP
  218. This flag causes fB::http::geturlfR to do a POST request that passes the
  219. fIqueryfR to the server. The fIqueryfR must be an x-url-encoding
  220. formatted query.  The fB::http::formatQueryfR procedure can be used to
  221. do the formatting.
  222. .TP
  223. fB-queryblocksizefP fIsizefP
  224. The block size used when posting query data to the URL.
  225. At most 
  226. fIsizefR
  227. bytes are written at once.  After each block, a call to the
  228. fB-queryprogressfR
  229. callback is made (if that option is specified).
  230. .TP
  231. fB-querychannelfP fIchannelIDfP
  232. This flag causes fB::http::geturlfR to do a POST request that passes the
  233. data contained in fIchannelIDfR to the server. The data contained in
  234. fIchannelIDfR must be an x-url-encoding
  235. formatted query unless the fB-typefP option below is used.
  236. If a Content-Length header is not specified via the fB-headersfR options,
  237. fB::http::geturlfR attempts to determine the size of the post data
  238. in order to create that header.  If it is
  239. unable to determine the size, it returns an error.
  240. .TP
  241. fB-queryprogressfP fIcallbackfP
  242. The fIcallbackfR is made after each transfer of data to the URL
  243. (i.e. POST) and acts exactly like the fB-progressfR option (the
  244. callback format is the same).
  245. .TP
  246. fB-timeoutfP fImillisecondsfP
  247. If fImillisecondsfR is non-zero, then fB::http::geturlfR sets up a timeout
  248. to occur after the specified number of milliseconds.
  249. A timeout results in a call to fB::http::resetfP and to
  250. the fB-commandfP callback, if specified.
  251. The return value of fB::http::statusfP is fBtimeoutfP
  252. after a timeout has occurred.
  253. .TP
  254. fB-typefP fImime-typefP
  255. Use fImime-typefR as the fBContent-TypefR value, instead of the
  256. default value (fBapplication/x-www-form-urlencodedfR) during a
  257. POST operation.
  258. .TP
  259. fB-validatefP fIbooleanfP
  260. If fIbooleanfR is non-zero, then fB::http::geturlfR does an HTTP HEAD
  261. request.  This request returns meta information about the URL, but the
  262. contents are not returned.  The meta information is available in the
  263. fBstate(meta) fR variable after the transaction.  See the STATE
  264. ARRAY section for details.
  265. .RE
  266. .TP
  267. fB::http::formatQueryfP fIkey valuefP ?fIkey valuefP ...?
  268. This procedure does x-url-encoding of query data.  It takes an even
  269. number of arguments that are the keys and values of the query.  It
  270. encodes the keys and values, and generates one string that has the
  271. proper & and = separators.  The result is suitable for the
  272. fB-queryfR value passed to fB::http::geturlfR.
  273. .TP
  274. fB::http::resetfP fItokenfP ?fIwhyfP?
  275. This command resets the HTTP transaction identified by fItokenfR, if
  276. any.  This sets the fBstate(status)fP value to fIwhyfP, which defaults to fBresetfR, and then calls the registered fB-commandfR callback.
  277. .TP
  278. fB::http::waitfP fItokenfP
  279. This is a convenience procedure that blocks and waits for the
  280. transaction to complete.  This only works in trusted code because it
  281. uses fBvwaitfR.  Also, it's not useful for the case where
  282. fB::http::geturlfP is called fIwithoutfP the fB-commandfP option
  283. because in this case the fB::http::geturlfP call doesn't return
  284. until the HTTP transaction is complete, and thus there's nothing to
  285. wait for.
  286. .TP
  287. fB::http::datafP fItokenfP
  288. This is a convenience procedure that returns the fBbodyfP element
  289. (i.e., the URL data) of the state array.
  290. .TP
  291. fB::http::errorfP fItokenfP
  292. This is a convenience procedure that returns the fBerrorfP element
  293. of the state array.
  294. .TP
  295. fB::http::statusfP fItokenfP
  296. This is a convenience procedure that returns the fBstatusfP element of
  297. the state array.
  298. .TP
  299. fB::http::codefP fItokenfP
  300. This is a convenience procedure that returns the fBhttpfP element of the
  301. state array.
  302. .TP
  303. fB::http::ncodefP fItokenfP
  304. This is a convenience procedure that returns just the numeric return
  305. code (200, 404, etc.) from the fBhttpfP element of the state array.
  306. .TP
  307. fB::http::sizefP fItokenfP
  308. This is a convenience procedure that returns the fBcurrentsizefP
  309. element of the state array, which represents the number of bytes
  310. received from the URL in the fB::http::geturlfP call.
  311. .TP
  312. fB::http::cleanupfP fItokenfP
  313. This procedure cleans up the state associated with the connection
  314. identified by fItokenfP.  After this call, the procedures
  315. like fB::http::datafP cannot be used to get information
  316. about the operation.  It is fIstronglyfP recommended that you call
  317. this function after you're done with a given HTTP request.  Not doing
  318. so will result in memory not being freed, and if your app calls
  319. fB::http::geturlfP enough times, the memory leak could cause a
  320. performance hit...or worse.
  321. .TP
  322. fB::http::registerfP fIproto port commandfP
  323. This procedure allows one to provide custom HTTP transport types
  324. such as HTTPS, by registering a prefix, the default port, and the
  325. command to execute to create the Tcl fBchannelfR. E.g.:
  326. .RS
  327. .CS
  328. package require http
  329. package require tls
  330. ::http::register https 443 ::tls::socket
  331. set token [::http::geturl https://my.secure.site/]
  332. .CE
  333. .RE
  334. .TP
  335. fB::http::unregisterfP fIprotofP
  336. This procedure unregisters a protocol handler that was previously
  337. registered via fB::http::registerfR.
  338. .SH "ERRORS"
  339. The fB::http::geturlfP procedure will raise errors in the following cases:
  340. invalid command line options,
  341. an invalid URL,
  342. a URL on a non-existent host,
  343. or a URL at a bad port on an existing host.
  344. These errors mean that it
  345. cannot even start the network transaction.
  346. It will also raise an error if it gets an I/O error while
  347. writing out the HTTP request header.
  348. For synchronous fB::http::geturlfP calls (where fB-commandfP is
  349. not specified), it will raise an error if it gets an I/O error while
  350. reading the HTTP reply headers or data.  Because fB::http::geturlfP
  351. doesn't return a token in these cases, it does all the required
  352. cleanup and there's no issue of your app having to call
  353. fB::http::cleanupfP.
  354. .PP
  355. For asynchronous fB::http::geturlfP calls, all of the above error
  356. situations apply, except that if there's any error while 
  357. reading the
  358. HTTP reply headers or data, no exception is thrown.  This is because
  359. after writing the HTTP headers, fB::http::geturlfP returns, and the
  360. rest of the HTTP transaction occurs in the background.  The command
  361. callback can check if any error occurred during the read by calling
  362. fB::http::statusfP to check the status and if its fIerrorfP,
  363. calling fB::http::errorfP to get the error message.
  364. .PP
  365. Alternatively, if the main program flow reaches a point where it needs
  366. to know the result of the asynchronous HTTP request, it can call
  367. fB::http::waitfP and then check status and error, just as the
  368. callback does.
  369. .PP
  370. In any case, you must still call
  371. fB::http::cleanupfP to delete the state array when you're done.
  372. .PP
  373. There are other possible results of the HTTP transaction
  374. determined by examining the status from fB::http::statusfP.
  375. These are described below.
  376. .TP
  377. ok
  378. If the HTTP transaction completes entirely, then status will be fBokfP.
  379. However, you should still check the fB::http::codefP value to get
  380. the HTTP status.  The fB::http::ncodefP procedure provides just
  381. the numeric error (e.g., 200, 404 or 500) while the fB::http::codefP
  382. procedure returns a value like "HTTP 404 File not found".
  383. .TP
  384. eof
  385. If the server closes the socket without replying, then no error
  386. is raised, but the status of the transaction will be fBeoffP.
  387. .TP
  388. error
  389. The error message will also be stored in the fBerrorfP status
  390. array element, accessible via fB::http::errorfP.
  391. .PP
  392. Another error possibility is that fB::http::geturlfP is unable to
  393. write all the post query data to the server before the server
  394. responds and closes the socket.
  395. The error message is saved in the fBposterrorfP status array
  396. element and then  fB::http::geturlfP attempts to complete the
  397. transaction.
  398. If it can read the server's response
  399. it will end up with an fBokfP status, otherwise it will have
  400. an fBeoffP status.
  401. .SH "STATE ARRAY"
  402. The fB::http::geturlfR procedure returns a fItokenfR that can be used to
  403. get to the state of the HTTP transaction in the form of a Tcl array.
  404. Use this construct to create an easy-to-use array variable:
  405. .CS
  406. upvar #0 $token state
  407. .CE
  408. Once the data associated with the URL is no longer needed, the state
  409. array should be unset to free up storage.
  410. The fB::http::cleanupfP procedure is provided for that purpose.
  411. The following elements of
  412. the array are supported:
  413. .RS
  414. .TP
  415. fBbodyfR
  416. The contents of the URL.  This will be empty if the fB-channelfR
  417. option has been specified.  This value is returned by the fB::http::datafP command.
  418. .TP
  419. fBcharsetfR
  420. The value of the charset attribute from the fBContent-TypefR meta-data
  421. value.  If none was specified, this defaults to the RFC standard
  422. fBiso8859-1fR, or the value of fB$::http::defaultCharsetfR.  Incoming
  423. text data will be automatically converted from this charset to utf-8.
  424. .TP
  425. fBcodingfR
  426. A copy of the fBContent-EncodingfR meta-data value.
  427. .TP
  428. fBcurrentsizefR
  429. The current number of bytes fetched from the URL.
  430. This value is returned by the fB::http::sizefP command.
  431. .TP
  432. fBerrorfR
  433. If defined, this is the error string seen when the HTTP transaction
  434. was aborted.
  435. .TP
  436. fBhttpfR
  437. The HTTP status reply from the server.  This value
  438. is returned by the fB::http::codefP command.  The format of this value is:
  439. .RS
  440. .CS
  441. fIHTTP/1.0 code stringfP
  442. .CE
  443. The fIcodefR is a three-digit number defined in the HTTP standard.
  444. A code of 200 is OK.  Codes beginning with 4 or 5 indicate errors.
  445. Codes beginning with 3 are redirection errors.  In this case the
  446. fBLocationfR meta-data specifies a new URL that contains the
  447. requested information.
  448. .RE
  449. .TP
  450. fBmetafR
  451. The HTTP protocol returns meta-data that describes the URL contents.
  452. The fBmetafR element of the state array is a list of the keys and
  453. values of the meta-data.  This is in a format useful for initializing
  454. an array that just contains the meta-data:
  455. .RS
  456. .CS
  457. array set meta $state(meta)
  458. .CE
  459. Some of the meta-data keys are listed below, but the HTTP standard defines
  460. more, and servers are free to add their own.
  461. .TP
  462. fBContent-TypefR
  463. The type of the URL contents.  Examples include fBtext/htmlfR,
  464. fBimage/gif,fR fBapplication/postscriptfR and
  465. fBapplication/x-tclfR.
  466. .TP
  467. fBContent-LengthfR
  468. The advertised size of the contents.  The actual size obtained by
  469. fB::http::geturlfR is available as fBstate(size)fR.
  470. .TP
  471. fBLocationfR
  472. An alternate URL that contains the requested data.
  473. .RE
  474. .TP
  475. fBposterrorfR
  476. The error, if any, that occurred while writing
  477. the post query data to the server.
  478. .TP
  479. fBstatusfR
  480. Either fBokfR, for successful completion, fBresetfR for
  481. user-reset, fBtimeoutfP if a timeout occurred before the transaction
  482. could complete, or fBerrorfR for an error condition.  During the
  483. transaction this value is the empty string.
  484. .TP
  485. fBtotalsizefR
  486. A copy of the fBContent-LengthfR meta-data value.
  487. .TP
  488. fBtypefR
  489. A copy of the fBContent-TypefR meta-data value.
  490. .TP
  491. fBurlfR
  492. The requested URL.
  493. .RE
  494. .SH EXAMPLE
  495. .CS
  496. # Copy a URL to a file and print meta-data
  497. proc httpcopy { url file {chunk 4096} } {
  498.    set out [open $file w]
  499.    set token [fB::http::geturlfR $url -channel $out \
  500.           -progress httpCopyProgress -blocksize $chunk]
  501.    close $out
  502.    # This ends the line started by httpCopyProgress
  503.    puts stderr ""
  504.    upvar #0 $token state
  505.    set max 0
  506.    foreach {name value} $state(meta) {
  507.       if {[string length $name] > $max} {
  508.          set max [string length $name]
  509.       }
  510.       if {[regexp -nocase ^location$ $name]} {
  511.          # Handle URL redirects
  512.          puts stderr "Location:$value"
  513.          return [httpcopy [string trim $value] $file $chunk]
  514.       }
  515.    }
  516.    incr max
  517.    foreach {name value} $state(meta) {
  518.       puts [format "%-*s %s" $max $name: $value]
  519.    }
  520.    return $token
  521. }
  522. proc httpCopyProgress {args} {
  523.    puts -nonewline stderr .
  524.    flush stderr
  525. }
  526. .CE
  527. .SH "SEE ALSO"
  528. safe(n), socket(n), safesock(n)
  529. .SH KEYWORDS
  530. security policy, socket