<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Http</title> </head> <body> <h1>Http</h1> <p>ëÌÉÅÎÔÓËÁÑ ÞÁÓÔØ ÒÅÁÌÉÚÁÃÉÉ ÐÒÏÔÏËÏÌÁ HTTP/1.0.</p> <h2><a name="óéîôáëóéó"></a>óéîôáëóéó</h2> <pre> <strong>package</strong> <strong>require</strong> <em>http</em> ?<em>2.0</em>? <a href="#http::config"><strong>::http::config</strong></a> ?<em>options</em>? <a href="#http::geturl_url"><strong>::http::geturl</strong> <strong>url</strong></a> ?<em>options</em>? <a href="#http::formatQuery"><strong>::http::formatQuery</strong></a> <em>list</em> <a href="#http::reset"><strong>::http::reset</strong></a> <em>token</em> ?<em>why</em>? <a href="#http::wait"><strong>::http::wait</strong></a> <em>token</em> <a href="#http::status"><strong>::http::status</strong></a> <em>token</em> <a href="#http::size"><strong>::http::size</strong></a> <em>token</em> <a href="#http::code"><strong>::http::code</strong></a> <em>token</em> <a href="#http::data"><strong>::http::data</strong></a> <em>token</em> </pre> <h2><a name="ïðéóáîéå"></a>ïðéóáîéå</h2> <p>ðÁËÅÔ <strong>http</strong> ÏÂÅÓÐÅÞÉ×ÁÅÔ ËÌÉÅÎÔÓËÕÀ ÞÁÓÔØ ÐÒÏÔÏËÏÌÁ HTTP/1.0 É ÒÅÁÌÉÚÕÅÔ ÏÐÅÒÁÃÉÉ GET, POST É HEAD. ïÎ ÐÏÚ×ÏÌÑÅÔ ËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ ÓÅÒ×ÅÒ-ÐÒÅÄÓÔÁ×ÉÔÅÌØ (proxy) ÄÌÑ ×ÙÈÏÄÁ ÞÅÒÅÚ ÍÅÖÓÅÔÅ×ÙÅ ÜËÒÁÎÙ. ðÁËÅÔ ÓÏ×ÍÅÓÔÉÍ Ó ÐÏÌÉÔÉËÏÊ ÂÅÚÏÐÁÓÎÏÓÔÉ Safesock.</p> <p>ðÒÏÃÅÄÕÒÁ <a href="#http::geturl_url"><strong>::http::geturl</strong></a> ×ÙÐÏÌÎÑÅÔ HTTP ÔÒÁÎÚÁËÃÉÀ. ÷ ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÚÁÄÁÎÎÏÊ ÏÐÃÉÉ ÜÔÏ ÍÏÖÅÔ ÂÙÔØ GET, POST ÉÌÉ HEAD ÔÒÁÎÚÁËÃÉÑ. ÷ÅÌÉÞÉÎÁ, ×ÏÚ×ÒÁÝÁÅÍÁÑ ÐÒÏÃÅÄÕÒÏÊ <a href="#http::geturl_url"> <strong>::http::geturl</strong></a>, Ñ×ÌÑÅÔÓÑ ÐÒÉÚÎÁËÏÍ (token) ×ÙÐÏÌÎÅÎÉÑ ÔÒÁÎÚÁËÃÉÉ. ëÒÏÍÅ ÔÏÇÏ, ÅÅ ÚÎÁÞÅÎÉÅ ÓÏ×ÐÁÄÁÅÔ Ó ÉÍÅÎÅÍ ÍÁÓÓÉ×Á × ÐÒÏÓÔÒÁÎÓÔ×Å ÉÍÅÎ <strong>::http</strong>, ËÏÔÏÒÙÊ ÓÏÄÅÒÖÉÔ ÉÎÆÏÒÍÁÃÉÀ Ï ×ÙÐÏÌÎÅÎÉÉ ÔÒÁÎÚÁËÃÉÉ. üÌÅÍÅÎÔÙ ÍÁÓÓÉ×Á ÏÐÉÓÁÎÙ ÎÉÖÅ, ÓÍ. "<a href="#íáóóé÷_óïóôïñîéñ_ôòáîúáëãéé">íÁÓÓÉ× ÓÏÓÔÏÑÎÉÑ ÔÒÁÎÚÁËÃÉÉ</a>".</p> <p>åÓÌÉ ÐÒÏÃÅÄÕÒÁ ×ÙÚ×ÁÎÁ Ó ÏÐÃÉÅÊ <strong>-command</strong>, ÏÐÅÒÁÃÉÑ ×ÙÐÏÌÎÑÅÔÓÑ × ÆÏÎÏ×ÏÍ ÒÅÖÉÍÅ. ðÒÏÃÅÄÕÒÁ <a href= "#http::geturl_url"><strong>::http::geturl</strong></a> ÚÁ×ÅÒÛÁÅÔÓÑ ÓÒÁÚÕ ÐÏÓÌÅ ÆÏÒÍÉÒÏ×ÁÎÉÑ HTTP ÚÁÐÒÏÓÁ, Á ÒÅÚÕÌØÔÁÔÙ ÚÁÐÒÏÓÁ ÏÂÒÁÂÁÔÙ×ÁÀÔÓÑ ÐÏÓÌÅ ÉÈ ÐÏÌÕÞÅÎÉÑ. äÌÑ ÕÓÐÅÛÎÏÊ ÒÁÂÏÔÙ × ÔÁËÏÍ ÒÅÖÉÍÅ ÎÅÏÂÈÏÄÉÍÏ, ÞÔÏÂÙ ÂÙÌ ÚÁÐÕÝÅÎ ÏÂÒÁÂÏÔÞÉË ÓÏÂÙÔÉÊ. üÔÏ ×ÓÅÇÄÁ ÔÁË ÄÌÑ Tk-ÐÒÉÌÏÖÅÎÉÊ. ÷ ÞÉÓÔÏ Tcl - ÐÒÉÌÏÖÅÎÉÑÈ ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÒÏÃÅÄÕÒÕ <a href="#http::wait"><strong>::http::wait</strong></a> ÄÌÑ ÚÁÐÕÓËÁ ÏÂÒÁÂÏÔÞÉËÁ ÓÏÂÙÔÉÊ.</p> <h2><a name="ëïíáîäù"></a>ëïíáîäù</h2> <dl> <dt><a name="http::config"></a><strong>::http::config</strong> ?<em>options?</em></dt> <dd><p>ëÏÍÁÎÄÁ <strong>::http::config</strong> ÉÓÐÏÌØÚÕÅÔÓÑ, ÞÔÏÂÙ ÕÓÔÁÎÏ×ÉÔØ ÉÌÉ ÚÁÐÒÏÓÉÔØ ÉÍÑ proxy-ÓÅÒ×ÅÒÁ, ÐÏÒÔÁ É ÐÏÌØÚÏ×ÁÔÅÌØÓËÏÇÏ ÐÒÉÌÏÖÅÎÉÑ (User-Agent), ÉÓÐÏÌØÚÕÅÍÙÅ × HTTP ÚÁÐÒÏÓÁÈ. åÓÌÉ ÎÉËÁËÉÅ ÏÐÃÉÉ ÎÅ ÚÁÄÁÎÙ, ×ÏÚ×ÒÁÝÁÅÔÓÑ ÔÅËÕÝÁÑ ËÏÎÆÉÇÕÒÁÃÉÑ. åÓÌÉ ÚÁÄÁÎ ÅÄÉÎÓÔ×ÅÎÎÙÊ ÁÒÇÕÍÅÎÔ, ÔÏÇÄÁ, ÏÎ ÄÏÌÖÅÎ ÂÙÔØ ÉÍÅÎÅÍ ÏÄÎÏÊ ÉÚ ÏÐÃÉÊ, ÏÐÉÓÁÎÎÙÈ ÎÉÖÅ. ÷ ÜÔÏÍ ÓÌÕÞÁÅ ×ÏÚ×ÒÁÝÁÅÔÓÑ ÔÅËÕÝÁÑ ×ÅÌÉÞÉÎÁ ÕËÁÚÁÎÎÏÊ ÏÐÃÉÉ. ÷ ÐÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ ÁÒÇÕÍÅÎÔÙ ÓÏÓÔÏÑÔ ÉÚ ÐÁÒ: ÉÍÑ ÏÐÃÉÉ - ÐÒÉÓ×ÁÉ×ÁÅÍÏÅ ÚÎÁÞÅÎÉÅ.</p> <dl> <dt><strong>-accept</strong> <em>mimetypes</em></dt> <dd>ïÐÒÅÄÅÌÑÅÔ ÔÉÐÙ ÄÏËÕÍÅÎÔÏ×, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÂÙÔØ ÐÒÉÎÑÔÙ ÐÏ ÚÁÐÒÏÓÕ. úÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ "*/*" ÏÚÎÁÞÁÅÔ, ÞÔÏ ÍÏÇÕÔ ÂÙÔØ ÐÒÉÎÑÔÙ ÄÏËÕÍÅÎÔÙ ÌÀÂÏÇÏ ÔÉÐÁ. þÔÏÂÙ ÏÇÒÁÎÉÞÉÔØ ÓÐÉÓÏË ÄÏÐÕÓÔÉÍÙÈ ÄÏËÕÍÅÎÔÏ×, ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÓÐÉÓÏË (ÞÅÒÅÚ ÚÁÐÑÔÕÀ) ÛÁÂÌÏÎÏ× ÄÏËÕÍÅÎÔÏ× ÓÌÅÄÕÀÝÅÇÏ ×ÉÄÁ: "image/gif, image/jpeg, text/*".</dd> <dt><strong>-proxyhost</strong> <em>hostname</em></dt> <dd>éÍÑ proxy-ÓÅÒ×ÅÒÁ, ÞÅÒÅÚ ËÏÔÏÒÙÊ ÏÓÕÝÅÓÔ×ÌÑÅÔÓÑ Ó×ÑÚØ. åÓÌÉ ÎÅ ÕËÁÚÁÎÏ, Ó×ÑÚØ ÏÓÕÝÅÓÔ×ÌÑÅÔÓÑ ÎÁÐÒÑÍÕÀ.</dd> <dt><strong>-proxyport</strong> <em>number</em></dt> <dd>éÍÑ proxy-ÐÏÒÔÁ.</dd> <dt><strong>-proxyfilter</strong> <em>command</em></dt> <dd>ïÐÒÅÄÅÌÑÅÔ ËÏÍÁÎÄÕ, ËÏÔÏÒÁÑ ×ÏÚ×ÒÁÝÁÅÔ ÉÍÅÎÁ proxy-ÓÅÒ×ÅÒÁ É proxy-ÐÏÒÔÁ, ÎÅÏÂÈÏÄÉÍÙÅ ÄÌÑ ÄÁÎÎÏÊ Ó×ÑÚÉ. ÷ ÐÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ ×ÏÚ×ÒÁÝÁÅÔ ÐÕÓÔÏÅ ÚÎÁÞÅÎÉÅ. ÷ ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ ÐÒÉ ×ÙÚÏ×Å ËÏÍÁÎÄÙ ÉÓÐÏÌØÚÕÅÔÓÑ ÉÍÑ ÓÅÒ×ÅÒÁ (host). åÓÌÉ ËÏÍÁÎÄÁ ÎÅ ÚÁÄÁÎÁ, ÉÓÐÏÌØÚÕÀÔÓÑ ÚÎÁÞÅÎÉÑ ÏÐÃÉÊ <strong>-proxyhost</strong> É <strong>-proxyport</strong>.</dd> <dt><strong>-useragent</strong> <em>string</em></dt> <dd>ïÐÒÅÄÅÌÑÅÔ ÉÍÑ ÐÏÌØÚÏ×ÁÔÅÌØÓËÏÇÏ ÐÒÉÌÏÖÅÎÉÑ (User-Agent). úÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ "Tcl http client package 2.0."</dd> </dl> </dd> <dt><a name="http::geturl_url"></a><strong>::http::geturl url</strong> ?<em>options</em>?</dt> <dd><p>ëÏÍÁÎÄÁ <strong>::http::geturl</strong> - ÏÓÎÏ×ÎÁÑ ËÏÍÁÎÄÁ ÐÁËÅÔÁ. åÓÌÉ ÚÁÄÁÎÁ ÏÐÃÉÑ <strong>-query</strong>, ×ÙÐÏÌÎÑÅÔÓÑ ÏÐÅÒÁÃÉÑ POST, ÅÓÌÉ ÚÁÄÁÎÁ ÏÐÃÉÑ <strong>-validate</strong>, ×ÙÐÏÌÎÑÅÔÓÑ ÏÐÅÒÁÃÉÑ HEAD. ÷ ÐÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ ×ÙÐÏÌÎÑÅÔÓÑ ÏÐÅÒÁÃÉÑ GET. ëÏÍÁÎÄÁ ×ÏÚ×ÒÁÝÁÅÔ ÐÒÉÚÎÁË - ÉÍÑ ÍÁÓÓÉ×Á, ËÏÔÏÒÙÊ ÍÏÖÅÔ ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁÎ ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÄÏÐÏÌÎÉÔÅÌØÎÏÊ ÉÎÆÏÒÍÁÃÉÉ Ï ÓÏÓÔÏÑÎÉÉ ÔÒÁÎÚÁËÃÉÉ. ðÏÄÒÏÂÎÏÓÔÉ ÓÍ. <a href="#íáóóé÷_óïóôïñîéñ_ôòáîúáëãéé">"íÁÓÓÉ× ÓÏÓÔÏÑÎÉÑ ÔÒÁÎÚÁËÃÉÉ"</a>. ëÏÍÁÎÄÁ ÚÁ×ÅÒÛÁÅÔÓÑ ÐÏÓÌÅ ÚÁ×ÅÒÛÅÎÉÑ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÊ ÏÐÅÒÁÃÉÉ, ÅÓÌÉ ÏÎÁ ×ÙÚ×ÁÎÁ ÂÅÚ ÏÐÃÉÉ <strong>-command</strong>. ÷ ÐÒÏÔÉ×ÎÏÍ ÓÌÕÞÁÅ ËÏÍÁÎÄÁ <strong>::http::geturl</strong> ÚÁ×ÅÒÛÁÅÔÓÑ ÎÅÍÅÄÌÅÎÎÏ, Á ÐÏ ÚÁ×ÅÒÛÅÎÉÉ ÏÐÅÒÁÃÉÉ ×ÙÚÙ×ÁÅÔÓÑ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÁÑ ËÏÍÁÎÄÁ ÄÌÑ ÏÂÒÁÂÏÔËÉ ÅÅ ÒÅÚÕÌØÔÁÔÏ×. ëÏÍÁÎÄÁ <strong>::http::geturl</strong> ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó ÒÁÚÌÉÞÎÙÍÉ ÏÐÃÉÑÍÉ:</p> <dl> <dt><strong>-blocksize</strong> <em>size</em></dt> <dd>éÓÐÏÌØÚÕÅÔÓÑ ÐÒÉ ÞÔÅÎÉÉ ÉÎÆÏÒÍÁÃÉÉ. ïÐÒÅÄÅÌÑÅÔ ÍÁËÓÉÍÁÌØÎÙÊ ÒÁÚÍÅÒ ÂÌÏËÁ (× ÂÁÊÔÁÈ), ËÏÔÏÒÙÊ ÍÏÖÅÔ ÂÙÔØ ÐÒÏÞÉÔÁÎ ÚÁ ÏÄÉÎ ÒÁÚ. ðÏÓÌÅ ËÁÖÄÏÇÏ ÞÔÅÎÉÑ ÂÌÏËÁ ×ÙÚÙ×ÁÅÔÓÑ ËÏÍÁÎÄÁ, ÏÐÒÅÄÅÌÅÎÎÁÑ Ó ÐÏÍÏÝØÀ ÏÐÃÉÉ <strong>-progress</strong>. </dd> <dt><strong>-channel</strong> <em>name</em></dt> <dd>ðÅÒÅÎÁÐÒÁ×ÌÑÅÔ ÐÏÌÕÞÅÎÎÕÀ ÉÎÆÏÒÍÁÃÉÑ × ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÊ ËÁÎÁÌ ×ÍÅÓÔÏ ÔÏÇÏ, ÞÔÏÂÙ ÓÏÈÒÁÎÑÔØ ÅÅ × ÐÅÒÅÍÅÎÎÏÊ <em>state(body)</em>. </dd> <dt><strong>-command</strong> <em>callback</em></dt> <dd><p>ïÂÅÓÐÅÞÉ×ÁÅÔ ×ÙÚÏ× ËÏÍÁÎÄÙ <em>callback</em> ÐÏÓÌÅ ÚÁ×ÅÒÛÅÎÉÑ ÔÒÁÎÚÁËÃÉÉ. ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÜÔÏÊ ÏÐÃÉÉ ËÏÍÁÎÄÁ <strong>::http::geturl</strong> ÚÁ×ÅÒÛÁÅÔÓÑ ÓÒÁÚÕ. ëÏÍÁÎÄÁ <em>callback</em> ×ÙÚÙ×ÁÅÔÓÑ Ó ÁÒÇÕÍÅÎÔÏÍ <em>token</em>, ËÏÔÏÒÙÊ ÓÏÄÅÒÖÉÔ ÉÍÑ ÍÁÓÓÉ×Á, ÏÐÉÓÁÎÎÏÇÏ ÎÉÖÅ, ÓÍ. <a href="#íáóóé÷_óïóôïñîéñ_ôòáîúáëãéé">"íÁÓÓÉ× ÓÏÓÔÏÑÎÉÑ ÔÒÁÎÚÁËÃÉÉ"</a>. îÉÖÅ ÐÒÉ×ÅÄÅÎ ÛÁÂÌÏÎ ÔÉÐÏ×ÏÊ ÐÒÏÃÅÄÕÒÙ ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ × ÄÁÎÎÏÊ ÏÐÃÉÉ:</p> <pre> proc httpCallback {token} { upvar #0 $token state # äÁÌÅÅ ×ÏÚÍÏÖÎÁ ÒÁÂÏÔÁ ÓÏ state ËÁË Ó ÏÂÙÞÎÙÍ Tcl-ÍÁÓÓÉ×ÏÍ } </pre> </dd> <dt><strong>-handler</strong> <em>callback</em></dt> <dd><p>ïÐÃÉÑ ÏÂÅÓÐÅÞÉ×ÁÅÔ ×ÙÚÏ× ËÏÍÁÎÄÙ <em>callback</em> ËÁË ÔÏÌØËÏ HTTP ÄÁÎÎÙÅ ÐÏÌÕÞÅÎÙ. ëÏÍÁÎÄÁ ÐÏÌÕÞÁÅÔ Ä×Á ÄÏÐÏÌÎÉÔÅÌØÎÙÈ ÁÒÇÕÍÅÎÔÁ: HTTP <em>socket</em> É ÉÍÑ ÍÁÓÓÉ×Á <em>token</em>, ×ÏÚ×ÒÁÝÅÎÎÏÅ ËÏÍÁÎÄÏÊ <strong>::http::geturl</strong> (ÓÍ. <a href= "#íáóóé÷_óïóôïñîéñ_ôòáîúáëãéé">"íÁÓÓÉ× ÓÏÓÔÏÑÎÉÑ ÔÒÁÎÚÁËÃÉÉ"</a>). ëÏÍÁÎÄÁ ÄÏÌÖÎÁ ×ÏÚ×ÒÁÝÁÔØ ÞÉÓÌÏ ÂÁÊÔÏ×, ÐÒÏÞÉÔÁÎÎÙÈ ÉÚ <em>socket</em>. îÉÖÅ ÐÒÉ×ÅÄÅÎ ÛÁÂÌÏÎ ÐÏÄÏÂÎÏÊ ÐÒÏÃÅÄÕÒÙ:</p> <pre> proc httpHandlerCallback {socket token} { upvar #0 $token state # ðÏÌÕÞÅÎ ÄÏÓÔÕÐ Ë socket É Tcl-ÍÁÓÓÉ×Õ state # ... # (ÎÁÐÒÉÍÅÒ: # set data [read $socket 1000]; # set nbytes [string length $data]) # ... return nbytes } </pre> </dd> <dt><strong>-headers</strong> <em>keyvaluelist</em></dt> <dd><p>ïÐÃÉÑ ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ×ËÌÀÞÅÎÉÑ × ÚÁÇÏÌÏ×ÏË HTTP ÚÁÐÒÏÓÁ ÄÏÐÏÌÎÉÔÅÌØÎÙÈ ÐÏÌÅÊ. áÒÇÕÍÅÎÔ ÄÏÌÖÅÎ ÂÙÔØ ÐÒÁ×ÉÌØÎÙÍ ÓÐÉÓËÏÍ Ó ÞÅÔÎÙÍ ÞÉÓÌÏÍ ÜÌÅÍÅÎÔÏ×, ÓÏÓÔÏÑÝÉÍ ÐÏÐÅÒÅÍÅÎÎÏ ÉÚ ËÌÀÞÅÊ É ÉÈ ÚÎÁÞÅÎÉÊ. ëÌÀÞÉ ÉÓÐÏÌØÚÕÀÔÓÑ ËÁË ÉÍÅÎÁ ÐÏÌÅÊ ÚÁÇÏÌÏ×ËÁ. éÚ ÚÎÁÞÅÎÉÊ ÕÄÁÌÑÀÔÓÑ ÓÉÍ×ÏÌÙ ÐÅÒÅÈÏÄÁ ÎÁ ÎÏ×ÕÀ ÓÔÒÏËÕ, ÞÔÏÂÙ ÉÚÂÅÖÁÔØ ÆÏÒÍÉÒÏ×ÁÎÉÑ ÎÅÐÒÁ×ÉÌØÎÏÇÏ ÚÁÇÏÌÏ×ËÁ. îÁÐÒÉÍÅÒ, ÅÓÌÉ <em>keyvaluelist</em> ÓÏÄÅÒÖÉÔ ÓÐÉÓÏË <em>{Pragma no-cache}</em> ÂÕÄÅÔ ÓÆÏÒÍÉÒÏ×ÁÎ ÓÌÅÄÕÀÝÉÊ ÚÁÇÏÌÏ×ÏË ÚÁÐÒÏÓÁ:</p> <pre> Pragma: no-cache </pre> </dd> <dt><strong>-progress</strong> <em>callback</em></dt> <dd><p>ïÐÃÉÑ ÏÂÅÓÐÅÞÉ×ÁÅÔ ×ÙÚÏ× ËÏÍÁÎÄÙ <em>callback</em> ÄÌÑ ÏÂÒÁÂÏÔËÉ ÏÞÅÒÅÄÎÏÊ ÐÏÒÃÉÉ ÄÁÎÎÙÈ. ëÏÍÁÎÄÁ <em>callback</em> ÐÏÌÕÞÁÅÔ ÔÒÉ ÁÒÇÕÍÅÎÔÁ: ÚÎÁÞÅÎÉÅ <em>token</em>, ×ÏÚ×ÒÁÝÅÎÎÏÅ ËÏÍÁÎÄÏÊ <strong>::http::geturl</strong>, ÐÒÅÄÐÏÌÁÇÁÅÍÙÊ ÐÏÌÎÙÊ ÒÁÚÍÅÒ ÄÁÎÎÙÈ ÉÚ ÍÅÔÁ-ÄÁÎÎÙÈ É ÔÅËÕÝÅÅ ËÏÌÉÞÅÓÔ×Ï ÐÏÓÔÕÐÉ×ÛÉÈ ÄÁÎÎÙÈ × ÂÁÊÔÁÈ. åÓÌÉ ÐÒÅÄÐÏÌÁÇÁÅÍÙÊ ÐÏÌÎÙÊ ÒÁÚÍÅÒ ÎÅÉÚ×ÅÓÔÅÎ, ×ÍÅÓÔÏ ÎÅÇÏ ÐÏÄÓÔÁ×ÌÑÅÔÓÑ 0. îÉÖÅ ÐÒÉ×ÅÄÅÎ ÛÁÂÌÏÎ ÄÌÑ ÐÒÏÃÅÄÕÒÙ, ×ÙÚÙ×ÁÅÍÏÊ ÐÏ ÏÐÃÉÉ <strong>-progress</strong>:</p> <pre> proc httpProgress {token total current} { upvar #0 $token state } </pre> </dd> <dt><strong>-query</strong> <em>query</em></dt> <dd>åÓÌÉ ÕËÁÚÁÎÁ ÄÁÎÎÁÑ ÏÐÃÉÑ, <strong>::http::geturl</strong> ÆÏÒÍÉÒÕÅÔ ÚÁÐÒÏÓ POST É ÐÅÒÅÄÁÅÔ ÅÇÏ ÎÁ ÓÅÒ×ÅÒ. úÁÐÒÏÓ ÄÏÌÖÅÎ ÂÙÔØ ÓÆÏÒÍÁÔÉÒÏ×ÁÎ. äÌÑ ×ÙÐÏÌÎÅÎÉÑ ÆÏÒÍÁÔÉÒÏ×ÁÎÉÑ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÐÒÏÃÅÄÕÒÁ <a href= "#http::formatQuery"><strong>::http::formatQuery</strong></a>. </dd> <dt><strong>-timeout</strong> <em>milliseconds</em></dt> <dd>åÓÌÉ ÚÎÁÞÅÎÉÅ <em>milliseconds</em> ÎÅ ÒÁ×ÎÏ ÎÕÌÀ, ÕÓÔÁÎÁ×ÌÉ×ÁÅÔÓÑ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÅ ×ÒÅÍÑ ÚÁÄÅÒÖËÉ. úÁÄÅÒÖËÁ ×ÙÐÏÌÎÑÅÔÓÑ ÐÅÒÅÄ ×ÙÚÏ×ÏÍ ËÏÍÁÎÄÙ <a href= "#http::reset"><strong>::http::reset</strong></a> É ËÏÍÁÎÄÙ, ÚÁÄÁÎÎÏÊ ÏÐÃÉÅÊ <strong>-command</strong>. ÷Ï ×ÒÅÍÑ ÚÁÄÅÒÖËÉ ËÏÍÁÎÄÁ <a href="#http::status"><strong>::http::status</strong></a> ×ÏÚ×ÒÁÝÁÅÔ ÚÎÁÞÅÎÉÅ <em>timeout</em>. </dd> <dt><strong>-validate</strong> <em>boolean</em></dt> <dd>åÓÌÉ ÚÎÁÞÅÎÉÅ boolean ÎÅ ÒÁ×ÎÏ ÎÕÌÀ, <strong>::http::geturl</strong> ×ÙÐÏÌÎÑÅÔ HTTP HEAD ÚÁÐÒÏÓ. ôÁËÏÊ ÚÁÐÒÏÓ ×ÏÚ×ÒÁÝÁÅÔ ÍÅÔÁ ÉÎÆÏÒÍÁÃÉÀ Ï ÉÓÔÏÞÎÉËÅ ÄÁÎÎÙÈ (URL), Á ÎÅ ÅÇÏ ÓÏÄÅÒÖÁÎÉÅ. íÅÔÁ ÉÎÆÏÒÍÁÃÉÑ ÓÏÄÅÒÖÉÔÓÑ × ÐÅÒÅÍÅÎÎÏÊ <em>state(meta)</em> (ÓÍ. "<a href="#íáóóé÷_óïóôïñîéñ_ôòáîúáëãéé">íÁÓÓÉ× ÓÏÓÔÏÑÎÉÑ ÔÒÁÎÚÁËÃÉÉ</a>"). </dd> </dl> </dd> <dt><a name="http::formatQuery"></a><strong>::http::formatQuery</strong> <em>key</em> <em>value</em> ?<em>key</em> <em>value</em>...?</dt> <dd>ëÏÍÁÎÄÁ ×ÙÐÏÌÎÑÅÔ ÐÅÒÅËÏÄÉÒÏ×ÁÎÉÅ ÚÁÐÒÏÓÁ. ëÏÍÁÎÄÁ ÉÓÐÏÌØÚÕÅÔ ÞÅÔÎÏÅ ÞÉÓÌÏ ÁÒÇÕÍÅÎÔÏ×, Ñ×ÌÑÀÝÉÈÓÑ ÓÏÏÔ×ÅÔÓÔ×ÅÎÎÏ ËÌÀÞÁÍÉ ÚÁÐÒÏÓÁ É ÉÈ ÚÎÁÞÅÎÉÑÍÉ. ïÎÁ ÐÒÅÏÂÒÁÚÕÅÔ ËÌÀÞÉ É ÚÎÁÞÅÎÉÑ É ×ÏÚ×ÒÁÝÁÅÔ ÏÄÎÕ ÓÔÒÏËÕ, × ËÏÔÏÒÏÊ ÒÁÓÓÔÁ×ÌÅÎÙ ÎÅÏÂÈÏÄÉÍÙÅ "&" É "=" ÒÁÚÄÅÌÉÔÅÌÉ. òÅÚÕÌØÔÁÔ ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ × ËÁÞÅÓÔ×Å ÚÎÁÞÅÎÉÑ ÄÌÑ ÏÐÃÉÉ <strong>-query</strong> ËÏÍÁÎÄÙ <a href="#http::geturl_url"> <strong>::http::geturl</strong></a>. </dd> <dt><a name="http::reset"></a><strong>::http::reset</strong> <em>token</em> ?<em>why</em>?</dt> <dd>ëÏÍÁÎÄÁ ÐÅÒÅÚÁÐÕÓËÁÅÔ HTTP ÔÒÁÎÚÁËÃÉÀ <em>token</em>, ÅÓÌÉ ÔÁËÁÑ ÉÓÐÏÌÎÑÅÔÓÑ. úÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ <strong>state(status)</strong> ÐÒÉ ÜÔÏÍ ÐÅÒÅÕÓÔÁÎÁ×ÌÉ×ÁÅÔÓÑ × <em>why</em> (ÐÏ ÕÍÏÌÞÁÎÉÀ - <strong>reset</strong>) É ×ÙÚÙ×ÁÅÔÓÑ ËÏÍÁÎÄÁ, ÚÁÄÁÎÎÁÑ ÏÐÃÉÅÊ <strong>-command</strong>. </dd> <dt><a name="http::wait"></a><strong>::http::wait</strong> <em>token</em></dt> <dd>üÔÁ ËÏÍÁÎÄÁ ÏÂÅÓÐÅÞÉ×ÁÅÔ ÏÖÉÄÁÎÉÅ ÚÁ×ÅÒÛÅÎÉÑ ÔÒÁÎÚÁËÃÉÉ. ïÎÁ ÒÁÂÏÔÁÅÔ ÔÏÌØËÏ × ÎÁÄÅÖÎÙÈ ÉÎÔÅÒÐÒÅÔÁÔÏÒÁÈ, ÔÁË ËÁË ÏÎÁ ÉÓÐÏÌØÚÕÅÔ ËÏÍÁÎÄÕ <a href="vwait.html"><strong>vwait</strong></a>. </dd> <dt><a name="http::data"></a><strong>::http::data</strong> <em>token</em></dt> <dd>üÔÁ ËÏÍÁÎÄÁ ×ÏÚ×ÒÁÝÁÅÔ ÚÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ <strong>state(body)</strong>. </dd> <dt><a name="http::status"></a><strong>::http::status</strong> <em>token</em></dt> <dd>üÔÁ ËÏÍÁÎÄÁ ×ÏÚ×ÒÁÝÁÅÔ ÚÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ <strong>state(status)</strong>. </dd> <dt><a name="http::code"></a><strong>::http::code</strong> <em>token</em></dt> <dd>üÔÁ ËÏÍÁÎÄÁ ×ÏÚ×ÒÁÝÁÅÔ ÚÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ <strong>state(http)</strong>. </dd> <dt><a name="http::size"></a><strong>::http::size</strong> <em>token</em></dt> <dd>üÔÁ ËÏÍÁÎÄÁ ×ÏÚ×ÒÁÝÁÅÔ ÚÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ <strong>state(currentsize)</strong>. </dd> </dl> <h2><a name="íáóóé÷_óïóôïñîéñ_ôòáîúáëãéé"></a>íáóóé÷ óïóôïñîéñ ôòáîúáëãéé</h2> <p>ëÏÍÁÎÄÁ <a href="#http::geturl_url"> <strong>::http::geturl</strong></a> ×ÏÚ×ÒÁÝÁÅÔ <em>token</em> - ÉÍÑ Tcl-ÍÁÓÓÉ×Á, ÓÏÄÅÒÖÁÝÅÇÏ ÉÎÆÏÒÍÁÃÉÀ Ï HTTP ÔÒÁÎÚÁËÃÉÉ. äÌÑ ÕÐÒÏÝÅÎÉÑ ÄÏÓÔÕÐÁ Ë ÍÁÓÓÉ×Õ ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÓÌÅÄÕÀÝÕÀ ËÏÎÓÔÒÕËÃÉÀ:</p> <pre> upvar #0 $token state </pre> <p>íÁÓÓÉ× ÓÏÄÅÒÖÉÔ ÓÌÅÄÕÀÝÉÅ ÜÌÅÍÅÎÔÙ:</p> <dl> <dt>body</dt> <dd>óÏÄÅÒÖÁÎÉÅ ÄÏËÕÍÅÎÔÁ, ÚÁÄÁÎÎÏÇÏ Ó ÐÏÍÏÝØÀ URL. ðÕÓÔÏ, ÅÓÌÉ ÕËÁÚÁÎÁ ÏÐÃÉÑ <strong>-channel</strong>. úÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ ÍÏÖÎÏ ÐÏÌÕÞÉÔØ ÔÁËÖÅ Ó ÐÏÍÏÝØÀ ËÏÍÁÎÄÙ <a href= "#http::data"><strong>::http::data</strong></a>. </dd> <dt>Óurrentsize</dt> <dd>ôÅËÕÝÉÊ ÏÂßÅÍ ÉÎÆÏÒÍÁÃÉÉ × ÂÁÊÔÁÈ, ÐÏÌÕÞÅÎÎÙÊ ÏÔ ÉÓÔÏÞÎÉËÁ. úÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ ÍÏÖÎÏ ÐÏÌÕÞÉÔØ Ó ÐÏÍÏÝØÀ ËÏÍÁÎÄÙ <a href="#http::size"><strong>::http::size</strong></a>. </dd> <dt>error</dt> <dd>åÓÌÉ ÜÌÅÍÅÎÔ ÏÐÒÅÄÅÌÅÎ, ÏÎ ÓÏÄÅÒÖÉÔ ÓÔÒÏËÕ Ó ÓÏÏÂÝÅÎÉÅÍ Ï ÏÛÉÂËÅ, ÐÏÌÕÞÅÎÎÕÀ ÐÒÉ ÐÒÅÒÙ×ÁÎÉÉ HTTP ÔÒÁÎÚÁËÃÉÉ.</dd> <dt>http</dt> <dd>üÌÅÍÅÎÔ ÓÏÄÅÒÖÉÔ ÚÎÁÞÅÎÉÅ HTTP ÓÔÁÔÕÓÁ, ÐÏÌÕÞÅÎÎÏÅ ÏÔ ÓÅÒ×ÅÒÁ. úÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ ÍÏÖÎÏ ÐÏÌÕÞÉÔØ ÔÁËÖÅ Ó ÐÏÍÏÝØÀ ËÏÍÁÎÄÙ <a href="#http::code"><strong>::http::code</strong></a>. óÔÁÔÕÓ ÐÒÅÄÓÔÁ×ÌÑÅÔ ÓÏÂÏÊ ÓÔÒÏËÕ ÉÚ ÔÒÅÈ ÃÉÆÒ, ÚÎÁÞÅÎÉÑ ËÏÔÏÒÏÊ ÓÏÏÔ×ÅÔÓÔ×ÕÀÔ HTTP ÓÔÁÎÄÁÒÔÕ. ëÏÄ 200 ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÕÓÐÅÛÎÏÍÕ ×ÙÐÏÌÎÅÎÉÀ ÔÒÁÎÚÁËÃÉÉ. ëÏÄÙ, ÎÁÞÉÎÁÀÝÉÅÓÑ Ó '4' ÉÌÉ '5';, ÕËÁÚÙ×ÁÀÔ ÎÁ ÏÛÉÂËÕ. ëÏÄÙ, ÎÁÞÉÎÁÀÝÉÅÓÑ Ó '3', ÓÏÏÔ×ÅÔÓÔ×ÕÀÔ ÏÛÉÂËÁÍ ÐÅÒÅÎÁÐÒÁ×ÌÅÎÉÑ. ÷ ÜÔÏÍ ÓÌÕÞÁÅ ÍÅÔÁ ÄÁÎÎÙÅ <strong>Location</strong> ÏÐÒÅÄÅÌÑÀÔ ÎÏ×ÙÊ ÉÓÔÏÞÎÉË ÉÎÆÏÒÍÁÃÉÉ, ËÏÔÏÒÙÊ ÓÏÄÅÒÖÉÔ ÚÁÐÒÏÛÅÎÎÙÅ ÄÁÎÎÙÅ.</dd> <dt>meta</dt> <dd><p>íÅÔÁ ÄÁÎÎÙÅ, ÏÐÉÓÙ×ÁÀÝÉÅ ÓÏÄÅÒÖÁÎÉÅ ÄÏËÕÍÅÎÔÁ. äÁÎÎÙÊ ÜÌÅÍÅÎÔ ÍÁÓÓÉ×Á ÓÏÄÅÒÖÉÔ ÓÐÉÓÏË ËÌÀÞÅÊ É ÉÈ ÚÎÁÞÅÎÉÊ. þÔÏÂÙ ÏÂÌÅÇÞÉÔØ ÄÏÓÔÕÐ Ë ÄÁÎÎÙÍ ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÓÌÅÄÕÀÝÕÀ ËÏÎÓÔÒÕËÃÉÀ:</p> <pre> array set meta $state(meta) </pre> <p>îÅËÏÔÏÒÙÅ ËÌÀÞÉ ÍÅÔÁ ÄÁÎÎÙÈ ÐÅÒÅÞÉÓÌÅÎÙ ÎÉÖÅ, ÎÏ × HTTP ÓÔÁÎÄÁÒÔÅ ÉÈ ÐÅÒÅÞÉÓÌÅÎÏ ÂÏÌØÛÅ, ËÒÏÍÅ ÔÏÇÏ, ÓÅÒ×ÅÒ ÍÏÖÅÔ ÄÏÂÁ×ÌÑÔØ ÓÏÂÓÔ×ÅÎÎÙÅ.</p> </dd> <dt>Content-Type</dt> <dd>ôÉÐ ÄÏËÕÍÅÎÔÁ. îÁÐÒÉÍÅÒ, <strong>text/html</strong>, <strong>image/gif</strong>, <strong>application/postscript</strong> ÉÌÉ <strong>application/x-tcl</strong>.</dd> <dt>Content-Length</dt> <dd>ïÂßÑ×ÌÅÎÎÙÊ ÒÁÚÍÅÒ ÄÏËÕÍÅÎÔÁ. òÅÁÌØÎÙÊ ÏÂßÅÍ ÉÎÆÏÒÍÁÃÉÉ, ÐÏÌÕÞÅÎÎÏÊ Ó ÐÏÍÏÝØÀ ËÏÍÁÎÄÙ <a href="#http::geturl_url"> <strong>::http::geturl</strong></a>, ÓÏÄÅÒÖÉÔÓÑ × ÐÅÒÅÍÅÎÎÏÊ <strong>state(size)</strong>. </dd> <dt>Location</dt> <dd>éÚÍÅÎÅÎÎÙÊ ÁÄÒÅÓ ÄÏËÕÍÅÎÔÁ.</dd> <dt>status</dt> <dd>÷ÏÚÍÏÖÎÙÅ ÚÎÁÞÅÎÉÑ <strong>ok</strong>,<strong>reset</strong> ÉÌÉ <strong>error</strong>. ÷Ï ×ÒÅÍÑ ÔÒÁÎÚÁËÃÉÉ ÚÎÁÞÅÎÉÅ ÐÕÓÔÏÅ.</dd> <dt>totalsize</dt> <dd>ëÏÐÉÑ ÚÎÁÞÅÎÉÑ ÍÅÔÁ ÄÁÎÎÙÈ <strong>Content-Length</strong>.</dd> <dt>type</dt> <dd>ëÏÐÉÑ ÚÎÁÞÅÎÉÑ ÍÅÔÁ ÄÁÎÎÙÈ <strong>Content-Type</strong>.</dd> <dt>url</dt> <dd><p>úÁÐÒÏÛÅÎÎÙÊ ÁÄÒÅÓ. ðÒÉÍÅÒ:</p> <pre> # ëÏÐÉÒÏ×ÁÎÉÅ ÉÓÔÏÞÎÉËÁ × ÆÁÊÌ É ÐÅÞÁÔØ ÍÅÔÁ ÄÁÎÎÙÈ 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 # óÌÅÄÕÀÝÁÑ ËÏÍÁÎÄÁ ÚÁ×ÅÒÛÁÅÔ ÓÔÒÏËÕ, ÎÁÞÁÔÕÀ # ÐÒÏÃÅÄÕÒÏÊ 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]} { # ïÂÒÁÂÏÔËÁ ÐÅÒÅÎÁÐÒÁ×ÌÅÎÉÑ ÁÄÒÅÓÁ 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> </dd> </dl> </body> </html>