You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by pi...@locus.apache.org on 2000/11/30 20:54:11 UTC
cvs commit: jakarta-tomcat-4.0/connectors/webapplib wa_provider_warp.c
pier 00/11/30 11:54:10
Modified: connectors/webapplib wa_provider_warp.c
Log:
Initial request handling. Error handling and recovery (when the server restarts
the web server must not be restarted).
Revision Changes Path
1.3 +86 -28 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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- wa_provider_warp.c 2000/11/30 17:34:15 1.2
+++ wa_provider_warp.c 2000/11/30 19:54:08 1.3
@@ -55,7 +55,7 @@
* *
* ========================================================================= */
-// CVS $Id: wa_provider_warp.c,v 1.2 2000/11/30 17:34:15 pier Exp $
+// CVS $Id: wa_provider_warp.c,v 1.3 2000/11/30 19:54:08 pier Exp $
// Author: Pier Fumagalli <ma...@eng.sun.com>
#include <wa.h>
@@ -559,36 +559,93 @@
wa_warp_close(conf,"Normal shutdown");
}
+static void wa_warp_handle_error(wa_request *req, wa_callbacks *cb,
+ 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);
+ wa_callback_printf(cb,req,"<html>\n");
+ wa_callback_printf(cb,req," <head>\n");
+ wa_callback_printf(cb,req," <title>mod_webapp(warp) error</title>\n");
+ wa_callback_printf(cb,req," </head>\n");
+ wa_callback_printf(cb,req," <body>\n");
+ wa_callback_printf(cb,req," <h2>mod_webapp(warp) error</h2>\n");
+ wa_callback_printf(cb,req," %s\n",buf);
+ wa_callback_printf(cb,req," </body>\n");
+ wa_callback_printf(cb,req,"</html>\n");
+ wa_callback_flush(cb,req);
+ return;
+}
+
/**
* Handle a connection from the web server.
*
* @param req The request data.
* @param cb The web-server callback information.
*/
-void wa_warp_handle(wa_request *req, wa_callbacks *cb) {
- wa_warp_conn_config *conf=NULL;
+static void wa_warp_handle(wa_request *req, wa_callbacks *cb) {
+ wa_warp_conn_config *cc=NULL;
+ wa_warp_appl_config *ac=NULL;
+ wa_warp_packet *in=NULL;
+ wa_warp_packet *out=NULL;
+ int rid=0;
+
+ cc=(wa_warp_conn_config *)req->appl->conn->conf;
+ ac=(wa_warp_appl_config *)req->appl->conf;
+ // If we're not connected, let's try to connect
+ if (cc->sock<0) wa_warp_init(req->appl->conn);
+ if (cc->sock<0) {
+ wa_warp_handle_error(req,cb,
+ "Unable to connect (%d) to Host: %s (%d.%d.%d.%d) Port: %d\n",
+ cc->sock, cc->name, (int)((cc->addr>>0)&0x0ff),
+ (int)((cc->addr>>8)&0x0ff), (int)((cc->addr>>16)&0x0ff),
+ (int)((cc->addr>>24)&0x0ff), cc->port);
+ return;
+ }
+
+ // We are connected... Let's give it a try.
+ out=wa_warp_packet_create(4096);
+
+ // Let's start requesting the RID for this request.
+ out->typ=TYP_REQUEST;
+ wa_warp_packet_set_short(out,ac->host);
+ wa_warp_packet_set_short(out,ac->appl);
+ if (!wa_warp_send(cc,RID_CONNECTION,out)) {
+ wa_warp_packet_free(out);
+ wa_warp_close(cc, "Cannot send RID request");
+ wa_warp_handle_error(req,cb,"Cannot send RID request");
+ return;
+ }
+ wa_warp_packet_reset(out);
- conf=(wa_warp_conn_config *)req->appl->conn->conf;
- if (conf->sock<0) {
- wa_callback_setstatus(cb,req,500);
- 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(warp) error</title>\n");
- wa_callback_printf(cb,req," </head>\n");
- wa_callback_printf(cb,req," <body>\n");
- wa_callback_printf(cb,req," <h2>mod_webapp(warp) error</h2>\n");
- wa_callback_printf(cb,req," Unable to connect (%d) to\n", conf->sock);
- wa_callback_printf(cb,req," Host: %s (%d.%d.%d.%d) Port: %d\n",
- conf->name, (int)((conf->addr>>0)&0x0ff),
- (int)((conf->addr>>8)&0x0ff), (int)((conf->addr>>16)&0x0ff),
- (int)((conf->addr>>24)&0x0ff), conf->port);
- wa_callback_printf(cb,req," </body>\n");
- wa_callback_printf(cb,req,"</html>\n");
- wa_callback_flush(cb,req);
+ // Retrieve the packet containing our RID
+ in=wa_warp_recv(cc,RID_CONNECTION);
+ if (in==NULL) {
+ wa_warp_packet_free(out);
+ wa_warp_close(cc, "Cannot retrieve request RID");
+ wa_warp_handle_error(req,cb,"Cannot retrieve request RID");
+ return;
+ }
+ // Check if we got the right packet
+ if (in->typ!=TYP_REQUEST_ID) {
+ wa_warp_packet_free(out);
+ wa_warp_packet_free(in);
+ wa_warp_close(cc, "Cannot retrieve request RID (TYP)");
+ wa_warp_handle_error(req,cb,"Cannot retrieve request RID (TYP)");
return;
}
+ rid=wa_warp_packet_get_short(in);
+ wa_warp_packet_free(in);
+
+
+
wa_callback_setstatus(cb,req,200);
wa_callback_settype(cb,req,"text/html");
wa_callback_commit(cb,req);
@@ -597,12 +654,13 @@
wa_callback_printf(cb,req," <title>mod_webapp(warp) error</title>\n");
wa_callback_printf(cb,req," </head>\n");
wa_callback_printf(cb,req," <body>\n");
- wa_callback_printf(cb,req," <h2>mod_webapp(warp) error</h2>\n");
- wa_callback_printf(cb,req," Connected (socket=%d) to\n", conf->sock);
- wa_callback_printf(cb,req," Host: %s (%d.%d.%d.%d) Port: %d\n",
- conf->name, (int)((conf->addr>>0)&0x0ff),
- (int)((conf->addr>>8)&0x0ff), (int)((conf->addr>>16)&0x0ff),
- (int)((conf->addr>>24)&0x0ff), conf->port);
+ wa_callback_printf(cb,req," <h2>mod_webapp(warp) request</h2>\n");
+ wa_callback_printf(cb,req," Connected (socket=%d) to\n", cc->sock);
+ wa_callback_printf(cb,req," Host: %s (%d.%d.%d.%d) Port: %d<br>\n",
+ cc->name, (int)((cc->addr>>0)&0x0ff),
+ (int)((cc->addr>>8)&0x0ff), (int)((cc->addr>>16)&0x0ff),
+ (int)((cc->addr>>24)&0x0ff), cc->port);
+ wa_callback_printf(cb,req," Received Request ID: %d<br>\n",rid);
wa_callback_printf(cb,req," </body>\n");
wa_callback_printf(cb,req,"</html>\n");
wa_callback_flush(cb,req);