test_ncbi_http_get.c
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:6k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbi_http_get.c,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 17:05:24  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbi_http_get.c,v 1000.0 2003/10/29 17:05:24 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Anton Lavrentiev
  35.  *
  36.  * File Description:
  37.  *   Retrieve a Web document via HTTP
  38.  *
  39.  */
  40. #include "../ncbi_ansi_ext.h"
  41. #include "../ncbi_priv.h"
  42. #include <connect/ncbi_http_connector.h>
  43. #include <connect/ncbi_util.h>
  44. #include <stdlib.h>
  45. #include <time.h>
  46. #ifdef NCBI_OS_UNIX
  47. #  include <unistd.h>
  48. #endif
  49. /* This header must go last */
  50. #include "test_assert.h"
  51. int main(int argc, char* argv[])
  52. {
  53.     static const STimeout s_ZeroTmo = {0, 0};
  54.     CONNECTOR     connector;
  55.     SConnNetInfo* net_info;
  56.     THCC_Flags    flags;
  57.     CONN          conn;
  58.     time_t        t;
  59.     size_t        n;
  60.     char*         s;
  61.     CORE_SetLOGFormatFlags(fLOG_None          | fLOG_Level   |
  62.                            fLOG_OmitNoteLevel | fLOG_DateTime);
  63.     CORE_SetLOGFILE(stderr, 0/*false*/);
  64.     if (argc != 2 || !*argv[1]) {
  65.         CORE_LOG(eLOG_Error, "URL has to be supplied on the command line");
  66.         exit(1);
  67.     }
  68.     CORE_LOG(eLOG_Note, "Creating network info structure");
  69.     if (!(net_info = ConnNetInfo_Create(0)))
  70.         CORE_LOG(eLOG_Fatal, "Cannot create network info structure");
  71.     net_info->req_method = eReqMethod_Get;
  72.     if ((s = getenv("CONN_TIMEOUT"))  &&  strcmp(s, "0") == 0) {
  73.         memcpy(&net_info->tmo, &s_ZeroTmo, sizeof(s_ZeroTmo));
  74.         net_info->timeout = &net_info->tmo;
  75.     }
  76.     CORE_LOGF(eLOG_Note,
  77.               ("Parsing URL "%s" into network info structure", argv[1]));
  78.     if (!ConnNetInfo_ParseURL(net_info, argv[1]))
  79.         CORE_LOG(eLOG_Fatal, "URL parsing failed");
  80.     if ((s = getenv("CONN_RECONNECT")) != 0 &&
  81.         (strcasecmp(s, "TRUE") == 0 || strcasecmp(s, "1") == 0)) {
  82.         flags = fHCC_AutoReconnect;
  83.         CORE_LOG(eLOG_Note, "Reconnect mode will be used");
  84.     } else
  85.         flags = 0;
  86.     CORE_LOG(eLOG_Note, "Creating HTTP connector");
  87.     if (!(connector = HTTP_CreateConnector(net_info, 0, flags)))
  88.         CORE_LOG(eLOG_Fatal, "Cannot create HTTP connector");
  89.     CORE_LOG(eLOG_Note, "Creating connection");
  90.     if (CONN_Create(connector, &conn) != eIO_Success)
  91.         CORE_LOG(eLOG_Fatal, "Cannot create connection");
  92.     CONN_SetTimeout(conn, eIO_Open,      net_info->timeout);
  93.     CONN_SetTimeout(conn, eIO_ReadWrite, net_info->timeout);
  94.     t = time(0);
  95.     for (;;) {
  96.         char blk[512];
  97.         EIO_Status status = CONN_Wait(conn, eIO_Read, net_info->timeout);
  98.         if (status != eIO_Success) {
  99.             if (status == eIO_Closed)
  100.                 break;
  101.             if ((unsigned long)(time(0) - t) > 30)
  102.                 CORE_LOG(eLOG_Fatal, "Timed out");
  103. #ifdef NCBI_OS_UNIX
  104.             usleep(500);
  105. #endif
  106.             continue;
  107.         }
  108.         status = CONN_Read(conn, blk, sizeof(blk), &n, eIO_ReadPlain);
  109.         if (status != eIO_Success && status != eIO_Closed)
  110.             CORE_LOGF(eLOG_Fatal, ("Read error: %s", IO_StatusStr(status)));
  111.         if (n) {
  112.             fwrite(blk, 1, n, stdout);
  113.             fflush(stdout);
  114.         } else if (status == eIO_Closed) {
  115.             break;
  116.         } else
  117.             CORE_LOG(eLOG_Fatal, "Empty read");
  118.     }
  119.     ConnNetInfo_Destroy(net_info);
  120.     CORE_LOG(eLOG_Note, "Closing connection");
  121.     CONN_Close(conn);
  122.     CORE_LOG(eLOG_Note, "Completed");
  123.     CORE_SetLOG(0);
  124.     return 0;
  125. }
  126. /*
  127.  * --------------------------------------------------------------------------
  128.  * $Log: test_ncbi_http_get.c,v $
  129.  * Revision 1000.0  2003/10/29 17:05:24  gouriano
  130.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.12
  131.  *
  132.  * Revision 6.12  2003/09/30 20:59:39  lavr
  133.  * Fix typo in previous log message
  134.  *
  135.  * Revision 6.11  2003/09/30 20:57:15  lavr
  136.  * Allow to set zero timeout via environment
  137.  *
  138.  * Revision 6.10  2003/05/20 23:52:01  lavr
  139.  * Explicit cast "time_t"->"unsigned" to avoid GCC warning
  140.  *
  141.  * Revision 6.9  2003/05/19 16:58:37  lavr
  142.  * Modified to use {0,0} timeouts in CONN_Wait() and use app timeout handling
  143.  *
  144.  * Revision 6.8  2003/05/14 03:58:43  lavr
  145.  * Match changes in respective APIs of the tests
  146.  *
  147.  * Revision 6.7  2002/10/28 15:47:06  lavr
  148.  * Use "ncbi_ansi_ext.h" privately
  149.  *
  150.  * Revision 6.6  2002/08/14 14:42:46  lavr
  151.  * Use fwrite() instead of printf() when printing out the data fetched
  152.  *
  153.  * Revision 6.5  2002/08/07 16:38:08  lavr
  154.  * EIO_ReadMethod enums changed accordingly; log moved to end
  155.  *
  156.  * Revision 6.4  2002/03/22 19:47:23  lavr
  157.  * Test_assert.h made last among the include files
  158.  *
  159.  * Revision 6.3  2002/02/05 21:45:55  lavr
  160.  * Included header files rearranged
  161.  *
  162.  * Revision 6.2  2002/01/16 21:23:15  vakatov
  163.  * Utilize header "test_assert.h" to switch on ASSERTs in the Release mode too
  164.  *
  165.  * Revision 6.1  2001/12/30 19:42:06  lavr
  166.  * Initial revision
  167.  *
  168.  * ==========================================================================
  169.  */