http.h
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:15k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * http.h - HTTP protocol implementation
  3.  *
  4.  * This header file defines the interface to the HTTP implementation
  5.  * in Kannel.
  6.  * 
  7.  * We implement both the client and the server side of the protocol.
  8.  * We don't implement HTTP completely - only those parts that Kannel needs.
  9.  * You may or may not be able to use this code for other projects. It has
  10.  * not been a goal, but it might be possible, though you do need other
  11.  * parts of Kannel's gwlib as well.
  12.  * 
  13.  * Initialization
  14.  * ==============
  15.  *
  16.  * The library MUST be initialized by a call to http_init. Failure to
  17.  * initialize means the library WILL NOT work. Note that the library
  18.  * can't initialize itself implicitly, because it cannot reliably
  19.  * create a mutex to protect the initialization. Therefore, it is the
  20.  * caller's responsibility to call http_init exactly once (no more, no
  21.  * less) at the beginning of the process, before any other thread makes
  22.  * any calls to the library.
  23.  * 
  24.  * Client functionality
  25.  * ====================
  26.  * 
  27.  * The library will invisibly keep the connections to HTTP servers open,
  28.  * so that it is possible to make several HTTP requests over a single
  29.  * TCP connection. This makes it much more efficient in high-load situations.
  30.  * On the other hand, if one request takes long, the library will still
  31.  * use several connections to the same server anyway.
  32.  * 
  33.  * The library user can specify an HTTP proxy to be used. There can be only
  34.  * one proxy at a time, but it is possible to specify a list of hosts for
  35.  * which the proxy is not used. The proxy can be changed at run time.
  36.  * 
  37.  * Server functionality
  38.  * ====================
  39.  * 
  40.  * The library allows the implementation of an HTTP server by having
  41.  * functions to specify which ports should be open, and receiving requests
  42.  * from those ports.
  43.  * 
  44.  * Header manipulation
  45.  * ===================
  46.  * 
  47.  * The library additionally has some functions for manipulating lists of
  48.  * headers. These take a `List' (see gwlib/list.h) of Octstr's. The list
  49.  * represents a list of headers in an HTTP request or reply. The functions
  50.  * manipulate the list by adding and removing headers by name. It is a
  51.  * very bad idea to manipulate the list without using the header
  52.  * manipulation functions, however.
  53.  *
  54.  * Basic Authentication
  55.  * ====================
  56.  *
  57.  * Basic Authentication is the standard way for a client to authenticate
  58.  * itself to a server. It is done by adding an "Authorization" header
  59.  * to the request. The interface in this header therefore doesn't mention
  60.  * it, but the client and the server can do it by checking the headers
  61.  * using the generic functions provided.
  62.  *
  63.  * Acknowledgements
  64.  * ================
  65.  *
  66.  * Design: Lars Wirzenius, Richard Braakman
  67.  * Implementation: Lars Wirzenius
  68.  */
  69. #ifndef HTTP_H
  70. #define HTTP_H
  71. #include "gwlib/list.h"
  72. #include "gwlib/octstr.h"
  73. /*
  74.  * Well-known return values from HTTP servers. This is not a complete
  75.  * list, but it includes the values that Kannel needs to handle
  76.  * specially.
  77.  */
  78. enum {
  79. HTTP_OK = 200,
  80. HTTP_CREATED = 201,
  81. HTTP_ACCEPTED = 202,
  82. HTTP_NO_CONTENT = 204,
  83. HTTP_RESET_CONTENT = 205,
  84. HTTP_MOVED_PERMANENTLY = 301,
  85. HTTP_FOUND = 302,
  86. HTTP_SEE_OTHER = 303,
  87. HTTP_NOT_MODIFIED = 304,
  88. HTTP_TEMPORARY_REDIRECT  = 307,
  89.     HTTP_BAD_REQUEST        = 400,
  90.     HTTP_UNAUTHORIZED       = 401,
  91.     HTTP_FORBIDDEN          = 403,
  92. HTTP_NOT_FOUND = 404,
  93. HTTP_REQUEST_ENTITY_TOO_LARGE   = 413,
  94.     HTTP_UNSUPPORTED_MEDIA_TYPE     = 415,
  95. HTTP_INTERNAL_SERVER_ERROR = 500,
  96. HTTP_NOT_IMPLEMENTED = 501,
  97. HTTP_BAD_GATEWAY = 502
  98. };
  99. /*
  100.  * Groupings of the status codes listed above.
  101.  * See the http_status_class() function.
  102.  */
  103. enum {
  104. HTTP_STATUS_PROVISIONAL = 100,
  105. HTTP_STATUS_SUCCESSFUL = 200,
  106. HTTP_STATUS_REDIRECTION = 300,
  107. HTTP_STATUS_CLIENT_ERROR = 400,
  108. HTTP_STATUS_SERVER_ERROR = 500,
  109. HTTP_STATUS_UNKNOWN = 0
  110. };
  111. /*
  112.  * Methods supported by this HTTP library.  Currently not public but
  113.  * probably should be.
  114.  */
  115. enum {
  116. HTTP_METHOD_GET = 1,
  117. HTTP_METHOD_POST = 2,
  118. HTTP_METHOD_HEAD = 3
  119. };
  120. /*
  121.  * A structure describing a CGI-BIN argument/variable.
  122.  */
  123. typedef struct {
  124. Octstr *name;
  125. Octstr *value;
  126. } HTTPCGIVar;
  127. /*
  128.  * Initialization function. This MUST be called before any other function
  129.  * declared in this header file.
  130.  */
  131. void http_init(void);
  132. /*
  133.  * Shutdown function. This MUST be called when no other function
  134.  * declared in this header file will be called anymore.
  135.  */
  136. void http_shutdown(void);
  137. /***********************************************************************
  138.  * HTTP proxy interface.
  139.  */
  140. /*
  141.  * Functions for controlling proxy use. http_use_proxy sets the proxy to
  142.  * use; if another proxy was already in use, it is closed and forgotten
  143.  * about as soon as all existing requests via it have been served.
  144.  *
  145.  * http_close_proxy closes the current proxy connection, after any
  146.  * pending requests have been served.
  147.  */
  148. void http_use_proxy(Octstr *hostname, int port, List *exceptions,
  149.               Octstr *username, Octstr *password);
  150. void http_close_proxy(void);
  151. /***********************************************************************
  152.  * HTTP client interface.
  153.  */
  154. /*
  155.  * Functions for doing a GET request. The difference is that _real follows
  156.  * redirections, plain http_get does not. Return value is the status
  157.  * code of the request as a numeric value, or -1 if a response from the
  158.  * server was not received. If return value is not -1, reply_headers and
  159.  * reply_body are set and MUST be destroyed by caller.
  160.  *
  161.  * XXX these are going away in the future
  162.  */
  163. int http_get_real(int method, Octstr *url, List *request_headers, 
  164.                   Octstr **final_url, List **reply_headers, 
  165.                   Octstr **reply_body);
  166. /*
  167.  * An identification for a caller of HTTP. This is used with
  168.  * http_start_request, and http_receive_result to route results to the right
  169.  * callers.
  170.  *
  171.  * Implementation note: We use a List as the type so that we can use
  172.  * that list for communicating the results. This makes it unnecessary
  173.  * to map the caller identifier to a List internally in the HTTP module.
  174.  */
  175. typedef List HTTPCaller;
  176. /*
  177.  * Create an HTTP caller identifier.
  178.  */
  179. HTTPCaller *http_caller_create(void);
  180. /*
  181.  * Destroy an HTTP caller identifier. Those that aren't destroyed
  182.  * explicitly are destroyed by http_shutdown.
  183.  */
  184. void http_caller_destroy(HTTPCaller *caller);
  185. /*
  186.  * Signal to a caller (presumably waiting in http_receive_result) that
  187.  * we're entering shutdown phase. This will make http_receive_result
  188.  * no longer block if the queue is empty.
  189.  */
  190. void http_caller_signal_shutdown(HTTPCaller *caller);
  191. /*
  192.  * Start an HTTP request. It will be completed in the background, and
  193.  * the result will eventually be received by http_receive_result.
  194.  * http_receive_result will return the id parameter passed to this function,
  195.  * and the caller can use this to keep track of which request and which
  196.  * response belong together. If id is NULL, it is changed to a non-null
  197.  * value (NULL replies from http_receive_result are reserved for cases
  198.  * when it doesn't return a reply).
  199.  *
  200.  * If `body' is NULL, it is a GET request, otherwise as POST request.
  201.  * If `follow' is true, HTTP redirections are followed, otherwise not.
  202.  *
  203.  * 'certkeyfile' defines a filename where openssl looks for a PEM-encoded
  204.  * certificate and a private key, if openssl is compiled in and an https 
  205.  * URL is used. It can be NULL, in which case none is used and thus there 
  206.  * is no ssl authentication, unless you have set a global one with
  207.  * use_global_certkey_file() from conn.c.
  208.  */
  209. void http_start_request(HTTPCaller *caller, int method, Octstr *url, 
  210.                         List *headers, Octstr *body, int follow, void *id, 
  211.                Octstr *certkeyfile); 
  212. /*
  213.  * Get the result of a GET or a POST request. Returns either the id pointer
  214.  * (the one passed to http_start request if non-NULL) or NULL if
  215.  * http_caller_signal_shutdown has been called and there are no queued results.
  216.  */
  217. void *http_receive_result(HTTPCaller *caller, int *status, Octstr **final_url,
  218.                 List **headers, Octstr **body);
  219. /***********************************************************************
  220.  * HTTP server interface.
  221.  */
  222. /*
  223.  * Data structure representing an HTTP client that has connected to
  224.  * the server we implement. It is used to route responses correctly.
  225.  */
  226. typedef struct HTTPClient HTTPClient;
  227. /*
  228.  * Open an HTTP server at a given port. Return -1 for errors (invalid
  229.  * port number, etc), 0 for OK. This will also start a background thread
  230.  * to listen for connections to that port and read the requests from them.
  231.  * Second boolean variable indicates if the HTTP server should be started 
  232.  * for SSL-enabled connections.
  233.  */
  234. int http_open_port(int port, int ssl);
  235. /*
  236.  * Accept a request from a client to the specified open port. Return NULL
  237.  * if the port is closed, otherwise a pointer to a client descriptor.
  238.  * Return the IP number (as a string) and other related information about
  239.  * the request via arguments if function return value is non-NULL. The
  240.  * caller is responsible for destroying the values returned via arguments,
  241.  * the caller descriptor is destroyed by http_send_reply.
  242.  *
  243.  * The requests are actually read by a background thread handled by the
  244.  * HTTP implementation, so it is not necessary by the HTTP user to have
  245.  * many threads to be fast. The HTTP user should use a single thread,
  246.  * unless requests can block.
  247.  */
  248. HTTPClient *http_accept_request(int port, Octstr **client_ip, 
  249.                     Octstr **url, List **headers, Octstr **body,
  250. List **cgivars);
  251. /*
  252.  * Send a reply to a previously accepted request. The caller is responsible
  253.  * for destroying the headers and body after the call to http_send_reply
  254.  * finishes. This allows using them in several replies in an efficient way.
  255.  */
  256. void http_send_reply(HTTPClient *client, int status, List *headers, 
  257.                Octstr *body);
  258. /*
  259.  * Don't send a reply to a previously accepted request, but only close
  260.  * the connection to the client. This can be used to reject requests from
  261.  * clients that are not authorized to access us.
  262.  */
  263. void http_close_client(HTTPClient *client);
  264. /*
  265.  * Close a currently open port and stop corresponding background threads.
  266.  */
  267. void http_close_port(int port);
  268. /*
  269.  * Close all currently open ports and stop background threads.
  270.  */
  271. void http_close_all_ports(void);
  272. /*
  273.  * Destroy a list of HTTPCGIVar objects.
  274.  */
  275. void http_destroy_cgiargs(List *args);
  276. /*
  277.  * Return reference to CGI argument 'name', or NULL if not matching.
  278.  */
  279. Octstr *http_cgi_variable(List *list, char *name);
  280. /***********************************************************************
  281.  * HTTP header interface.
  282.  */
  283. /*
  284.  * Functions for manipulating a list of headers. You can use a list of
  285.  * headers returned by one of the functions above, or create an empty
  286.  * list with http_create_empty_headers. Use http_destroy_headers to
  287.  * destroy a list of headers (not just the list, but the headers
  288.  * themselves). You can also use http_parse_header_string to create a list:
  289.  * it takes a textual representation of headers as an Octstr and returns
  290.  * the corresponding List. http_generate_header_string goes the other
  291.  * way.
  292.  *
  293.  * Once you have a list of headers, you can use http_header_add and the
  294.  * other functions to manipulate it.
  295.  */
  296. List *http_create_empty_headers(void);
  297. void http_destroy_headers(List *headers);
  298. void http_header_add(List *headers, char *name, char *contents);
  299. void http_header_get(List *headers, long i, Octstr **name, Octstr **value);
  300. List *http_header_duplicate(List *headers);
  301. void http_header_pack(List *headers);
  302. void http_append_headers(List *to, List *from);
  303. Octstr *http_header_value(List *headers, Octstr *header);
  304. /*
  305.  * Append all headers from new_headers to old_headers.  Headers from
  306.  * new_headers _replace_ the ones in old_headers if they have the same
  307.  * name.  For example, if you have:
  308.  * old_headers
  309.  *    Accept: text/html
  310.  *    Accept: text/plain
  311.  *    Accept: image/jpeg
  312.  *    Accept-Language: en
  313.  * new_headers
  314.  *    Accept: text/html
  315.  *    Accept: text/plain
  316.  * then after the operation, old_headers will have
  317.  *    Accept-Language: en
  318.  *    Accept: text/html
  319.  *    Accept: text/plain
  320.  */
  321. void http_header_combine(List *old_headers, List *new_headers);
  322. /*
  323.  * Return the length of the quoted-string (a HTTP field element)
  324.  * starting at position pos in the header.  Return -1 if there
  325.  * is no quoted-string at that position.
  326.  */
  327. long http_header_quoted_string_len(Octstr *header, long pos);
  328. /*
  329.  * Take the value part of a header that has a format that allows
  330.  * multiple comma-separated elements, and split it into a list of
  331.  * those elements.  Note that the function may have surprising
  332.  * results for values of headers that are not in this format.
  333.  */
  334. List *http_header_split_value(Octstr *value);
  335. /*
  336.  * The same as http_header_split_value, except that it splits 
  337.  * headers containing 'credentials' or 'challenge' lists, which
  338.  * have a slightly different format.  It also normalizes the list
  339.  * elements, so that parameters are introduced with ';'.
  340.  */
  341. List *http_header_split_auth_value(Octstr *value);
  342. /*
  343.  * Remove all headers with name 'name' from the list.  Return the
  344.  * number of headers removed.
  345.  */
  346. long http_header_remove_all(List *headers, char *name);
  347. /*
  348.  * Remove the hop-by-hop headers from a header list.  These are the
  349.  * headers that describe a specific connection, not anything about
  350.  * the content.  RFC2616 section 13.5.1 defines these.
  351.  */
  352. void http_remove_hop_headers(List *headers);
  353. /*
  354.  * Update the headers to reflect that a transformation has been
  355.  * applied to the entity body.
  356.  */
  357. void http_header_mark_transformation(List *headers, Octstr *new_body, 
  358.                          Octstr *new_type);
  359. /*
  360.  * Find the first header called `name' in `headers'. Returns its contents
  361.  * as a new Octet string, which the caller must free. Return NULL for
  362.  * not found.
  363.  */
  364. Octstr *http_header_find_first(List *headers, char *name);
  365. List *http_header_find_all(List *headers, char *name);
  366. /*
  367.  * Find the Content-Type header and returns the type and charset.
  368.  */
  369. void http_header_get_content_type(List *headers, Octstr **type, 
  370. Octstr **charset);
  371. /*
  372.  * Do the headers indicate that MIME type `type' is accepted?
  373.  */
  374. int http_type_accepted(List *headers, char *type);
  375. /*
  376.  * Dump the contents of a header list with debug.
  377.  */
  378. void http_header_dump(List *headers);
  379. /* 
  380.  * Ditto with cgi variables. Do not panic, when an empty are found from the 
  381.  * list.
  382.  */
  383. void http_cgivar_dump(List *cgiargs);
  384. /*
  385.  * Check for acceptable charset
  386.  */
  387. int http_charset_accepted(List *headers, char *charset);
  388. /*
  389.  * Add Basic Authentication headers headers.
  390.  */
  391. void http_add_basic_auth(List *headers, Octstr *username, Octstr *password);
  392. /*
  393.  * Return the general class of a status code.  For example, all
  394.  * 2xx codes are HTTP_STATUS_SUCCESSFUL.  See the list at the top
  395.  * of this file.
  396.  */
  397. int http_status_class(int code);
  398. /*
  399.  * Return the HTTP_METHOD_xxx enum code for a Octstr containing 
  400.  * the HTTP method name.
  401.  */
  402. int http_name2method(Octstr *method);
  403. /*
  404.  * Return the char containing the HTTP method name.
  405.  */
  406. char *http_method2name(int method);
  407. #endif