jk_service.h
来自「Tomcat 4.1与WebServer集成组件的源代码包.」· C头文件 代码 · 共 450 行 · 第 1/2 页
H
450 行
* several JVMs. It is the ID of a specific JVM in the load balance * group. We are using this variable to implement JVM session * affinity */ char *jvm_route; /* Temp solution for auth. For native1 it'll be sent on each request, if an option is present. For native2 it'll be sent with the first request. On java side, both cases will work. For tomcat3.2 or a version that doesn't support secret - don't set the secret, and it'll work. */ char *secret; /* * Callbacks into the web server. For each, the first argument is * essentially a 'this' pointer. All return JK_TRUE on success * and JK_FALSE on failure. */ /* * Send the response headers to the browser. */ int (JK_METHOD *start_response)(jk_ws_service_t *s, int status, const char *reason, const char * const *header_names, const char * const *header_values, unsigned num_of_headers); /* * Read a chunk of the request body into a buffer. Attempt to read len * bytes into the buffer. Write the number of bytes actually read into * actually_read. */ int (JK_METHOD *read)(jk_ws_service_t *s, void *buffer, unsigned len, unsigned *actually_read); /* * Write a chunk of response data back to the browser. */ int (JK_METHOD *write)(jk_ws_service_t *s, const void *buffer, unsigned len);};/* * The endpoint 'class', which represents one end of a connection to the * servlet engine. Basically, supports nothing other than forwarding the * request to the servlet engine. Endpoints can be persistent (as with * ajp13/ajp14, where a single connection is reused many times), or can last for a * single request (as with ajp12, where a new connection is created for * every request). * * An endpoint for a given protocol is obtained by the web server plugin * from a worker object for that protocol. See below for details. * * As with all the core jk classes, this is essentially an abstract base * class which is implemented/extended by classes which are specific to a * particular protocol. By using an abstract base class in this manner, * plugins can be written for different servers (e.g. IIS, Apache) without * the plugins having to worry about which protocol they are talking. * * This particular OO-in-C system uses a 'endpoint_private' pointer to * point to the protocol-specific data/functions. So in the subclasses, the * methods do most of their work by getting their hands on the * endpoint_private pointer and then using that to get at the functions for * their protocol. * * Try imagining this as a 'public abstract class', and the * endpoint_private pointer as a sort of extra 'this' reference. Or * imagine that you are seeing the internal vtables of your favorite OO * language. Whatever works for you. * * See jk_ajp13_worker.c/jk_ajp14_worker.c and jk_ajp12_worker.c for examples. */struct jk_endpoint { /* * A 'this' pointer which is used by the subclasses of this class to * point to data/functions which are specific to a given protocol * (e.g. ajp12 or ajp13 or ajp14). */ void *endpoint_private; /* * Forward a request to the servlet engine. The request is described * by the jk_ws_service_t object. I'm not sure exactly how * is_recoverable_error is being used. */ int (JK_METHOD *service)(jk_endpoint_t *e, jk_ws_service_t *s, jk_logger_t *l, int *is_recoverable_error); /* * Called when this particular endpoint has finished processing a * request. For some protocols (e.g. ajp12), this frees the memory * associated with the endpoint. For others (e.g. ajp13/ajp14), this can * return the endpoint to a cache of already opened endpoints. * * Note that the first argument is *not* a 'this' pointer, but is * rather a pointer to a 'this' pointer. This is necessary, because * we may need to free this object. */ int (JK_METHOD *done)(jk_endpoint_t **p, jk_logger_t *l);};/* * The worker 'class', which represents something to which the web server * can delegate requests. * * This can mean communicating with a particular servlet engine instance, * using a particular protocol. A single web server instance may have * multiple workers communicating with a single servlet engine (it could be * using ajp12 for some requests and ajp13/ajp14 for others). Or, a single web * server instance could have multiple workers communicating with different * servlet engines using the same protocol (it could be load balancing * among many engines, using ajp13/ajp14 for all communication). * * There is also a load balancing worker (jk_lb_worker.c), which itself * manages a group of workers. * * Web servers are configured to forward requests to a given worker. To * handle those requests, the worker's get_endpoint method is called, and * then the service() method of that endpoint is called. * * As with all the core jk classes, this is essentially an abstract base * class which is implemented/extended by classes which are specific to a * particular protocol (or request-handling system). By using an abstract * base class in this manner, plugins can be written for different servers * (e.g. IIS, Apache) without the plugins having to worry about which * protocol they are talking. * * This particular OO-in-C system uses a 'worker_private' pointer to * point to the protocol-specific data/functions. So in the subclasses, the * methods do most of their work by getting their hands on the * worker_private pointer and then using that to get at the functions for * their protocol. * * Try imagining this as a 'public abstract class', and the * worker_private pointer as a sort of extra 'this' reference. Or * imagine that you are seeing the internal vtables of your favorite OO * language. Whatever works for you. * * See jk_ajp14_worker.c, jk_ajp13_worker.c and jk_ajp12_worker.c for examples. */struct jk_worker { /* * A 'this' pointer which is used by the subclasses of this class to * point to data/functions which are specific to a given protocol * (e.g. ajp12 or ajp13 or ajp14). */ void *worker_private; /* * For all of the below (except destroy), the first argument is * essentially a 'this' pointer. */ /* * Given a worker which is in the process of being created, and a list * of configuration options (or 'properties'), check to see if it the * options are. This will always be called before the init() method. * The init/validate distinction is a bit hazy to me. * See jk_ajp13_worker.c/jk_ajp14_worker.c and jk_worker.c->wc_create_worker() */ int (JK_METHOD *validate)(jk_worker_t *w, jk_map_t *props, jk_worker_env_t *we, jk_logger_t *l); /* * Do whatever initialization needs to be done to start this worker up. * Configuration options are passed in via the props parameter. */ int (JK_METHOD *init)(jk_worker_t *w, jk_map_t *props, jk_worker_env_t *we, jk_logger_t *l); /* * Obtain an endpoint to service a particular request. A pointer to * the endpoint is stored in pend. */ int (JK_METHOD *get_endpoint)(jk_worker_t *w, jk_endpoint_t **pend, jk_logger_t *l); /* * Shutdown this worker. The first argument is not a 'this' pointer, * but rather a pointer to 'this', so that the object can be free'd (I * think -- though that doesn't seem to be happening. Hmmm). */ int (JK_METHOD *destroy)(jk_worker_t **w, jk_logger_t *l);};/* * Essentially, an abstract base class (or factory class) with a single * method -- think of it as createWorker() or the Factory Method Design * Pattern. There is a different worker_factory function for each of the * different types of workers. The set of all these functions is created * at startup from the list in jk_worker_list.h, and then the correct one * is chosen in jk_worker.c->wc_create_worker(). See jk_worker.c and * jk_ajp13_worker.c/jk_ajp14_worker.c for examples. * * This allows new workers to be written without modifing the plugin code * for the various web servers (since the only link is through * jk_worker_list.h). */typedef int (JK_METHOD *worker_factory)(jk_worker_t **w, const char *name, jk_logger_t *l);#ifdef __cplusplus}#endif /* __cplusplus */#endif /* JK_SERVICE_H */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?