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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_connutil.h,v $
  4.  * PRODUCTION Revision 1000.1  2004/02/12 21:51:37  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_001] Dev-tree R6.35
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CONNECT___NCBI_CONNUTIL__H
  10. #define CONNECT___NCBI_CONNUTIL__H
  11. /*  $Id: ncbi_connutil.h,v 1000.1 2004/02/12 21:51:37 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Denis Vakatov, Anton Lavrentiev
  37.  *
  38.  * File Description:
  39.  *   Auxiliary API to:
  40.  *    1.Retrieve connection related info from the registry:
  41.  *       SConnNetInfo
  42.  *       ConnNetInfo_Create()
  43.  *       ConnNetInfo_AdjustForHttpProxy()
  44.  *       ConnNetInfo_Clone()
  45.  *       ConnNetInfo_Print()
  46.  *       ConnNetInfo_Destroy()
  47.  *       ConnNetInfo_Log()
  48.  *       ConnNetInfo_ParseURL()
  49.  *       ConnNetInfo_SetUserHeader()
  50.  *       ConnNetInfo_AppendUserHeader()
  51.  *       ConnNetInfo_DeleteUserHeader()
  52.  *       ConnNetInfo_OverrideUserHeader()
  53.  *       ConnNetInfo_ExtendUserHeader()
  54.  *       ConnNetInfo_AppendArg()
  55.  *       ConnNetInfo_PrependArg()
  56.  *       ConnNetInfo_DeleteArg()
  57.  *       ConnNetInfo_PreOverrideArg()
  58.  *       ConnNetInfo_PostOverrideArg()
  59.  *       #define REG_CONN_***
  60.  *       #define DEF_CONN_***
  61.  *
  62.  *    2.Make a connection to an URL:
  63.  *       URL_Connect()
  64.  *       
  65.  *    3.Perform URL encoding/decoding of data:
  66.  *       URL_Decode()
  67.  *       URL_DecodeEx()
  68.  *       URL_Encode()
  69.  *
  70.  *    4.Compose or parse NCBI-specific Content-Type's:
  71.  *       EMIME_SubType
  72.  *       EMIME_Encoding
  73.  *       MIME_ComposeContentType()
  74.  *       MIME_ParseContentType()
  75.  *
  76.  *    5.Search for a token in the input stream (either CONN or SOCK):
  77.  *       CONN_StripToPattern()
  78.  *       SOCK_StripToPattern()
  79.  *       BUF_StripToPattern()
  80.  *
  81.  *    6.Convert "[host][:port]" from verbal into binary form and vice versa:
  82.  *       StringToHostPort()
  83.  *       HostPortToString()
  84.  *
  85.  */
  86. #include <connect/ncbi_buffer.h>
  87. #include <connect/ncbi_connection.h>
  88. #include <connect/ncbi_socket.h>
  89. /** @addtogroup UtilityFunc
  90.  *
  91.  * @{
  92.  */
  93. #ifdef __cplusplus
  94. extern "C" {
  95. #endif
  96. typedef enum {
  97.     eReqMethod_Any = 0,
  98.     eReqMethod_Post,
  99.     eReqMethod_Get
  100. } EReqMethod;
  101. typedef enum {
  102.     eDebugPrintout_None = 0,
  103.     eDebugPrintout_Some,
  104.     eDebugPrintout_Data
  105. } EDebugPrintout;
  106. /* Network connection related configurable info struct.
  107.  * ATTENTION:  Do NOT fill out this structure (SConnNetInfo) "from scratch"!
  108.  *             Instead, use ConnNetInfo_Create() described below to create
  109.  *             it, and then fix (hard-code) some fields, if really necessary.
  110.  */
  111. typedef struct {
  112.     char           client_host[256]; /* effective client hostname            */
  113.     char           host[256];        /* host to connect to                   */
  114.     unsigned short port;             /* port to connect to, host byte order  */
  115.     char           path[1024];       /* service: path(e.g. to  a CGI script) */
  116.     char           args[1024];       /* service: args(e.g. for a CGI script) */
  117.     EReqMethod     req_method;       /* method to use in the request         */
  118.     STimeout*      timeout;          /* ptr to i/o tmo (infinite if NULL)    */
  119.     unsigned short max_try;          /* max. # of attempts to connect (>= 1) */
  120.     char           http_proxy_host[256]; /* hostname of HTTP proxy server    */
  121.     unsigned short http_proxy_port;      /* port #   of HTTP proxy server    */
  122.     char           proxy_host[256];  /* CERN-like (non-transp) f/w proxy srv */
  123.     EDebugPrintout debug_printout;   /* printout some debug info             */
  124.     int/*bool*/    stateless;        /* to connect in HTTP-like fashion only */
  125.     int/*bool*/    firewall;         /* to use firewall/relay in connects    */
  126.     int/*bool*/    lb_disable;       /* to disable local load-balancing      */
  127.     const char*    http_user_header; /* user header to add to HTTP request   */
  128.     /* the following field(s) are for the internal use only! */
  129.     int/*bool*/    http_proxy_adjusted;
  130.     STimeout       tmo;              /* default storage for finite timeout   */
  131.     const char*    service;          /* service for which this info created  */
  132. } SConnNetInfo;
  133. /* Defaults and the registry entry names for "SConnNetInfo" fields
  134.  */
  135. #define DEF_CONN_REG_SECTION      "CONN"
  136. #define REG_CONN_HOST             "HOST"
  137. #define DEF_CONN_HOST             "www.ncbi.nlm.nih.gov"
  138. #define REG_CONN_PORT             "PORT"
  139. #define DEF_CONN_PORT             80
  140. #define REG_CONN_PATH             "PATH"
  141. #define DEF_CONN_PATH             "/Service/dispd.cgi"
  142. #define REG_CONN_ARGS             "ARGS"
  143. #define DEF_CONN_ARGS             ""
  144. #define REG_CONN_REQ_METHOD       "REQ_METHOD"
  145. #define DEF_CONN_REQ_METHOD       "POST"
  146. #define REG_CONN_TIMEOUT          "TIMEOUT"
  147. #define DEF_CONN_TIMEOUT          30.0
  148. #define REG_CONN_MAX_TRY          "MAX_TRY"
  149. #define DEF_CONN_MAX_TRY          3
  150. #define REG_CONN_HTTP_PROXY_HOST  "HTTP_PROXY_HOST"
  151. #define DEF_CONN_HTTP_PROXY_HOST  ""
  152. #define REG_CONN_HTTP_PROXY_PORT  "HTTP_PROXY_PORT"
  153. #define DEF_CONN_HTTP_PROXY_PORT  80
  154. #define REG_CONN_PROXY_HOST       "PROXY_HOST"
  155. #define DEF_CONN_PROXY_HOST       ""
  156. #define REG_CONN_DEBUG_PRINTOUT   "DEBUG_PRINTOUT"
  157. #define DEF_CONN_DEBUG_PRINTOUT   ""
  158. #define REG_CONN_STATELESS        "STATELESS"
  159. #define DEF_CONN_STATELESS        ""
  160. #define REG_CONN_FIREWALL         "FIREWALL"
  161. #define DEF_CONN_FIREWALL         ""
  162. #define REG_CONN_LB_DISABLE       "LB_DISABLE"
  163. #define DEF_CONN_LB_DISABLE       ""
  164. /* This function to fill out the "*info" structure using
  165.  * registry entries named (see above) in macros REG_CONN_<NAME>:
  166.  *
  167.  *  -- INFO FIELD --  ----- NAME -----  ---------- REMARKS/EXAMPLES ---------
  168.  *  client_host       local host name   assigned automatically
  169.  *  service_name      SERVICE_NAME      no search/no value without service
  170.  *  host              HOST
  171.  *  port              PORT
  172.  *  path              PATH
  173.  *  args              ARGS
  174.  *  req_method        REQ_METHOD
  175.  *  timeout           TIMEOUT           "<sec>.<usec>": "3.00005", "infinite"
  176.  *  max_try           MAX_TRY  
  177.  *  http_proxy_host   HTTP_PROXY_HOST   no HTTP proxy if empty/NULL
  178.  *  http_proxy_port   HTTP_PROXY_PORT
  179.  *  proxy_host        PROXY_HOST
  180.  *  debug_printout    DEBUG_PRINTOUT
  181.  *  client_mode       CLIENT_MODE
  182.  *  lb_disable        LB_DISABLE
  183.  *
  184.  * A value of the field NAME is first looked for in the environment variable
  185.  * of the form service_CONN_NAME; then in the current corelib registry,
  186.  * in the section 'service' by using key CONN_NAME; then in the environment
  187.  * variable again, but using the name CONN_NAME; and finally in the default
  188.  * registry section (DEF_CONN_REG_SECTION), using just NAME. If service
  189.  * is NULL or empty then the first 2 steps in the above lookup are skipped.
  190.  *
  191.  * For default values see right above, in macros DEF_CONN_<NAME>.
  192.  */
  193. extern NCBI_XCONNECT_EXPORT SConnNetInfo* ConnNetInfo_Create
  194. (const char* service
  195.  );
  196. /* Adjust the "host:port" to "proxy_host:proxy_port", and
  197.  * "path" to "http://host:port/path" to connect through a HTTP proxy.
  198.  * Return FALSE if already adjusted(see the NOTE), or if cannot adjust
  199.  * (e.g. if "host" + "path" are too long).
  200.  * NOTE:  it does nothing if applied more than once to the same "info"
  201.  *        (or its clone), or when "http_proxy_host" is NULL.
  202.  */
  203. extern NCBI_XCONNECT_EXPORT int/*bool*/ ConnNetInfo_AdjustForHttpProxy
  204. (SConnNetInfo* info
  205.  );
  206. /* Make an exact and independent copy of "*info".
  207.  */
  208. extern NCBI_XCONNECT_EXPORT SConnNetInfo* ConnNetInfo_Clone
  209. (const SConnNetInfo* info
  210.  );
  211. /* Convenience routines to manipulate SConnNetInfo::args[].
  212.  * In "arg" all routines below assume to have a single arg name
  213.  * or an "arg=value" pair. In the former case, additional "val"
  214.  * may be supplied separately (and will be prepended by "=" if
  215.  * necessary). In the latter case, having a non-zero string in
  216.  * "val" may result in an erroneous behavior. Ampersand (&) gets
  217.  * automatically added to keep the arg list correct.
  218.  * Return value (if any): none-zero on success; 0 on error.
  219.  */
  220. /* append argument to the end of the list */
  221. extern NCBI_XCONNECT_EXPORT int/*bool*/ ConnNetInfo_AppendArg
  222. (SConnNetInfo* info,
  223.  const char*   arg,
  224.  const char*   val
  225.  );
  226. /* put argument in the front of the list */
  227. extern NCBI_XCONNECT_EXPORT int/*bool*/ ConnNetInfo_PrependArg
  228. (SConnNetInfo* info,
  229.  const char*   arg,
  230.  const char*   val
  231.  );
  232. /* delete argument from the list */
  233. extern NCBI_XCONNECT_EXPORT void ConnNetInfo_DeleteArg
  234. (SConnNetInfo* info,
  235.  const char*   arg
  236.  );
  237. /* same as sequence Delete then Prepend, see above */
  238. extern NCBI_XCONNECT_EXPORT int/*bool*/ ConnNetInfo_PreOverrideArg
  239. (SConnNetInfo* info,
  240.  const char*   arg,
  241.  const char*   val
  242.  );
  243. /* same as sequence Delete then Append, see above */
  244. extern NCBI_XCONNECT_EXPORT int/*bool*/ ConnNetInfo_PostOverrideArg
  245. (SConnNetInfo* info,
  246.  const char*   arg,
  247.  const char*   val
  248.  );
  249. /* Set user header (discard previously set header, if any).
  250.  * Reset the old header (if any) if "header" == NULL.
  251.  * Return non-zero if successful, otherwise return 0 to indicate an error.
  252.  */
  253. extern NCBI_XCONNECT_EXPORT int/*bool*/ ConnNetInfo_SetUserHeader
  254. (SConnNetInfo* info,
  255.  const char*   header
  256.  );
  257. /* Append user header (same as ConnNetInfo_SetUserHeader() if no previous
  258.  * header was set, or if "header" == NULL).
  259.  * Return non-zero if successful, otherwise return 0 to indicate an error.
  260.  */
  261. extern NCBI_XCONNECT_EXPORT int/*bool*/ ConnNetInfo_AppendUserHeader
  262. (SConnNetInfo* info,
  263.  const char*   header
  264.  );
  265. /* Override user header.
  266.  * Tags replaced (case-insensitively), and tags with empty values effectively
  267.  * delete existing tags from the old user header, e.g. "My-Tag:rn" deletes
  268.  * any appearence (if any) of "My-Tag: [<value>]" from the user header.
  269.  * Unmatched tags with non-empty values are simply added to the existing user
  270.  * header (as with "Append" above).
  271.  * Return non-zero if successful, otherwise return 0 to indicate an error.
  272.  */
  273. extern NCBI_XCONNECT_EXPORT int/*bool*/ ConnNetInfo_OverrideUserHeader
  274. (SConnNetInfo* info,
  275.  const char*   header
  276.  );
  277. /* Extend user header.
  278.  * Existings tags matching (case-insensitively) those from "header" are
  279.  * appended with new value (separated by a comma and a space) if the added
  280.  * value is non-empty, otherwise, the tags are left untouched. All new
  281.  * unmatched tags from "header" with non-empty values get added to the end
  282.  * of the user header.
  283.  * Return non-zero if successful, otherwise return 0 to indicate an error.
  284.  */
  285. extern NCBI_XCONNECT_EXPORT int/*bool*/ ConnNetInfo_ExtendUserHeader
  286. (SConnNetInfo* info,
  287.  const char*   header
  288.  );
  289. /* Delete entries from current user header, if their tags match those
  290.  * passed in "hdr" (regardless of the values, if any, in the latter).
  291.  */
  292. extern NCBI_XCONNECT_EXPORT void ConnNetInfo_DeleteUserHeader
  293. (SConnNetInfo* info,
  294.  const char*   hdr
  295.  );
  296. /* Parse URL into "*info", using (service-specific, if any) defaults.
  297.  */
  298. extern NCBI_XCONNECT_EXPORT int/*bool*/ ConnNetInfo_ParseURL
  299. (SConnNetInfo* info,
  300.  const char*   url
  301.  );
  302. /* Log the contents of "*info".
  303.  */
  304. extern NCBI_XCONNECT_EXPORT void ConnNetInfo_Log
  305. (const SConnNetInfo* info,
  306.  LOG                 log
  307.  );
  308. /* Destroy and deallocate "info" (if not NULL).
  309.  */
  310. extern NCBI_XCONNECT_EXPORT void ConnNetInfo_Destroy(SConnNetInfo* info);
  311. /* Hit URL "http://host:port/path?args" with:
  312.  *    {POST|GET} <path>?<args> HTTP/1.0rn
  313.  *    <user_headerrn>
  314.  *    Content-Length: <content_length>rnrn
  315.  * If "encode_args" is TRUE then URL-encode the "args".
  316.  * "args" can be NULL/empty -- then the '?' symbol does not get added.
  317.  * The "content_length" is mandatory, and it specifies an exact(!) amount of
  318.  * data that you are planning to send to the resultant socket (0 if none).
  319.  * If string "user_header" is not NULL/empty, then it must be terminated by a
  320.  * single 'rn'.
  321.  *
  322.  * On success, return non-NULL handle of a socket.
  323.  * ATTENTION:  due to the very essence of the HTTP connection, you may
  324.  *             perform only one { WRITE, ..., WRITE, READ, ..., READ } cycle.
  325.  * Returned socket must be closed exipicitly by "ncbi_socket.h:SOCK_Close()"
  326.  * when no longer needed.
  327.  * On error, return NULL.
  328.  *
  329.  * NOTE: Returned socket may not be immediately readable/writeable if open
  330.  *       and/or read/write timeouts were passed as {0,0}, meaning that both
  331.  *       connection and HTTP header write operation may still be pending in
  332.  *       the resultant socket. It is responsibility of the application to
  333.  *       analyze the actual socket state in this case (see "ncbi_socket.h").
  334.  */
  335. extern NCBI_XCONNECT_EXPORT SOCK URL_Connect
  336. (const char*     host,
  337.  unsigned short  port,
  338.  const char*     path,
  339.  const char*     args,
  340.  EReqMethod      req_method,
  341.  size_t          content_length,
  342.  const STimeout* c_timeout,       /* timeout for the CONNECT stage          */
  343.  const STimeout* rw_timeout,      /* timeout for READ and WRITE             */
  344.  const char*     user_header,
  345.  int/*bool*/     encode_args,     /* URL-encode the "args", if any          */
  346.  ESwitch         data_logging     /* sock.data log.; eDefault in most cases */
  347.  );
  348. /* Discard all input data before(and including) the first occurrence of
  349.  * "pattern". If "buf" is not NULL then add the discarded data(including
  350.  * the "pattern") to it. If "n_discarded" is not NULL then "*n_discarded"
  351.  * will return # of discarded bytes.
  352.  * NOTE: "pattern" == NULL causes stripping to the EOF.
  353.  */
  354. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_StripToPattern
  355. (CONN        conn,
  356.  const void* pattern,
  357.  size_t      pattern_size,
  358.  BUF*        buf,
  359.  size_t*     n_discarded
  360.  );
  361. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_StripToPattern
  362. (SOCK        sock,
  363.  const void* pattern,
  364.  size_t      pattern_size,
  365.  BUF*        buf,
  366.  size_t*     n_discarded
  367.  );
  368. extern NCBI_XCONNECT_EXPORT EIO_Status BUF_StripToPattern
  369. (BUF         buffer,
  370.  const void* pattern,
  371.  size_t      pattern_size,
  372.  BUF*        buf,
  373.  size_t*     n_discarded
  374.  );
  375. /* URL-decode up to "src_size" symbols(bytes) from buffer "src_buf".
  376.  * Write the decoded data to buffer "dst_buf", but no more than "dst_size"
  377.  * bytes.
  378.  * Assign "*src_read" to the # of bytes successfully decoded from "src_buf".
  379.  * Assign "*dst_written" to the # of bytes written to buffer "dst_buf".
  380.  * Return FALSE only if cannot decode nothing, and an unrecoverable
  381.  * URL-encoding error (such as an invalid symbol or a bad "%.." sequence)
  382.  * has occurred.
  383.  * NOTE:  the unfinished "%.." sequence is fine -- return TRUE, but dont
  384.  *        "read" it.
  385.  */
  386. extern NCBI_XCONNECT_EXPORT int/*bool*/ URL_Decode
  387. (const void* src_buf,    /* [in]     non-NULL */
  388.  size_t      src_size,   /* [in]              */
  389.  size_t*     src_read,   /* [out]    non-NULL */
  390.  void*       dst_buf,    /* [in/out] non-NULL */
  391.  size_t      dst_size,   /* [in]              */
  392.  size_t*     dst_written /* [out]    non-NULL */
  393.  );
  394. /* Act just like URL_Decode (see above) but caller can allow the specified
  395.  * non-standard URL symbols in the input buffer to be decoded "as is".
  396.  * The extra allowed symbols are passed in a ''-terminated string
  397.  * "allow_symbols" (it can be NULL or empty -- then this will be an exact
  398.  * equivalent of URL_Decode).
  399.  */
  400. extern NCBI_XCONNECT_EXPORT int/*bool*/ URL_DecodeEx
  401. (const void* src_buf,      /* [in]     non-NULL  */
  402.  size_t      src_size,     /* [in]               */
  403.  size_t*     src_read,     /* [out]    non-NULL  */
  404.  void*       dst_buf,      /* [in/out] non-NULL  */
  405.  size_t      dst_size,     /* [in]               */
  406.  size_t*     dst_written,  /* [out]    non-NULL  */
  407.  const char* allow_symbols /* [in]     ''-term */
  408.  );
  409. /* URL-encode up to "src_size" symbols(bytes) from buffer "src_buf".
  410.  * Write the encoded data to buffer "dst_buf", but no more than "dst_size"
  411.  * bytes.
  412.  * Assign "*src_read" to the # of bytes successfully encoded from "src_buf".
  413.  * Assign "*dst_written" to the # of bytes written to buffer "dst_buf".
  414.  */
  415. extern NCBI_XCONNECT_EXPORT void URL_Encode
  416. (const void* src_buf,    /* [in]     non-NULL */
  417.  size_t      src_size,   /* [in]              */
  418.  size_t*     src_read,   /* [out]    non-NULL */
  419.  void*       dst_buf,    /* [in/out] non-NULL */
  420.  size_t      dst_size,   /* [in]              */
  421.  size_t*     dst_written /* [out]    non-NULL */
  422.  );
  423. /****************************************************************************
  424.  * NCBI-specific MIME content type and sub-types
  425.  * (the API to compose and parse them)
  426.  *    Content-Type: <type>/<MIME_ComposeSubType()>rn
  427.  *
  428.  *    Content-Type: <type>/<subtype>-<encoding>rn
  429.  *
  430.  * where  MIME_ComposeSubType(EMIME_SubType subtype, EMIME_Encoding encoding):
  431.  *   "x-<subtype>-<encoding>":
  432.  *     "x-<subtype>",   "x-<subtype>-urlencoded",   "x-<subtype>-<encoding>",
  433.  *     "x-dispatch",    "x-dispatch-urlencoded",    "x-dispatch-<encoding>
  434.  *     "x-asn-text",    "x-asn-text-urlencoded",    "x-asn-text-<encoding>
  435.  *     "x-asn-binary",  "x-asn-binary-urlencoded",  "x-asn-binary-<encoding>"
  436.  *     "x-www-form",    "x-www-form-urlencoded",    "x-www-form-<encoding>"
  437.  *     "html",          "html-urlencoded",          "html-<encoding>"
  438.  *     "x-unknown",     "x-unknown-urlencoded",     "x-unknown-<encoding>"
  439.  *
  440.  *  Note:  <subtype> and <encoding> are expected to contain only
  441.  *         alphanumeric symbols, '-' and '_'. They are case-insensitive.
  442.  ****************************************************************************/
  443. /* Type
  444.  */
  445. typedef enum {
  446.     eMIME_T_NcbiData = 0,  /* "x-ncbi-data"  (NCBI specific data) */
  447.     eMIME_T_Text,          /* "text"                              */
  448.     eMIME_T_Application,   /* "application"                       */
  449.     /* eMIME_T_???, "<type>" here go other types                  */
  450.     eMIME_T_Unknown        /* "unknown"                           */
  451. } EMIME_Type;
  452. /* SubType
  453.  */
  454. typedef enum {
  455.     eMIME_Dispatch = 0,  /* "x-dispatch"    (dispatcher info)          */
  456.     eMIME_AsnText,       /* "x-asn-text"    (text ASN.1 data)          */
  457.     eMIME_AsnBinary,     /* "x-asn-binary"  (binary ASN.1 data)        */
  458.     eMIME_Fasta,         /* "x-fasta"       (data in FASTA format)     */
  459.     eMIME_WwwForm,       /* "x-www-form"                               */
  460.     /* standard MIMEs */
  461.     eMIME_Html,          /* "html"                                     */
  462.     eMIME_Plain,         /* "plain"                                    */
  463.     eMIME_Xml,           /* "xml"                                      */
  464.     eMIME_XmlSoap,       /* "xml+soap"                                 */
  465.     /* eMIME_???,           "<subtype>" here go other NCBI subtypes    */
  466.     eMIME_Unknown        /* "x-unknown"     (an arbitrary binary data) */
  467. } EMIME_SubType;
  468. /* Encoding
  469.  */
  470. typedef enum {
  471.     eENCOD_None = 0, /* ""              (the content is passed "as is") */
  472.     eENCOD_Url,      /* "-urlencoded"   (the content is URL-encoded)    */
  473.     /* eENCOD_???,      "-<encoding>" here go other NCBI encodings      */
  474.     eENCOD_Unknown   /* "-encoded"      (unknown encoding)              */
  475. } EMIME_Encoding;
  476. /* Write up to "buflen" bytes to "buf":
  477.  *   Content-Type: <type>/[x-]<subtype>-<encoding>rn
  478.  * Return pointer to the "buf".
  479.  */
  480. #define MAX_CONTENT_TYPE_LEN 64
  481. extern NCBI_XCONNECT_EXPORT char* MIME_ComposeContentTypeEx
  482. (EMIME_Type     type,
  483.  EMIME_SubType  subtype,
  484.  EMIME_Encoding encoding,
  485.  char*          buf,
  486.  size_t         buflen    /* must be at least MAX_CONTENT_TYPE_LEN */
  487.  );
  488. /* Exactly equivalent to MIME_ComposeContentTypeEx(eMIME_T_NcbiData, ...)
  489.  */
  490. extern NCBI_XCONNECT_EXPORT char* MIME_ComposeContentType
  491. (EMIME_SubType  subtype,
  492.  EMIME_Encoding encoding,
  493.  char*          buf,
  494.  size_t         buflen
  495.  );
  496. /* Parse the NCBI-specific content-type; the (case-insensitive) "str"
  497.  * can be in the following two formats:
  498.  *   Content-Type: <type>/x-<subtype>-<encoding>
  499.  *   <type>/x-<subtype>-<encoding>
  500.  *
  501.  * NOTE:  all leading spaces and all trailing spaces (and any trailing symbols,
  502.  *        if they separated from the content type by at least one space) will
  503.  *        be ignored, e.g. these are valid content type strings:
  504.  *           "   Content-Type: text/plain  foobar"
  505.  *           "  text/html rn  barfoo coocoo ....n boooo"
  506.  *
  507.  * If it does not match any of NCBI MIME type/subtypes/encodings, then
  508.  * return TRUE, eMIME_T_Unknown, eMIME_Unknown or eENCOD_None, respectively.
  509.  * If the passed "str" has an invalid (non-HTTP ContentType) format
  510.  * (or if it is NULL/empty), then
  511.  * return FALSE, eMIME_T_Unknown, eMIME_Unknown, and eENCOD_Unknown
  512.  */
  513. extern NCBI_XCONNECT_EXPORT int/*bool*/ MIME_ParseContentTypeEx
  514. (const char*     str,      /* the HTTP "Content-Type:" header to parse */
  515.  EMIME_Type*     type,     /* can be NULL */
  516.  EMIME_SubType*  subtype,  /* can be NULL */
  517.  EMIME_Encoding* encoding  /* can be NULL */
  518.  );
  519. /* Requires the MIME type be "x-ncbi-data"
  520.  */
  521. extern NCBI_XCONNECT_EXPORT int/*bool*/ MIME_ParseContentType
  522. (const char*     str,      /* the HTTP "Content-Type:" header to parse */
  523.  EMIME_SubType*  subtype,  /* can be NULL */
  524.  EMIME_Encoding* encoding  /* can be NULL */
  525.  );
  526. /* Read (skipping leading blanks) "[host][:port]" from a string.
  527.  * On success, return the advanced pointer past the host/port read.
  528.  * If no host/port detected, return 'str'.
  529.  * On format error, return 0.
  530.  * If host and/or port fragments are missing,
  531.  * then corresponding 'host'/'port' value returned as 0.
  532.  * Note that 'host' returned is in network byte order,
  533.  * unlike 'port', which always comes out in host (native) byte order.
  534.  */
  535. extern NCBI_XCONNECT_EXPORT const char* StringToHostPort
  536. (const char*     str,   /* must not be NULL */
  537.  unsigned int*   host,  /* must not be NULL */
  538.  unsigned short* port   /* must not be NULL */
  539.  );
  540. /* Print host:port into provided buffer string, not to exceed 'buflen' size.
  541.  * Suppress printing host if parameter 'host' is zero.
  542.  * Return the number of bytes printed.
  543.  */
  544. extern NCBI_XCONNECT_EXPORT size_t HostPortToString
  545. (unsigned int   host,
  546.  unsigned short port,
  547.  char*          buf,
  548.  size_t         buflen
  549.  );
  550. #ifdef __cplusplus
  551. }  /* extern "C" */
  552. #endif
  553. /* @} */
  554. /*
  555.  * --------------------------------------------------------------------------
  556.  * $Log: ncbi_connutil.h,v $
  557.  * Revision 1000.1  2004/02/12 21:51:37  gouriano
  558.  * PRODUCTION: UPGRADED [CORE_001] Dev-tree R6.35
  559.  *
  560.  * Revision 6.35  2004/01/14 18:51:41  lavr
  561.  * +eMIME_XmlSoap
  562.  *
  563.  * Revision 6.34  2004/01/07 19:24:40  lavr
  564.  * Added MIME subtype eMIME_Xml
  565.  *
  566.  * Revision 6.33  2003/09/23 21:00:33  lavr
  567.  * Reorder included header files
  568.  *
  569.  * Revision 6.32  2003/08/25 14:48:50  lavr
  570.  * ConnNetInfo_SetUserHeader():  to return completion status
  571.  *
  572.  * Revision 6.31  2003/05/29 17:56:53  lavr
  573.  * More (clarified) comments for URL_Connect()
  574.  *
  575.  * Revision 6.30  2003/05/20 21:24:01  lavr
  576.  * Limit SConnNetInfo::max_try by reasonable "short" value
  577.  *
  578.  * Revision 6.29  2003/04/09 17:58:47  siyan
  579.  * Added doxygen support
  580.  *
  581.  * Revision 6.28  2003/01/17 19:44:20  lavr
  582.  * Reduce dependencies
  583.  *
  584.  * Revision 6.27  2003/01/08 01:59:32  lavr
  585.  * DLL-ize CONNECT library for MSVC (add NCBI_XCONNECT_EXPORT)
  586.  *
  587.  * Revision 6.26  2002/11/19 19:19:24  lavr
  588.  * +ConnNetInfo_ExtendUserHeader()
  589.  *
  590.  * Revision 6.25  2002/11/12 05:49:47  lavr
  591.  * Expand host names to hold 256 chars (instead of 64)
  592.  *
  593.  * Revision 6.24  2002/10/21 18:30:27  lavr
  594.  * +ConnNetInfo_AppendArg()
  595.  * +ConnNetInfo_PrependArg()
  596.  * +ConnNetInfo_DeleteArg()
  597.  * +ConnNetInfo_PreOverrideArg()
  598.  * +ConnNetInfo_PostOverrideArg()
  599.  *
  600.  * Revision 6.23  2002/10/11 19:41:40  lavr
  601.  * +ConnNetInfo_AppendUserHeader()
  602.  * +ConnNetInfo_OverrideUserHeader()
  603.  * +ConnNetInfo_DeleteUserHeader()
  604.  *
  605.  * Revision 6.22  2002/09/19 18:00:21  lavr
  606.  * Header file guard macro changed; log moved to the end
  607.  *
  608.  * Revision 6.21  2002/05/06 19:07:25  lavr
  609.  * -#include <stdlib>; -ConnNetInfo_Print(); +ConnNetInfo_Log()
  610.  *
  611.  * Revision 6.20  2002/02/20 19:12:03  lavr
  612.  * Swapped eENCOD_Url and eENCOD_None; eENCOD_Unknown introduced
  613.  *
  614.  * Revision 6.19  2001/12/30 19:39:36  lavr
  615.  * +ConnNetInfo_ParseURL()
  616.  *
  617.  * Revision 6.18  2001/09/28 20:45:26  lavr
  618.  * SConnNetInfo::max_try equal to 0 is now treated the same way as equal to 1
  619.  *
  620.  * Revision 6.17  2001/09/19 15:58:37  lavr
  621.  * Cut trailing blanks in blank lines
  622.  *
  623.  * Revision 6.16  2001/09/10 21:14:47  lavr
  624.  * Added functions: StringToHostPort()
  625.  *                  HostPortToString()
  626.  *
  627.  * Revision 6.15  2001/06/01 16:01:58  vakatov
  628.  * MIME_ParseContentTypeEx() -- extended description
  629.  *
  630.  * Revision 6.14  2001/05/29 21:15:42  vakatov
  631.  * + eMIME_Plain
  632.  *
  633.  * Revision 6.13  2001/04/24 21:21:38  lavr
  634.  * Special text value "infinite" accepted as infinite timeout from environment
  635.  *
  636.  * Revision 6.12  2001/03/07 23:00:15  lavr
  637.  * Default value for SConnNetInfo::stateless set to empty (FALSE)
  638.  *
  639.  * Revision 6.11  2001/03/02 20:07:07  lavr
  640.  * Typos fixed
  641.  *
  642.  * Revision 6.10  2001/02/26 16:56:41  vakatov
  643.  * Comment SConnNetInfo.
  644.  *
  645.  * Revision 6.9  2001/01/23 23:06:15  lavr
  646.  * SConnNetInfo.debug_printout converted from boolean to enum
  647.  * BUF_StripToPattern() introduced
  648.  *
  649.  * Revision 6.8  2001/01/11 23:05:13  lavr
  650.  * ConnNetInfo_Create() fully documented
  651.  *
  652.  * Revision 6.7  2001/01/08 23:46:10  lavr
  653.  * REQUEST_METHOD -> REQ_METHOD to be consistent with SConnNetInfo
  654.  *
  655.  * Revision 6.6  2001/01/08 22:47:13  lavr
  656.  * ReqMethod constants changed (to conform to coding standard)
  657.  * ClientMode removed; replaced by 2 booleans: stateless and firewall
  658.  * in SConnInfo structure
  659.  *
  660.  * Revision 6.5  2000/12/29 17:47:46  lavr
  661.  * NCBID stuff removed; ClientMode enum added;
  662.  * ConnNetInfo_SetUserHeader added; http_user_header is now
  663.  * included in ConnInfo structure. ConnNetInfo_Destroy parameter
  664.  * changed to be a pointer (was a double pointer).
  665.  *
  666.  * Revision 6.4  2000/11/07 23:23:15  vakatov
  667.  * In-sync with the C Toolkit "connutil.c:R6.15", "connutil.h:R6.13"
  668.  * (with "eMIME_Dispatch" added).
  669.  *
  670.  * Revision 6.3  2000/10/05 22:39:21  lavr
  671.  * SConnNetInfo modified to contain 'client_mode' instead of just 'firewall'
  672.  *
  673.  * Revision 6.2  2000/09/26 22:01:30  lavr
  674.  * Registry entries changed, HTTP request method added
  675.  *
  676.  * Revision 6.1  2000/03/24 22:52:48  vakatov
  677.  * Initial revision
  678.  *
  679.  * ==========================================================================
  680.  */
  681. #endif /* CONNECT___NCBI_CONNUTIL__H */