pier 00/12/06 03:21:14 Modified: connectors Makedefs.orig Makefile connectors/apache-1.3 Makefile mod_webapp.c connectors/webapplib Makefile wa.c wa.h wa_callback.c wa_callback.h wa_connection.c wa_connection.h wa_host.c wa_provider.c wa_provider.h wa_provider_info.c wa_provider_warp.c wa_request.c wa_request.h Log: Modified wa_request structure to store new request items. Modified how callbacks work from a WebAppLib perspective. Added a new callback (serverinfo). The wa_provider_info now dumps more interesting informations. Disabled warp since it makes the Apache process go around in loop. (Will fix) Modified how the library should be initialized. Fixed a couple of memory leaks (after 50.000 requests the process doesn't grow) Documented a couple of functions left undocumented. Added mapping on how servlet methods are reflected in the library. Added name and version. Revision Changes Path 1.3 +2 -3 jakarta-tomcat-4.0/connectors/Makedefs.orig Index: Makedefs.orig =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/Makedefs.orig,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- Makedefs.orig 2000/11/29 09:01:34 1.2 +++ Makedefs.orig 2000/12/06 11:20:13 1.3 @@ -55,16 +55,15 @@ # # # ========================================================================= # -# CVS $Id: Makedefs.orig,v 1.2 2000/11/29 09:01:34 pier Exp $ +# CVS $Id: Makedefs.orig,v 1.3 2000/12/06 11:20:13 pier Exp $ # Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> CC = gcc AR = ar APXS = apxs -CFLAGS = -O6 -Wall -Wstrict-prototypes +CFLAGS = -O6 -Wall -Wstrict-prototypes # -DDEBUG INCLUDES = -I../webapplib LIBS = -L../webapplib -lwebapp .c.o: $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ - 1.2 +13 -6 jakarta-tomcat-4.0/connectors/Makefile Index: Makefile =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/Makefile,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Makefile 2000/11/29 09:01:34 1.1 +++ Makefile 2000/12/06 11:20:16 1.2 @@ -55,7 +55,7 @@ # # # ========================================================================= # -# CVS $Id: Makefile,v 1.1 2000/11/29 09:01:34 pier Exp $ +# CVS $Id: Makefile,v 1.2 2000/12/06 11:20:16 pier Exp $ # Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> DIRS = webapplib apache-1.3 @@ -63,7 +63,15 @@ all: Makedefs $(MODULES) -recompile: clean all +recompile: + @echo "$(MAKE): ***" + @echo "$(MAKE): *** Cleaning up previous compilation" + @echo "$(MAKE): ***" + @$(MAKE) clean + @echo "$(MAKE): ***" + @echo "$(MAKE): *** Recompiling from sources" + @echo "$(MAKE): ***" + @$(MAKE) all Makedefs: @cp Makedefs.orig Makedefs @@ -71,10 +79,10 @@ @exit 1 webapplib/libwebapp.a: Makedefs - @make -C webapplib libwebapp.a + @$(MAKE) -C webapplib libwebapp.a apache-1.3/mod_webapp.so: Makedefs webapplib/libwebapp.a - @make -C apache-1.3 mod_webapp.so + @$(MAKE) -C apache-1.3 mod_webapp.so clean: Makedefs @for DIR in $(DIRS) ; do \ @@ -82,7 +90,7 @@ echo "$(MAKE): *** Cannot find directory '$$DIR'" ; \ exit 1 ; \ fi ; \ - make -C $$DIR clean ; \ + $(MAKE) -C $$DIR clean ; \ RET="$$?" ; \ if [ "$$RET" != "0" ] ; then \ exit $$RET ; \ @@ -91,4 +99,3 @@ distclean: clean rm -f Makedefs - 1.2 +1 -2 jakarta-tomcat-4.0/connectors/apache-1.3/Makefile Index: Makefile =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/apache-1.3/Makefile,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Makefile 2000/11/29 09:01:36 1.1 +++ Makefile 2000/12/06 11:20:23 1.2 @@ -55,7 +55,7 @@ # # # ========================================================================= # -# CVS $Id: Makefile,v 1.1 2000/11/29 09:01:36 pier Exp $ +# CVS $Id: Makefile,v 1.2 2000/12/06 11:20:23 pier Exp $ # Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> include ../Makedefs @@ -67,4 +67,3 @@ clean: rm -f mod_webapp.o mod_webapp.so - 1.5 +154 -89 jakarta-tomcat-4.0/connectors/apache-1.3/mod_webapp.c Index: mod_webapp.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/apache-1.3/mod_webapp.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- mod_webapp.c 2000/11/29 12:22:43 1.4 +++ mod_webapp.c 2000/12/06 11:20:25 1.5 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -// CVS $Id: mod_webapp.c,v 1.4 2000/11/29 12:22:43 pier Exp $ +// CVS $Id: mod_webapp.c,v 1.5 2000/12/06 11:20:25 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #include <httpd.h> @@ -75,7 +75,9 @@ /* Module declaration */ module webapp_module; /* Callback structure declaration */ -static wa_callbacks webapp_callbacks; +static wa_callback webapp_callbacks; +/* Our server (used to log error messages from the library) */ +static server_rec *webapp_server=NULL; /* ************************************************************************* */ @@ -168,8 +170,10 @@ * @param r The Apache request structure. */ static int webapp_handler(request_rec *r) { - const char *message=NULL; + conn_rec *c = r->connection; + const char *msg=NULL; wa_request *req=NULL; + int ret=0; // Try to get a hold on the webapp request structure req=(wa_request *)ap_get_module_config(r->request_config, &webapp_module); @@ -181,6 +185,15 @@ req->ruri=r->uri; req->args=r->args; req->prot=r->protocol; + req->schm=ap_http_method(r); + req->name=(char *)r->hostname; + req->port=ap_get_server_port(r); + req->rhst=(char *)ap_get_remote_host(c, r->per_dir_config, REMOTE_HOST); + req->radr=c->remote_ip; + req->user=c->user; + req->auth=c->ap_auth_type; + req->clen=0; + req->rlen=0; // Copy headers into webapp request structure if (r->headers_in!=NULL) { @@ -199,20 +212,25 @@ if (ele[x].key==NULL) continue; req->hnam[x]=ele[x].key; req->hval[x]=ele[x].val; + if (strcasecmp(ele[x].key,"Content-Length")==0) + req->clen=atol(req->hval[x]); } } else { - fprintf(stderr,"NO HEADERS\n"); req->hnum=0; req->hnam=NULL; req->hval=NULL; } + // Check if we can read something from the request + ret=ap_setup_client_block(r,REQUEST_CHUNKED_DECHUNK); + if (ret!=OK) return(ret); + // Try to handle the request - message=wa_request_handle(req,&webapp_callbacks); + msg=wa_request_handle(req); // We got an error message (critical error, not from providers) - if (message!=NULL) { - ap_log_error(APLOG_MARK,APLOG_CRIT,r->server,"%s",message); + if (msg!=NULL) { + ap_log_error(APLOG_MARK,APLOG_NOERRNO|APLOG_ERR,r->server,"%s",msg); return(HTTP_INTERNAL_SERVER_ERROR); } @@ -220,14 +238,14 @@ } /** - * Initialize webapp connections. + * Initialize the webapp library. * * @param s The server_rec structure associated with the main server. * @param p The pool for memory allocation (it never gets cleaned). */ -static void webapp_exit(server_rec *s, pool *p) { - // Destroy connections - wa_connection_destroy(); +static void webapp_init(server_rec *s, pool *p) { + webapp_server=s; + wa_init(&webapp_callbacks); } /** @@ -236,9 +254,8 @@ * @param s The server_rec structure associated with the main server. * @param p The pool for memory allocation (it never gets cleaned). */ -static void webapp_init(server_rec *s, pool *p) { - // Initialize connections - wa_connection_init(); +static void webapp_exit(server_rec *s, pool *p) { + wa_destroy(); } /* ************************************************************************* */ @@ -246,80 +263,141 @@ /* ************************************************************************* */ /** - * Log data on the web server log file. + * Add a component to the the current SERVER_SOFTWARE string and return the + * new value. * - * @param file The source file of this log entry. - * @param line The line number within the source file of this log entry. - * @param data The web-server specific data (wa_request->data). - * @param fmt The format string (printf style). - * @param ... All other parameters (if any) depending on the format. - */ -static void webapp_callback_log(void *data, const char *file, int line, - const char *fmt, ...) { - request_rec *r=(request_rec *)data; - va_list ap; + * @param component The new component to add to the SERVER_SOFTWARE string + * or NULL if no modification is necessary. + * @return The updated SERVER_SOFTWARE string. + */ +const char *webapp_callback_serverinfo(const char *component) { + const char *ret=NULL; - va_start (ap,fmt); - if (r==NULL) { - fprintf(stderr,"[%s:%d] ",file,line); - vfprintf(stderr,fmt,ap); - fprintf(stderr,"\n"); + if (component!=NULL) ap_add_version_component(component); + + ret=ap_get_server_version(); + if (ret==NULL) return("Unknown"); + return(ret); +} + +/** + * Print a debug or log message to the apache error log file. + * + * @param f The source file of this log entry. + * @param l The line number within the source file of this log entry. + * @param r The wa_request structure associated with the current request, + * or NULL. + * @param msg The message to be logged. + */ +static void webapp_callback_log(const char *f,int l,wa_request *r,char *msg) { + server_rec *s=webapp_server; + + // Try to get the current request server_rec member. + if (r!=NULL) + if (r->data!=NULL) + s=((request_rec *)r->data)->server; + + if (s==NULL) { + // We don't yet know our server_rec, simply dump to stderr and hope :) +#ifdef DEBUG + fprintf(stderr,"[%s:%l] %s\n",f,l,msg); +#else + fprintf(stderr,"%s\n",msg); +#endif } else { - char *message=ap_pvsprintf(r->pool,fmt,ap); - ap_log_error(file,line,APLOG_ERR,r->server,"%s",message); +#ifdef DEBUG + // We are debugging, so we want to make sure that file and line are in + // our error message. + ap_log_error(f,l,APLOG_NOERRNO|APLOG_ERR,s,"[%s:%l] %s",f,l,msg); +#else + // We are not debugging, so let Apache handle the file and line + ap_log_error(f,l,APLOG_NOERRNO|APLOG_ERR,s,"%s",msg); +#endif } } /** + * Return the current request_rec structure from a wa_request structure and log + * if we weren't able to retrieve it. + * + * @param f The file from where this function was called. + * @param l The line from where this function was called. + * @param r The wa_request structure. + * @return A request_rec pointer or NULL. + */ +static request_rec *webapp_callback_check(const char *f,int l,wa_request *r) { + if (r==NULL) { + webapp_callback_log(f,l,r, "Invalid wa_request member (NULL)"); + return(NULL); + } + if (r->data==NULL) { + webapp_callback_log(f,l,r, "Invalid wa_request->data member (NULL)"); + return(NULL); + } + return((request_rec *)r->data); +} + +/** * Allocate memory while processing a request. * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @param size The size in bytes of the memory to allocate. * @return A pointer to the allocated memory or NULL. */ -static void *webapp_callback_alloc(void *data, int size) { - request_rec *r=(request_rec *)data; +static void *webapp_callback_alloc(wa_request *req, int size) { + request_rec *r=webapp_callback_check(WA_LOG,req); - if (r==NULL) { - webapp_callback_log(r,WA_LOG,"Apache request_rec pointer is NULL"); - return(NULL); - } + if (r==NULL) return(NULL); return(ap_palloc(r->pool,size)); } /** * Read part of the request content. * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @param buf The buffer that will hold the data. * @param len The buffer length. * @return The number of bytes read, 0 on end of file or -1 on error. */ -static int webapp_callback_read(void *data, char *buf, int len) { - request_rec *r=(request_rec *)data; - - if (r==NULL) { - webapp_callback_log(r,WA_LOG,"Apache request_rec pointer is NULL"); +static int webapp_callback_read(wa_request *req, char *buf, int len) { + request_rec *r=webapp_callback_check(WA_LOG,req); + long ret=0; + + if (r==NULL) return(-1); + + // Check if we have something to read. + if (req->clen==0) return(0); + + // Check if we had an error previously. + if (req->rlen==-1) return(-1); + + // Send HTTP_CONTINUE to client when we're ready to read for the first time. + if (req->rlen==0) + if (ap_should_client_block(r)==0) return(0); + + // Read some data from the client and fill the buffer. + ret=ap_get_client_block(r,buf,len); + if (ret==-1) { + req->rlen=-1; return(-1); } - return((int)ap_get_client_block(r,buf,len)); + // We did read some bytes, increment the current rlen counter and return. + req->rlen+=ret; + return((int)ret); } /** * Set the HTTP response status code. * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @param status The HTTP status code for the response. * @return TRUE on success, FALSE otherwise */ -static boolean webapp_callback_setstatus(void *data, int status) { - request_rec *r=(request_rec *)data; +static boolean webapp_callback_setstatus(wa_request *req, int status) { + request_rec *r=webapp_callback_check(WA_LOG,req); - if (r==NULL) { - webapp_callback_log(r,WA_LOG,"Apache request_rec pointer is NULL"); - return(FALSE); - } + if (r==NULL) return(FALSE); r->status=status; return(TRUE); @@ -328,17 +406,14 @@ /** * Set the HTTP response mime content type. * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @param type The mime content type of the HTTP response. * @return TRUE on success, FALSE otherwise */ -static boolean webapp_callback_settype(void *data, char *type) { - request_rec *r=(request_rec *)data; +static boolean webapp_callback_settype(wa_request *req, char *type) { + request_rec *r=webapp_callback_check(WA_LOG,req); - if (r==NULL) { - webapp_callback_log(r,WA_LOG,"Apache request_rec pointer is NULL"); - return(FALSE); - } + if (r==NULL) return(FALSE); r->content_type=type; return(TRUE); @@ -347,18 +422,16 @@ /** * Set an HTTP mime header. * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @param name The mime header name. * @param value The mime header value. * @return TRUE on success, FALSE otherwise */ -static boolean webapp_callback_setheader(void *data, char *name, char *value) { - request_rec *r=(request_rec *)data; +static boolean webapp_callback_setheader(wa_request *req, char *name, + char *value) { + request_rec *r=webapp_callback_check(WA_LOG,req); - if (r==NULL) { - webapp_callback_log(r,WA_LOG,"Apache request_rec pointer is NULL"); - return(FALSE); - } + if (r==NULL) return(FALSE); ap_table_add(r->headers_out, name, value); return(TRUE); @@ -367,16 +440,13 @@ /** * Commit the first part of the response (status and headers). * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @return TRUE on success, FALSE otherwise */ -static boolean webapp_callback_commit(void *data) { - request_rec *r=(request_rec *)data; +static boolean webapp_callback_commit(wa_request *req) { + request_rec *r=webapp_callback_check(WA_LOG,req); - if (r==NULL) { - webapp_callback_log(r,WA_LOG,"Apache request_rec pointer is NULL"); - return(FALSE); - } + if (r==NULL) return(FALSE); ap_send_http_header(r); return(TRUE); @@ -385,17 +455,14 @@ /** * Write part of the response data back to the client. * - * @param buf The buffer holding the data to be written. + * @param req The request member associated with this call. * @param len The number of characters to be written. * @return The number of characters written to the client or -1 on error. */ -static int webapp_callback_write(void *data, char *buf, int len) { - request_rec *r=(request_rec *)data; +static int webapp_callback_write(wa_request *req, char *buf, int len) { + request_rec *r=webapp_callback_check(WA_LOG,req); - if (r==NULL) { - webapp_callback_log(r,WA_LOG,"Apache request_rec pointer is NULL"); - return(FALSE); - } + if (r==NULL) return(-1); return(ap_rwrite(buf, len, r)); } @@ -403,16 +470,13 @@ /** * Flush any unwritten response data to the client. * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @return TRUE on success, FALSE otherwise */ -static boolean webapp_callback_flush(void *data) { - request_rec *r=(request_rec *)data; +static boolean webapp_callback_flush(wa_request *req) { + request_rec *r=webapp_callback_check(WA_LOG,req); - if (r==NULL) { - webapp_callback_log(r,WA_LOG,"Apache request_rec pointer is NULL"); - return(FALSE); - } + if (r==NULL) return(FALSE); ap_rflush(r); return(TRUE); @@ -424,7 +488,8 @@ /* ************************************************************************* */ /* Our callback functions structure */ -static wa_callbacks webapp_callbacks = { +static wa_callback webapp_callbacks = { + webapp_callback_serverinfo, webapp_callback_log, webapp_callback_alloc, webapp_callback_read, 1.4 +3 -4 jakarta-tomcat-4.0/connectors/webapplib/Makefile Index: Makefile =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/Makefile,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- Makefile 2000/11/29 12:22:57 1.3 +++ Makefile 2000/12/06 11:20:30 1.4 @@ -55,13 +55,13 @@ # # # ========================================================================= # -# CVS $Id: Makefile,v 1.3 2000/11/29 12:22:57 pier Exp $ +# CVS $Id: Makefile,v 1.4 2000/12/06 11:20:30 pier Exp $ # Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> include ../Makedefs -OBJS = wa_callback.o wa_connection.o wa_host.o wa_provider.o wa_request.o \ - wa_provider_info.o wa_provider_warp.o +OBJS = wa.o wa_callback.o wa_connection.o wa_host.o wa_request.o \ + wa_provider.o wa_provider_info.o # wa_provider_warp.o all: libwebapp.a @@ -70,4 +70,3 @@ clean: rm -f $(OBJS) libwebapp.a - 1.3 +48 -4 jakarta-tomcat-4.0/connectors/webapplib/wa.c Index: wa.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- wa.c 2000/11/27 03:49:14 1.2 +++ wa.c 2000/12/06 11:20:31 1.3 @@ -55,9 +55,53 @@ * * * ========================================================================= */ -// CVS $Id: wa.c,v 1.2 2000/11/27 03:49:14 pier Exp $ +// CVS $Id: wa.c,v 1.3 2000/12/06 11:20:31 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> -int main(int argc, char *argv[]) { - return(0); -} \ No newline at end of file +#include <wa.h> + +/** + * Initialize the webapp library and all connections. + * + * @param cb The wa_callback structure specified by the web server. + */ +void wa_init(wa_callback *cb) { + wa_connection *curr=wa_connections; + const char *ret; + + // Set our callbacks structure + if (cb==NULL) return; + wa_callbacks=cb; + + // Set the SERVER_SOFTWARE string. + wa_callback_serverinfo(WA_NAME "/" WA_VERSION); + + // Iterate thru our connections chain + while(curr!=NULL) { + ret=(*curr->prov->init)(curr); + if (ret!=NULL) wa_callback_log(WA_LOG,NULL,ret); + else wa_callback_debug(WA_LOG,NULL,"Connection \"%s\" initialized", + curr->name); + curr=curr->next; + } + return; +} + +/** + * Reset the webapp library and all connections. + */ +void wa_destroy(void) { + wa_connection *curr=wa_connections; + const char *ret; + + // Iterate thru our hosts chain + while(curr!=NULL) { + ret=(*curr->prov->destroy)(curr); + if (ret!=NULL) wa_callback_log(WA_LOG,NULL,ret); + else wa_callback_debug(WA_LOG,NULL,"Connection \"%s\" destroyed", + curr->name); + curr=curr->next; + } + + wa_callbacks=NULL; +} 1.6 +40 -2 jakarta-tomcat-4.0/connectors/webapplib/wa.h Index: wa.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- wa.h 2000/11/30 17:39:08 1.5 +++ wa.h 2000/12/06 11:20:33 1.6 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -// CVS $Id: wa.h,v 1.5 2000/11/30 17:39:08 pier Exp $ +// CVS $Id: wa.h,v 1.6 2000/12/06 11:20:33 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #ifndef _WA_H_ @@ -69,11 +69,20 @@ #include <string.h> #include <netdb.h> #include <errno.h> +#include <time.h> #include <sys/errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> +/* Our name and version */ +#ifndef WA_NAME +#define WA_NAME "WebApp" +#endif +#ifndef WA_VERSION +#define WA_VERSION "0.5-dev" +#endif + /* Define TRUE and FALSE */ #ifndef TRUE #define TRUE 1 @@ -94,7 +103,7 @@ typedef struct wa_provider wa_provider; typedef struct wa_header wa_header; typedef struct wa_request wa_request; -typedef struct wa_callbacks wa_callbacks; +typedef struct wa_callback wa_callback; /* Other includes from the webapp lib */ #include <wa_host.h> @@ -103,4 +112,33 @@ #include <wa_request.h> #include <wa_callback.h> +/* Function prototype declaration */ +// Initialize the webapp library and all connections. +void wa_init(wa_callback *); +// Reset the webapp library and all connections. +void wa_destroy(void); + +// #endif // ifdef _WA_H_ + +/* Where are the different servlet methods in our wa_request structure? + * (Comparison between methods, CGI variables and wa_request pointers + * + * c.getServerInfo() SERVER_SOFTWARE wa_callback->serverinfo() + * r.getProtocol() SERVER_PROTOCOL r->prot + * r.getMethod() REQUEST_METHOD r->meth + * r.getScheme() - r->schm + * r.getQueryString() QUERY_STRING r->args + * r.getPathInfo() PATH_INFO - + * r.getPathTranslated() PATH_TRANSLATED - + * r.getServletPath() SCRIPT_NAME - + * r.isSecure() - - + * r.getContentType() CONTENT_TYPE [header] + * r.getContentLength() CONTENT_LENGTH r->clen + * r.getServerName() SERVER_NAME r->name + * r.getServerPort() SERVER_PORT r->port + * r.getRemoteHost() REMOTE_HOST r->rhst + * r.getRemoteAddr() REMOTE_ADDR r->radr + * r.getRemoteUser() REMOTE_USER r->user + * r.getAuthType() AUTH_TYPE r->auth + */ 1.3 +247 -34 jakarta-tomcat-4.0/connectors/webapplib/wa_callback.c Index: wa_callback.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa_callback.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- wa_callback.c 2000/11/30 17:34:15 1.2 +++ wa_callback.c 2000/12/06 11:20:34 1.3 @@ -55,64 +55,277 @@ * * * ========================================================================= */ -// CVS $Id: wa_callback.c,v 1.2 2000/11/30 17:34:15 pier Exp $ +// CVS $Id: wa_callback.c,v 1.3 2000/12/06 11:20:34 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #include <wa.h> -// Allocate memory while processing a request. -void *wa_callback_alloc(wa_callbacks *c, wa_request *r, int size) { - return((*c->alloc)(r->data, size)); +/* The list of configured hosts */ +wa_callback *wa_callbacks=NULL; + +/** + * Add a component to the the current SERVER_SOFTWARE string and return the + * new value. + * + * @param component The new component to add to the SERVER_SOFTWARE string + * or NULL if no modification is necessary. + * @return The updated SERVER_SOFTWARE string. + */ +const char *wa_callback_serverinfo(const char *component) { + if (wa_callbacks==NULL) return("Unknown"); + return((*wa_callbacks->serverinfo)(component)); +} + +/** + * Log data on the web server log file. + * + * @param f The source file of this log entry. + * @param l The line number within the source file of this log entry. + * @param r The wa_request structure associated with the current request, + * or NULL. + * @param fmt The format string (printf style). + * @param ... All other parameters (if any) depending on the format. + */ +void wa_callback_log(const char *f,int l,wa_request *r,const char *fmt,...) { + va_list ap; + char buf[1024]; + int ret; + + if (wa_callbacks==NULL) return; + + va_start(ap,fmt); + ret=vsnprintf(buf,1024,fmt,ap); + if (ret<1) { + (*wa_callbacks->log)(WA_LOG,r,"Cannot format log message"); + } else if (ret>1023) { + (*wa_callbacks->log)(WA_LOG,r,"Log message too long"); + } else { + (*wa_callbacks->log)(f,l,r,buf); + } + va_end(ap); +} + +/** + * Log debugging informations data on the web server log file. + * + * @param f The source file of this log entry. + * @param l The line number within the source file of this log entry. + * @param r The wa_request structure associated with the current request, + * or NULL. + * @param fmt The format string (printf style). + * @param ... All other parameters (if any) depending on the format. + */ +void wa_callback_debug(const char *f,int l,wa_request *r,const char *fmt,...) { +#ifdef DEBUG + va_list ap; + char buf[1024]; + int ret; + + if (wa_callbacks==NULL) return; + + va_start(ap,fmt); + ret=vsnprintf(buf,1024,fmt,ap); + if (ret<1) { + wa_callback_log(WA_LOG,r,"[%s:%d] Cannot format log message",WA_LOG); + } else if (ret>1023) { + wa_callback_log(WA_LOG,r,"[%s:%d] Log message too long",WA_LOG); + } else { + wa_callback_log(f,l,r,"[%s:%d] %s",f,l,buf); + } + va_end(ap); +#endif +} + +/** + * Allocate memory while processing a request. (The memory allocated by + * this fuction must be released after the request is processed). + * + * @param r The request member associated with this call. + * @param size The size in bytes of the memory to allocate. + * @return A pointer to the allocated memory or NULL. + */ +void *wa_callback_alloc(wa_request *r, int size) { + if (wa_callbacks==NULL) return(NULL); + if (r==NULL) { + wa_callback_debug(WA_LOG,r,"Null wa_request member specified"); + return(NULL); + } + return((*wa_callbacks->alloc)(r, size)); } -// Read part of the request content. -int wa_callback_read(wa_callbacks *c, wa_request *r, char *buf, int size) { - return((*c->read)(r->data,buf,size)); +/** + * Read part of the request content. + * + * @param r The request member associated with this call. + * @param buf The buffer that will hold the data. + * @param size The buffer length. + * @return The number of bytes read, 0 on end of file or -1 on error. + */ +int wa_callback_read(wa_request *r, char *buf, int size) { + if (wa_callbacks==NULL) return(-1); + if (r==NULL) { + wa_callback_debug(WA_LOG,r,"Null wa_request member specified"); + return(-1); + } + return((*wa_callbacks->read)(r,buf,size)); } -// Set the HTTP response status code. -boolean wa_callback_setstatus(wa_callbacks *c, wa_request *r, int status) { - return((*c->setstatus)(r->data,status)); +/** + * Set the HTTP response status code. + * + * @param r The request member associated with this call. + * @param status The HTTP status code for the response. + * @return TRUE on success, FALSE otherwise + */ +boolean wa_callback_setstatus(wa_request *r, int status) { + if (wa_callbacks==NULL) return(FALSE); + if (r==NULL) { + wa_callback_debug(WA_LOG,r,"Null wa_request member specified"); + return(FALSE); + } + return((*wa_callbacks->setstatus)(r,status)); } -// Set the HTTP response mime content type. -boolean wa_callback_settype(wa_callbacks *c, wa_request *r, char *type) { - return((*c->settype)(r->data,type)); +/** + * Set the HTTP response mime content type. + * + * @param r The request member associated with this call. + * @param type The mime content type of the HTTP response. + * @return TRUE on success, FALSE otherwise + */ +boolean wa_callback_settype(wa_request *r, char *type) { + if (wa_callbacks==NULL) return(FALSE); + if (r==NULL) { + wa_callback_debug(WA_LOG,r,"Null wa_request member specified"); + return(FALSE); + } + return((*wa_callbacks->settype)(r,type)); } -// Set an HTTP mime header. -boolean wa_callback_setheader(wa_callbacks *c,wa_request *r,char *n,char *v) { - return((*c->setheader)(r->data,n,v)); +/** + * Set an HTTP mime header. + * + * @param r The request member associated with this call. + * @param n The mime header name. + * @param v The mime header value. + * @return TRUE on success, FALSE otherwise + */ +boolean wa_callback_setheader(wa_request *r, char *n, char *v) { + if (wa_callbacks==NULL) return(FALSE); + if (r==NULL) { + wa_callback_debug(WA_LOG,r,"Null wa_request member specified"); + return(FALSE); + } + return((*wa_callbacks->setheader)(r,n,v)); } + +/** + * Commit the first part of the response (status and headers). + * + * @param r The request member associated with this call. + * @return TRUE on success, FALSE otherwise + */ +boolean wa_callback_commit(wa_request *r) { + if (wa_callbacks==NULL) return(FALSE); + if (r==NULL) { + wa_callback_debug(WA_LOG,r,"Null wa_request member specified"); + return(FALSE); + } + return((*wa_callbacks->commit)(r)); +} -// Commit the first part of the response (status and headers). -boolean wa_callback_commit(wa_callbacks *c, wa_request *r) { - return((*c->commit)(r->data)); +/** + * Write part of the response data back to the client. + * + * @param r The request member associated with this call. + * @param buf The buffer containing the data to be written. + * @param len The number of characters to be written. + * @return The number of characters written to the client or -1 on error. + */ +int wa_callback_write(wa_request *r, char *buf, int size) { + if (wa_callbacks==NULL) return(-1); + if (r==NULL) { + wa_callback_debug(WA_LOG,r,"Null wa_request member specified"); + return(-1); + } + return((*wa_callbacks->write)(r,buf,size)); } -// Write part of the response data back to the client. -int wa_callback_write(wa_callbacks *c, wa_request *r, char *buf, int size) { - return((*c->write)(r->data,buf,size)); +/** + * Flush any unwritten response data to the client. + * + * @param r The request member associated with this call. + * @return TRUE on success, FALSE otherwise + */ +boolean wa_callback_flush(wa_request *r) { + if (wa_callbacks==NULL) return(FALSE); + if (r==NULL) { + wa_callback_debug(WA_LOG,r,"Null wa_request member specified"); + return(FALSE); + } + return((*wa_callbacks->flush)(r)); } -// Write part of the response data back to the client. -int wa_callback_printf(wa_callbacks *c, wa_request *r, const char *fmt, ...) { +/** + * Print a message back to the client using the printf standard. + * + * @param r The request member associated with this call. + * @param fmt The format string (printf style). + * @param ... All other parameters (if any) depending on the format. + * @return The number of characters written to the client or -1 on error. + */ +int wa_callback_printf(wa_request *r, const char *fmt, ...) { va_list ap; - char buf[1024]; + char *buf=NULL; int ret; + if (wa_callbacks==NULL) return(-1); + if (r==NULL) { + wa_callback_debug(WA_LOG,r,"Null wa_request member specified"); + return(FALSE); + } + + // Allocate some data for the buffer + buf=(char *)(*wa_callbacks->alloc)(r,1024*sizeof(char)); + if (buf==NULL) { + wa_callback_debug(WA_LOG,r,"Cannot allocate buffer"); + return(-1); + } + + // Check if we can write some data. + if (wa_callbacks==NULL) { + return(-1); + } + + // Try to fill our buffer with printf data va_start(ap,fmt); ret=vsnprintf(buf,1024,fmt,ap); - va_end(ap); - if (ret<0) return(-1); + // If vsnprintf returned null, we weren't able to format the message + if (ret<0) { + wa_callback_log(WA_LOG,r,"Cannot format message"); + va_end(ap); + return(-1); + + // If vsnprintf is greater than 1024 the buffer was too small + } else if (ret>1024) { + // Reallocate the buffer for the bigger message and check if we were + // able to print the message. + buf=(char *)(*wa_callbacks->alloc)(r,(ret+1)*sizeof(char)); + if (buf==NULL) { + va_end(ap); + wa_callback_debug(WA_LOG,r,"Cannot allocate buffer"); + return(-1); + } + ret=vsnprintf(buf,ret+1,fmt,ap); + if (ret<0) { + wa_callback_log(WA_LOG,r,"Cannot format message"); + va_end(ap); + return(-1); + } + } - return(wa_callback_write(c,r,buf,ret)); -} - -// Flush any unwritten response data to the client. -boolean wa_callback_flush(wa_callbacks *c, wa_request *r) { - return((*c->flush)(r->data)); + va_end(ap); + return(wa_callback_write(r,buf,ret)); } - 1.2 +56 -35 jakarta-tomcat-4.0/connectors/webapplib/wa_callback.h Index: wa_callback.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa_callback.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- wa_callback.h 2000/11/27 12:48:09 1.1 +++ wa_callback.h 2000/12/06 11:20:35 1.2 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -// CVS $Id: wa_callback.h,v 1.1 2000/11/27 12:48:09 pier Exp $ +// CVS $Id: wa_callback.h,v 1.2 2000/12/06 11:20:35 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #ifndef _WA_CALLBACK_H_ @@ -65,109 +65,130 @@ * The wa_callbacks structure contains function pointers for callbacks to the * web server. */ -struct wa_callbacks { +struct wa_callback { /** + * Add a component to the the current SERVER_SOFTWARE string and return the + * new value. + * + * @param component The new component to add to the SERVER_SOFTWARE string + * or NULL if no modification is necessary. + * @return The updated SERVER_SOFTWARE string. + */ + const char *(*serverinfo)(const char *component); + + /** * Log data on the web server log file. * - * @param file The source file of this log entry. - * @param line The line number within the source file of this log entry. - * @param data The web-server specific data (wa_request->data). - * @param fmt The format string (printf style). - * @param ... All other parameters (if any) depending on the format. + * @param f The source file of this log entry. + * @param l The line number within the source file of this log entry. + * @param r The wa_request structure associated with the current request, + * or NULL. + * @param msg The message to be logged. */ - void (*log)(void *data, const char *file, int line, const char *fmt, ...); + void (*log)(const char *f, int l, wa_request *r, char *msg); /** - * Allocate memory while processing a request. + * Allocate memory while processing a request. (The memory allocated by + * this fuction must be released after the request is processed). * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @param size The size in bytes of the memory to allocate. * @return A pointer to the allocated memory or NULL. */ - void *(*alloc)(void *data, int size); + void *(*alloc)(wa_request *req, int size); /** * Read part of the request content. * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @param buf The buffer that will hold the data. * @param len The buffer length. * @return The number of bytes read, 0 on end of file or -1 on error. */ - int (*read)(void *data, char *buf, int len); + int (*read)(wa_request *req, char *buf, int len); /** * Set the HTTP response status code. * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @param status The HTTP status code for the response. * @return TRUE on success, FALSE otherwise */ - boolean (*setstatus)(void *data, int status); + boolean (*setstatus)(wa_request *req, int status); /** * Set the HTTP response mime content type. * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @param type The mime content type of the HTTP response. * @return TRUE on success, FALSE otherwise */ - boolean (*settype)(void *data, char *type); + boolean (*settype)(wa_request *req, char *type); /** * Set an HTTP mime header. * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @param name The mime header name. * @param value The mime header value. * @return TRUE on success, FALSE otherwise */ - boolean (*setheader)(void *data, char *name, char *value); + boolean (*setheader)(wa_request *req, char *name, char *value); /** * Commit the first part of the response (status and headers). * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @return TRUE on success, FALSE otherwise */ - boolean (*commit)(void *data); + boolean (*commit)(wa_request *req); /** * Write part of the response data back to the client. * - * @param buf The buffer holding the data to be written. + * @param req The request member associated with this call. + * @param buf The buffer containing the data to be written. * @param len The number of characters to be written. * @return The number of characters written to the client or -1 on error. */ - int (*write)(void *data, char *buf, int len); + int (*write)(wa_request *req, char *buf, int len); /** * Flush any unwritten response data to the client. * - * @param data The web-server specific data (wa_request->data). + * @param req The request member associated with this call. * @return TRUE on success, FALSE otherwise */ - boolean (*flush)(void *); + boolean (*flush)(wa_request *req); }; +/* The list of configured hosts */ +extern wa_callback *wa_callbacks; + /* Function prototype declaration */ +// Add a component to the the current SERVER_SOFTWARE string. +const char *wa_callback_serverinfo(const char *); +// Log data on the web server log file. +void wa_callback_log(const char *, int, wa_request *, const char *, ...); +// Log debugging informations data on the web server log file. +void wa_callback_debug(const char * ,int, wa_request *, const char *, ...); // Allocate memory while processing a request. -void *wa_callback_alloc(wa_callbacks *, wa_request *, int); +void *wa_callback_alloc(wa_request *, int); // Read part of the request content. -int wa_callback_read(wa_callbacks *, wa_request *, char *, int); +int wa_callback_read(wa_request *, char *, int); // Set the HTTP response status code. -boolean wa_callback_setstatus(wa_callbacks *, wa_request *, int); +boolean wa_callback_setstatus(wa_request *, int); // Set the HTTP response mime content type. -boolean wa_callback_settype(wa_callbacks *, wa_request *, char *); +boolean wa_callback_settype(wa_request *, char *); // Set an HTTP mime header. -boolean wa_callback_setheader(wa_callbacks *, wa_request *, char *, char *); +boolean wa_callback_setheader(wa_request *, char *, char *); // Commit the first part of the response (status and headers). -boolean wa_callback_commit(wa_callbacks *, wa_request *); -// Write part of the response data back to the client. -int wa_callback_write(wa_callbacks *, wa_request *, char *, int); +boolean wa_callback_commit(wa_request *); // Write part of the response data back to the client. -int wa_callback_printf(wa_callbacks *, wa_request *, const char *, ...); +int wa_callback_write(wa_request *, char *, int); // Flush any unwritten response data to the client. -boolean wa_callback_flush(wa_callbacks *, wa_request *); +boolean wa_callback_flush(wa_request *); +// Print a message back to the client using the printf standard. +int wa_callback_printf(wa_request *, const char *, ...); #endif // ifdef _WA_CALLBACK_H_ 1.3 +1 -28 jakarta-tomcat-4.0/connectors/webapplib/wa_connection.c Index: wa_connection.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa_connection.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- wa_connection.c 2000/11/27 03:49:15 1.2 +++ wa_connection.c 2000/12/06 11:20:37 1.3 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -// CVS $Id: wa_connection.c,v 1.2 2000/11/27 03:49:15 pier Exp $ +// CVS $Id: wa_connection.c,v 1.3 2000/12/06 11:20:37 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #include <wa.h> @@ -134,30 +134,3 @@ // No host found, sorry! return(NULL); } - -/** - * Initialize all configured connections. - */ -void wa_connection_init(void) { - wa_connection *curr=wa_connections; - - // Iterate thru our hosts chain - while(curr!=NULL) { - (*curr->prov->init)(curr); - curr=curr->next; - } -} - -/** - * Initialize all configured connections. - */ -void wa_connection_destroy(void) { - wa_connection *curr=wa_connections; - - // Iterate thru our hosts chain - while(curr!=NULL) { - (*curr->prov->destroy)(curr); - curr=curr->next; - } -} - 1.3 +1 -5 jakarta-tomcat-4.0/connectors/webapplib/wa_connection.h Index: wa_connection.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa_connection.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- wa_connection.h 2000/11/27 03:49:17 1.2 +++ wa_connection.h 2000/12/06 11:20:37 1.3 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -// CVS $Id: wa_connection.h,v 1.2 2000/11/27 03:49:17 pier Exp $ +// CVS $Id: wa_connection.h,v 1.3 2000/12/06 11:20:37 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #ifndef _WA_CONNECTION_H_ @@ -79,9 +79,5 @@ const char *wa_connection_create(char *, char *, char *); // Get a specific webapp connection. wa_connection *wa_connection_get(char *); -// Initialize all configured connections. -void wa_connection_init(void); -// Initialize all configured connections. -void wa_connection_destroy(void); #endif // ifdef _WA_CONNECTION_H_ 1.5 +2 -1 jakarta-tomcat-4.0/connectors/webapplib/wa_host.c Index: wa_host.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa_host.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- wa_host.c 2000/11/30 16:20:54 1.4 +++ wa_host.c 2000/12/06 11:20:39 1.5 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -// CVS $Id: wa_host.c,v 1.4 2000/11/30 16:20:54 pier Exp $ +// CVS $Id: wa_host.c,v 1.5 2000/12/06 11:20:39 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #include <wa.h> @@ -160,6 +160,7 @@ appl->name=strdup(name); appl->conn=conn; appl->conf=NULL; + appl->next=NULL; // Check for leading/trailing slashes. Set slashes to 1 if the leading // slash is missing, to 2 if the trailing one is missing or to 3 in case 1.4 +2 -3 jakarta-tomcat-4.0/connectors/webapplib/wa_provider.c Index: wa_provider.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa_provider.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- wa_provider.c 2000/11/29 12:27:02 1.3 +++ wa_provider.c 2000/12/06 11:20:40 1.4 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -// CVS $Id: wa_provider.c,v 1.3 2000/11/29 12:27:02 pier Exp $ +// CVS $Id: wa_provider.c,v 1.4 2000/12/06 11:20:40 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #include <wa.h> @@ -82,7 +82,6 @@ /* The list of all compiled in providers */ wa_provider *wa_providers[] = { &wa_provider_info, - &wa_provider_warp, +// &wa_provider_warp, NULL, }; - 1.6 +58 -16 jakarta-tomcat-4.0/connectors/webapplib/wa_provider.h Index: wa_provider.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa_provider.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- wa_provider.h 2000/11/30 16:20:54 1.5 +++ wa_provider.h 2000/12/06 11:20:41 1.6 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -// CVS $Id: wa_provider.h,v 1.5 2000/11/30 16:20:54 pier Exp $ +// CVS $Id: wa_provider.h,v 1.6 2000/12/06 11:20:41 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #ifndef _WA_PROVIDER_H_ @@ -65,20 +65,62 @@ * The wa_provider structure describes a connection provider. */ struct wa_provider { - // The name of the current provider + /** + * The name of this provider. + */ const char *name; - // Configure a connection - const char *(*configure) (wa_connection *, char *); - // Initialize a connection - void (*init) (wa_connection *); - // Clean up a connection - void (*destroy) (wa_connection *); - // Handle an HTTP request - void (*handle) (wa_request *, wa_callbacks *); - // Get a descriptive string on a connection (based on wa_connection->conf) - int (*conninfo) (wa_connection *, char *, int); - // Get a descriptive string on a connection (based on wa_application->conf) - int (*applinfo) (wa_application *, char *, int); + + /** + * Configure a connection with the parameter from the web server + * configuration file. + * + * @param conn The connection to configure. + * @param param The extra parameter from web server configuration. + * @return An error message or NULL. + */ + const char *(*configure) (wa_connection *conn, char *param); + + /** + * Initialize a connection. + * + * @param conn The connection to initialize. + */ + const char *(*init) (wa_connection *conn); + + /** + * Destroys a connection. + * + * @param conn The connection to destroy. + */ + const char *(*destroy) (wa_connection *conn); + + /** + * Describe the configuration member found in a connection. + * + * @param conn The connection for wich a description must be produced. + * @param buf The buffer where the description must be stored. + * @param len The buffer length. + * @return The number of bytes written to the buffer (terminator included). + */ + int (*conninfo) (wa_connection *conn, char *buf, int len); + + /** + * Describe the configuration member found in a web application. + * + * @param appl The application for wich a description must be produced. + * @param buf The buffer where the description must be stored. + * @param len The buffer length. + * @return The number of bytes written to the buffer (terminator included). + */ + int (*applinfo) (wa_application *appl, char *buf, int len); + + + /** + * Handle a connection from the web server. + * + * @param req The request data. + */ + void (*handle) (wa_request *req); }; /* The list of all compiled in providers */ @@ -86,10 +128,10 @@ /* Pointers to the different providers */ extern wa_provider wa_provider_info; -extern wa_provider wa_provider_warp; +//extern wa_provider wa_provider_warp; /* Function prototype declaration */ // Retrieve a provider. wa_provider *wa_provider_get(char *); -#endif // ifndef _WA_PROVIDER_H_ \ No newline at end of file +#endif // ifndef _WA_PROVIDER_H_ 1.7 +133 -70 jakarta-tomcat-4.0/connectors/webapplib/wa_provider_info.c Index: wa_provider_info.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa_provider_info.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- wa_provider_info.c 2000/11/30 17:34:15 1.6 +++ wa_provider_info.c 2000/12/06 11:20:43 1.7 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -// CVS $Id: wa_provider_info.c,v 1.6 2000/11/30 17:34:15 pier Exp $ +// CVS $Id: wa_provider_info.c,v 1.7 2000/12/06 11:20:43 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #include <wa.h> @@ -70,12 +70,30 @@ */ static const char *wa_info_configure(wa_connection *conn, char *param) { if(conn==NULL) return("Connection not specified"); - if (param==NULL) conn->conf=strdup("[No data supplied]"); + if (param==NULL) conn->conf=NULL; else conn->conf=strdup(param); return(NULL); } /** + * Initialize a connection. + * + * @param conn The connection to initialize. + */ +static const char *wa_info_init(wa_connection *conn) { + return(NULL); +} + +/** + * Destroys a connection. + * + * @param conn The connection to destroy. + */ +static const char *wa_info_destroy(wa_connection *conn) { + return(NULL); +} + +/** * Describe the configuration member found in a connection. * * @param conn The connection for wich a description must be produced. @@ -86,9 +104,11 @@ static int wa_info_conninfo(wa_connection *conn, char *buf, int len) { int x=0; char *msg="Null connection specified\0"; + return(0); if ((buf==NULL)||(len==0)) return(0); if(conn!=NULL) msg=(char *)conn->conf; + if (msg==NULL) msg="No extra parameters specified for this connection\0"; // Copy the message string in the buffer and return for (x=0; x<len; x++) { @@ -112,118 +132,161 @@ } /** - * Initialize a connection. - * - * @param conn The connection to initialize. - */ -static void wa_info_init(wa_connection *conn) { - return; -} - -/** - * Destroys a connection. - * - * @param conn The connection to destroy. - */ -static void wa_info_destroy(wa_connection *conn) { - return; -} - -/** * Handle a connection from the web server. * * @param req The request data. - * @param cb The web-server callback information. */ -void wa_info_handle(wa_request *req, wa_callbacks *cb) { +void wa_info_handle(wa_request *req) { int x=0; + int ret=0; + char *buf; + time_t t=0; + char *ts=NULL; wa_connection *conn=wa_connections; wa_host *host=wa_hosts; - wa_callback_setstatus(cb,req,200); - wa_callback_settype(cb,req,"text/html"); - wa_callback_commit(cb,req); - wa_callback_printf(cb,req,"<html>\n"); - wa_callback_printf(cb,req," <head>\n"); - wa_callback_printf(cb,req," <title>mod_webapp: status</title>\n"); - wa_callback_printf(cb,req," </head>\n"); - wa_callback_printf(cb,req," <body>\n"); + time(&t); + ts=ctime(&t); + if (ts==NULL) ts=strdup("[Unknown generation time]"); + else ts[24]='\0'; + + wa_callback_setstatus(req,200); + wa_callback_settype(req,"text/html"); + wa_callback_commit(req); + wa_callback_printf(req,"<html>\n"); + wa_callback_printf(req," <head>\n"); + wa_callback_printf(req," <title>mod_webapp: status</title>\n"); + wa_callback_printf(req," </head>\n"); + wa_callback_printf(req," <body>\n"); + wa_callback_printf(req," <form action=\"%s://%s:%d%s\"",req->schm, + req->name,req->port,req->ruri); + wa_callback_printf(req," method=\"post\">\n"); + wa_callback_printf(req," <input type=\"submit\" value=\"Refresh\">\n"); + wa_callback_printf(req," <input type=\"hidden\" name=\"lastcall\""); + wa_callback_printf(req," value=\"%s\">\n",ts); + wa_callback_printf(req," Generated on %s<br>\n",ts); + wa_callback_printf(req," </form>\n"); + free(ts); + wa_callback_flush(req); + wa_callback_printf(req," <dl>\n"); + wa_callback_printf(req," <dt><b>Connections:</b></dt>\n"); // Dump configured connections while (conn!=NULL) { char desc[1024]; - wa_callback_printf(cb,req," <dl>\n"); - wa_callback_printf(cb,req," <dt><b>Connection: %s</b></dt>\n", - conn->name); - wa_callback_printf(cb,req," <dd>\n"); - wa_callback_printf(cb,req," Provider "%s"\n", - conn->prov->name); + wa_callback_printf(req," <dd>\n"); + wa_callback_printf(req," Connection "%s"\n",conn->name); + wa_callback_printf(req," Prov. "%s"\n",conn->prov->name); if ((*conn->prov->conninfo)(conn,desc,1024)>0) - wa_callback_printf(cb,req," (Descr.: "%s")\n",desc); + wa_callback_printf(req," (%s)\n",desc); else - wa_callback_printf(cb,req," (No description available)\n"); - wa_callback_printf(cb,req," </dd>\n"); + wa_callback_printf(req," [No description available]\n"); + wa_callback_printf(req," </dd>\n"); + wa_callback_flush(req); conn=conn->next; - wa_callback_printf(cb,req," </dl>\n"); } - + wa_callback_printf(req," </dl>\n"); + wa_callback_flush(req); // Dump configured hosts and applications while (host!=NULL) { wa_application *appl=host->apps; - wa_callback_printf(cb,req," <dl>\n"); - wa_callback_printf(cb,req," <dt><b>Host: %s:%d</b></dt>\n", + wa_callback_printf(req," <dl>\n"); + wa_callback_printf(req," <dt><b>Host: %s:%d</b></dt>\n", host->name,host->port); + wa_callback_printf(req," <dd>\n"); while (appl!=NULL) { char d[1024]; - wa_callback_printf(cb,req," <dd>\n"); - wa_callback_printf(cb,req," Application "%s"\n", + wa_callback_printf(req," Application "%s"\n", appl->name); - wa_callback_printf(cb,req," mounted under "%s"\n", + wa_callback_printf(req," mounted under "%s"\n", appl->path); - wa_callback_printf(cb,req," using connection "%s"\n", + wa_callback_printf(req," using connection "%s"\n", appl->conn->name); + wa_callback_flush(req); // Get provider specific description of the application if ((*appl->conn->prov->applinfo)(appl,d,1024)>0) - wa_callback_printf(cb,req," (Descr.: "%s")\n",d); + wa_callback_printf(req," (%s)\n",d); else - wa_callback_printf(cb,req," (No description available)\n"); + wa_callback_printf(req," [No description available]\n"); - wa_callback_printf(cb,req," </dd>\n"); + wa_callback_printf(req," </dd>\n"); + wa_callback_flush(req); appl=appl->next; } + wa_callback_printf(req," </dl>\n"); + wa_callback_flush(req); host=host->next; - wa_callback_printf(cb,req," </dl>\n"); } + wa_callback_flush(req); // Dump the first line of the request - wa_callback_printf(cb,req," <dl>\n"); - wa_callback_printf(cb,req," <dt><b>This request:</b></dt>\n"); - wa_callback_printf(cb,req," <dd>\n"); - wa_callback_printf(cb,req," <code>\n"); - wa_callback_printf(cb,req," %s",req->meth); - wa_callback_printf(cb,req," %s",req->ruri); - if (req->args!=NULL) wa_callback_printf(cb,req,"?%s",req->args); - wa_callback_printf(cb,req," %s<br>\n",req->prot); - - // Dump the first line of the request - for (x=0; x<req->hnum; x++) - wa_callback_printf(cb,req," %s: %s<br>",req->hnam[x], + wa_callback_printf(req," <dl>\n"); + wa_callback_printf(req," <dt><b>This Request (%d bytes):</b></dt>\n", + req->clen); + wa_callback_printf(req," <dd>\n"); + wa_callback_printf(req," Request URI: "%s://%s:%d%s", + req->schm,req->name,req->port,req->ruri); + if (req->args==NULL) wa_callback_printf(req,""<br>\n"); + else wa_callback_printf(req,"?%s"<br>\n",req->args); + wa_callback_printf(req," Configured Host: "%s:%d"<br>\n", + req->host->name,req->host->port); + wa_callback_printf(req," Requested Host: "%s:%d"<br>\n", + req->name,req->port); + wa_callback_printf(req," Remote Host: "%s"<br>\n", + req->rhst==NULL?"[NULL]":req->rhst); + wa_callback_printf(req," Remote Address: "%s"<br>\n", + req->radr==NULL?"[NULL]":req->radr); + wa_callback_printf(req," Remote User: "%s"<br>\n", + req->user==NULL?"[NULL]":req->user); + wa_callback_printf(req," Authentication Method: "%s"<br>\n", + req->auth==NULL?"[NULL]":req->auth); + wa_callback_printf(req," <br>\n"); + wa_callback_printf(req," <code>\n"); + wa_callback_printf(req," %s",req->meth); + wa_callback_printf(req," %s",req->ruri); + if (req->args!=NULL) wa_callback_printf(req,"?%s",req->args); + wa_callback_printf(req," %s<br>\n",req->prot); + wa_callback_printf(req," <br>\n"); + wa_callback_flush(req); + + // Dump the request headers + for (x=0; x<req->hnum; x++) { + wa_callback_printf(req," %s: %s<br>\n",req->hnam[x], req->hval[x]); + } + wa_callback_flush(req); + // Dump the request body + wa_callback_printf(req," </code>\n"); + if (req->clen>0) { + wa_callback_printf(req,"<pre>\n"); + buf=(char *)wa_callback_alloc(req,1024*sizeof(char)); + ret=1; + while (ret>0) { + ret=wa_callback_read(req,buf,1024); + if (ret>0) { + wa_callback_write(req,buf,ret); + wa_callback_flush(req); + } else if (ret<0) { + wa_callback_printf(req,">\n<b>TRANSFER INTERRUPTED</b>\n"); + } + } + wa_callback_printf(req,"\n</pre>\n"); + } + // Finish the request dump - wa_callback_printf(cb,req," </code>\n"); - wa_callback_printf(cb,req," </dd>\n"); - wa_callback_printf(cb,req," </dl>\n"); + wa_callback_printf(req," </dd>\n"); + wa_callback_printf(req," </dl>\n"); // Finish the page - wa_callback_printf(cb,req," </body>\n"); - wa_callback_printf(cb,req,"<html>\n"); - wa_callback_flush(cb,req); + wa_callback_printf(req," </body>\n"); + wa_callback_printf(req,"<html>\n"); + wa_callback_flush(req); } /** WebAppLib plugin description. */ @@ -232,7 +295,7 @@ wa_info_configure, wa_info_init, wa_info_destroy, - wa_info_handle, wa_info_conninfo, wa_info_applinfo, + wa_info_handle, }; 1.5 +8 -8 jakarta-tomcat-4.0/connectors/webapplib/wa_provider_warp.c Index: wa_provider_warp.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa_provider_warp.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- wa_provider_warp.c 2000/11/30 21:58:59 1.4 +++ wa_provider_warp.c 2000/12/06 11:20:44 1.5 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -// CVS $Id: wa_provider_warp.c,v 1.4 2000/11/30 21:58:59 pier Exp $ +// CVS $Id: wa_provider_warp.c,v 1.5 2000/12/06 11:20:44 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #include <wa.h> @@ -581,11 +581,11 @@ const char *fmt, ...) { char buf[1024]; va_list ap; - + va_start(ap,fmt); vsprintf(buf,fmt,ap); va_end(ap); - + wa_callback_setstatus(cb,req,500); wa_callback_settype(cb,req,"text/html"); wa_callback_commit(cb,req); @@ -600,8 +600,8 @@ wa_callback_printf(cb,req,"</html>\n"); wa_callback_flush(cb,req); return; -} - +} + /** * Handle a connection from the web server. * @@ -662,19 +662,19 @@ } rid=wa_warp_packet_get_short(in); wa_warp_packet_free(in); - + // Send the request method wa_warp_packet_reset(out); out->typ=TYP_REQINIT_MET; wa_warp_packet_set_string(out,req->meth); wa_warp_send(cc,rid,out); - + // Send the request URI wa_warp_packet_reset(out); out->typ=TYP_REQINIT_URI; wa_warp_packet_set_string(out,req->ruri); wa_warp_send(cc,rid,out); - + // Send the request arguments wa_warp_packet_reset(out); out->typ=TYP_REQINIT_ARG; 1.4 +19 -12 jakarta-tomcat-4.0/connectors/webapplib/wa_request.c Index: wa_request.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa_request.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- wa_request.c 2000/11/29 12:23:07 1.3 +++ wa_request.c 2000/12/06 11:20:47 1.4 @@ -55,22 +55,29 @@ * * * ========================================================================= */ -// CVS $Id: wa_request.c,v 1.3 2000/11/29 12:23:07 pier Exp $ +// CVS $Id: wa_request.c,v 1.4 2000/12/06 11:20:47 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #include <wa.h> -/* Function prototype declaration */ -// Handle a request. -const char *wa_request_handle(wa_request *req, wa_callbacks *cb) { - if (cb==NULL) return("Callback structure pointer is NULL"); - if (req==NULL) return("Request structure pointer is NULL"); - if (req->host==NULL) return("Web application host is NULL"); - if (req->appl==NULL) return("Web application structure is NULL"); - if (req->meth==NULL) return("Request method is NULL"); - if (req->ruri==NULL) return("Request URI is NULL "); - if (req->prot==NULL) return("Request protocol is NULL"); +/** + * Handle a request. + * + * @param r The wa_request structure describing the current request. + * @return An error message if something went wrong or NULL. + */ +const char *wa_request_handle(wa_request *r) { + // Primary parameter check + if (wa_callbacks==NULL) return("WebApp library not initialized"); + if (r==NULL) return("Request structure pointer is NULL"); + if (r->host==NULL) return("Web application host is NULL"); + if (r->appl==NULL) return("Web application structure is NULL"); + if (r->meth==NULL) return("Request method is NULL"); + if (r->ruri==NULL) return("Request URI is NULL "); + if (r->prot==NULL) return("Request protocol is NULL"); - (*req->appl->conn->prov->handle)(req,cb); + wa_callback_debug(WA_LOG,r,"Dispatching for %s%s to provider %s", + r->host->name,r->ruri,r->appl->conn->prov->name); + (*r->appl->conn->prov->handle)(r); return(NULL); } 1.4 +11 -2 jakarta-tomcat-4.0/connectors/webapplib/wa_request.h Index: wa_request.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/connectors/webapplib/wa_request.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- wa_request.h 2000/11/29 12:23:09 1.3 +++ wa_request.h 2000/12/06 11:20:49 1.4 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -// CVS $Id: wa_request.h,v 1.3 2000/11/29 12:23:09 pier Exp $ +// CVS $Id: wa_request.h,v 1.4 2000/12/06 11:20:49 pier Exp $ // Author: Pier Fumagalli <mailto:[EMAIL PROTECTED]> #ifndef _WA_REQUEST_H_ @@ -72,6 +72,15 @@ char *ruri; // The HTTP URI requested char *args; // The HTTP query arguments char *prot; // The HTTP protocol (HTTP/1.0, HTTP/1.1) + char *schm; // The HTTP scheme info (http, https) + char *name; // The requested name of the server + int port; // The requested port of the server + char *rhst; // The remote client host name + char *radr; // The remote client address + char *user; // The user name, if authenticated by the web server + char *auth; // The authentication metod used by the web server + long clen; // The Content-Length of the request + long rlen; // The number of bytes read out of this request int hnum; // The number of headers in this request char **hnam; // The array of header names char **hval; // The array of header values @@ -79,6 +88,6 @@ /* Function prototype declaration */ // Handle a request. -const char *wa_request_handle(wa_request *, wa_callbacks *); +const char *wa_request_handle(wa_request *); #endif // ifdef _WA_HOST_H_