minihttp.h
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:9k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /* -*- Mode: C++; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
  2. /*
  3.  * The contents of this file are subject to the Mozilla Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/MPL/
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  * 
  13.  * The Original Code is the Netscape security libraries.
  14.  * 
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation.  Portions created by Netscape are 
  17.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  18.  * Rights Reserved.
  19.  * 
  20.  * Contributor(s):
  21.  * 
  22.  * Alternatively, the contents of this file may be used under the
  23.  * terms of the GNU General Public License Version 2 or later (the
  24.  * "GPL"), in which case the provisions of the GPL are applicable 
  25.  * instead of those above.  If you wish to allow use of your 
  26.  * version of this file only under the terms of the GPL and not to
  27.  * allow others to use your version of this file under the MPL,
  28.  * indicate your decision by deleting the provisions above and
  29.  * replace them with the notice and other provisions required by
  30.  * the GPL.  If you do not delete the provisions above, a recipient
  31.  * may use your version of this file under either the MPL or the
  32.  * GPL.
  33.  */
  34. #ifndef __SSM_MINIHTTP_H__
  35. #define __SSM_MINIHTTP_H__
  36. #include "ssmerrs.h"
  37. #include "ssmdefs.h"
  38. #include "serv.h"
  39. #include "prthread.h"
  40. #include "ctrlconn.h"
  41. #include "nlsutil.h"
  42. /* Result codes; see 
  43.    http://info.internet.isi.edu:80/in-notes/rfc/files/rfc2068.txt
  44.    for more information */
  45. typedef enum
  46. {
  47.     HTTP_OK = (PRInt32) 200,
  48.     HTTP_NO_CONTENT = 204,
  49.     HTTP_BAD_REQUEST = 400,
  50.     HTTP_UNAUTHORIZED = 401,
  51.     HTTP_FORBIDDEN = 403,
  52.     HTTP_NOT_FOUND = 404,
  53.     HTTP_METHOD_NOT_ALLOWED = 405,
  54.     HTTP_INTERNAL_ERROR = 500,
  55.     HTTP_NOT_IMPLEMENTED = 501,
  56.     HTTP_SERVICE_UNAVAILABLE = 503,
  57.     HTTP_GATEWAY_TIMEOUT = 504,
  58.     HTTP_VERSION_UNSUPPORTED = 505
  59. } HTTPErrorCode;
  60. /* ### mwelch - This has to be done better after the 11/1998 demo. */
  61. typedef enum
  62. {
  63.     SSM_UI_NULL = (PRUint32) 0,
  64.         
  65.     SSM_UI_KEYGEN_PROGRESS, /* Frameset containing keygen components */
  66.     
  67.     SSM_UI_DIALOG_FRAMESET, /* Generic frameset for dialogs */
  68.     SSM_UI_DIALOG_FB,       /* Dialogs: NSM -> client feedback, kept open */
  69.     SSM_UI_DIALOG_CANCEL    /* A "cancel" command invokable by the client */
  70. } SSMDialogSelector;
  71. struct HTTPRequest
  72. {
  73.     PRFileDesc *sock;       /* Socket with which we talk to client */
  74.     char *rawreqbuf;        /* Copy of the raw request we got */
  75.     char *reqbuf;           /* The HTTP request we got, 
  76.                                which is later parsed */
  77.     char **paramNames;      /* Names of parameters passed to the URL */
  78.     char **paramValues;     /* Values of parameters passed to the URL */
  79.     PRUint32 numParams;     /* How many parameters were passed */
  80.     PRUint32 slen;          /* The amount of actual text in the buffer(s) */
  81.     PRUint32 len;           /* The allocated length of the buffer(s) */
  82.     char *hdrbuf;           /* Response header */
  83.     SSMStatus rv;            /* Internal result code (used if an 
  84.                                internal error occurred) */
  85.     HTTPErrorCode httprv;   /* HTTP result code (200, 401, 404, etc) */
  86.     char *errormsg;         /* if a problem occurs, send this string back
  87.                                to the client. */
  88.     char *filename;         /* Canned file to fetch from data, if any */
  89.     /* These point to chars within (reqbuf). */
  90.     char *handlerName;      /* Command requested by client */
  91.     char *params;           /* Parameters passed to GET */
  92.     char *agent;            /* User-Agent value */
  93.     char *ctrlrid;          /* Authorization: RID of control connection */
  94.     char *password;         /* Authorization: RID of nonce */
  95.     char *referer;          /* The URL for the referer */
  96.     SSMControlConnection *ctrlconn;
  97.                             /* Control connection owning this connection */
  98.     SSMResource *target;    /* Target resource, if any */
  99.     char *language;         /* Accept-Language value */
  100.     char *charset;          /* Accept-Charset value */
  101.     PRBool sentResponse;    /* Have we already sent a response to the user? */
  102.     PRBool keepSock;        /* Are we keeping this socket (eg for logging)? */
  103.     PRBool processText;     /* Should we interpret files we send out as text? */
  104.     SSMResourceID rid;      /* ID of requested resource */
  105. };
  106. typedef struct SSMHTTPParamMultValuesStr{
  107.     const char *key;
  108.     char **values;
  109.     int numValues;
  110. } SSMHTTPParamMultValues;
  111. /* Typedef for a command handler. */
  112. typedef SSMStatus (*SSMCommandHandlerFunc)(HTTPRequest *req);
  113. /*Quick macro for getting the target from a HTTP Request*/
  114. #define REQ_TARGET(req) ((req)->target) ? (req)->target : &((req)->ctrlconn->super.super)
  115. /* Register a command handler. */
  116. SSMStatus SSM_HTTPRegisterCommandHandler(const char *name, 
  117.                                          SSMCommandHandlerFunc func);
  118. /* function to parse the request and submit html */
  119. SSMStatus SSM_HTTPGetGenericLump(HTTPRequest *req, PRBool binary);
  120. /* The default handler, which uses baseRef as a prefix for two strings
  121.    to use in processing and returning HTTP headers and content. Can be 
  122.    called by other handlers if no special header/content processing 
  123.    for the user is necessary. */
  124. SSMStatus SSM_HTTPDefaultCommandHandler(HTTPRequest *req);
  125. /* ### sjlee: This function is called when you need to sleep one second
  126.  *            before closing the window due to collision of dialog windows
  127.  *            this is really the default command handler with a sleep
  128.  */
  129. SSMStatus SSM_HTTPCloseAndSleep(HTTPRequest* req);
  130. /* Handler for getting binary data. This should be consolidated with
  131.    the default handler. */
  132. SSMStatus SSM_HTTPGetBinaryHandler(HTTPRequest *req);
  133. /* Handler for monitoring resources. */
  134. SSMStatus SSM_HTTPMonitorResourceHandler(HTTPRequest *req);
  135. /* Handler which shuts down a resource. */
  136. SSMStatus SSM_HTTPShutdownResourceHandler(HTTPRequest *req);
  137. /* Hello World example */
  138. SSMStatus SSM_HTTPHelloWorld(HTTPRequest *req);
  139. /* NLS Hello World example */
  140. SSMStatus SSM_HTTPHelloWorldWithNLS(HTTPRequest *req);
  141. /* SSM_HTTPThread listens to the HTTP socket for connections from
  142.    one or more clients. (arg) should be an open socket (PRFileDesc*),
  143.    therefore the port needs to have been created before being passed 
  144.    to this thread. */
  145. void SSM_HTTPThread(void *arg);
  146. /* Open the HTTP listener. */
  147. SSMStatus SSM_InitHTTP(void);
  148. /* Get the port on which we're listening for HTTP connections. */
  149. PRUint32 SSM_GetHTTPPort(void);
  150. /* Construct a URL and size info based on a known page/access point 
  151.    and control connection. */
  152. SSMStatus SSM_GenerateURL(SSMControlConnection *conn,
  153.                           char *command,
  154.                           char *baseRef,
  155.                           SSMResource *targetRes, /* can pass NULL for this */
  156.                           char *otherParams,
  157.                           PRUint32 *width, PRUint32 *height,
  158.                           char **url);
  159.                           
  160. /* Main listening thread for HTTP requests */
  161. extern PRThread *httpListenThread;
  162. extern PRUint32 httpListenPort;
  163. /* Command handler utilities */
  164. SSMStatus SSM_HTTPParamByName(HTTPRequest *req, 
  165.                               const char *key, const char **value);
  166. SSMStatus SSM_RIDTextToResource(HTTPRequest *req, const char *ridText,
  167.                                 SSMResource **res);
  168. SSMStatus SSM_HTTPReportError(HTTPRequest *req, HTTPErrorCode statusCode);
  169. void SSM_HTTPReportSpecificError(HTTPRequest *req, char *fmt, ...);
  170. SSMStatus SSM_HTTPParamValue(HTTPRequest *req, const char *key, char **value);
  171. SSMStatus SSM_HTTPParamValueMultiple(HTTPRequest *req, const char *key, 
  172.                                      SSMHTTPParamMultValues *values);
  173. SSMStatus SSM_HTTPAddParamValue(HTTPRequest *req, const char * key, 
  174.                                 const char * value);
  175. SSMStatus
  176. SSM_HTTPSendOKHeader(HTTPRequest *req, 
  177.                      char * addtlHeaders,
  178.                      char * contentType);
  179. SSMStatus
  180. SSM_HTTPSendUTF8String(HTTPRequest *req, char * str);
  181. SSMStatus 
  182. SSM_HTTPCloseWindow(HTTPRequest *req);
  183. char * SSM_ConvertStringToHTMLString(char * string);
  184. SSMStatus SSM_ProcessPasswordWindow(HTTPRequest * req);
  185. char * SSM_GenerateChangePasswordURL(PK11SlotInfo *slot, SSMResource *target);
  186. #endif