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);