sanjaya     2003/07/23 23:53:23

  Modified:    c/src/server/apache mod_axis.c
  Log:
  implemented new transport module api
  
  Revision  Changes    Path
  1.2       +87 -50    xml-axis/c/src/server/apache/mod_axis.c
  
  Index: mod_axis.c
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/server/apache/mod_axis.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- mod_axis.c        25 Jun 2003 06:09:12 -0000      1.1
  +++ mod_axis.c        24 Jul 2003 06:53:23 -0000      1.2
  @@ -1,68 +1,101 @@
  +/*
   #include "httpd.h"
   #include "http_config.h"
   #include "http_core.h"
   #include "http_log.h"
   #include "http_protocol.h"
  +*/
  +
  +#include <apache/httpd.h>
  +#include <apache/http_config.h>
  +#include <apache/http_core.h>
  +#include <apache/http_log.h>
  +#include <apache/http_protocol.h>
  +#include <apache/http_main.h>
   #include "../../common/Packet.h"
   #include <string.h>
   #include <malloc.h>
   
  +#define xxx   ap_log_rerror(APLOG_MARK,APLOG_ERR, globr,"logged here");
  +#define yyy ap_log_rerror(APLOG_MARK, APLOG_ERR, globr,"logged here");
  +
  +
   /* file: mod_axis.c */
   /* here's the content handler */
   
  -extern int process(soapstream *);
  +extern int process_request(soapstream *);
  +//extern int process(soapstream *);
   extern unsigned char chEBuf[1024];
   
  +//global place holder for the current request_record
  +request_rec * globr;
  +//global variable to store the nubmer of bytes read from ap_get_client_block
  +int  len_read = 0;
  +//global variable to store the remaining number of bytes to be read from the http 
request content
  +int cont_length_remaining=0;
  +
  +//Should dispatch the headers from within this method
  +int send_transport_information(soapstream * hdr)
  +{
  +      ap_send_http_header(globr);
  +       return 0;
  +}
  +
  +//Call initialize_module() [of Packet.h] from within this method
  +void module_init(server_rec *r, pool* p)
  +{}
  +
  +int send_response_bytes(char * res)
  +{
  +  ap_rputs(res, globr);
  +  return 0;
  +}
  +
  +//Cal initialize_process() [of Packet.h] from within this method
  +void  axis_Init(server_rec *r, pool* p)
  +{}
  +//Call finalize_process() [of Packet.h] from within this method
  +void axis_Fini(server_rec *r, pool* p)
  +{}
  +
  +int get_request_bytes(char * req, int reqsize, int* retsize)
  +{
  +
  +  if(cont_length_remaining>0)
  +  {
  +  ap_hard_timeout("util_read", globr);
  +  len_read = ap_get_client_block(globr, req, reqsize);
  +
  +  ap_reset_timeout(globr);
  +  cont_length_remaining -= len_read;
  +  *retsize =  len_read;
  +  }
  +  else
  +  {
  +    *retsize = 0;
  +    }
  + return 0;
  +}
  +
   static int axis_handler(request_rec *r) 
   {
  +
  +     int rc;
        char argsbuffer[HUGE_STRING_LEN];
  +     soapstream * sstr;
  +     array_header * arr;
  +    globr = r;
        memset(argsbuffer,0,HUGE_STRING_LEN);
  -     int rc;
   
  -     soapstream * sstr = malloc(sizeof(soapstream));
  +     sstr = malloc(sizeof(soapstream));
        sstr->trtype=APTHTTP;
  -
        r->content_type = "text/html";
  -     ap_send_http_header(r);
  - 
  -
  -     //TODO
  -     //if the request is a GET request handle it
  -   
        //set up the read policy from the client.
        if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR)) != OK)
        {
                return rc;
        }
   
  -
  -     //tell the client that we are ready to receive content and check whether 
client will send content
  -     //control will pass to this block only if there is body content in the request
  -     if (ap_should_client_block(r))
  -     {
  -             int rsize, len_read, rpos=0;
  -             long length = r->remaining;
  -             //set the byte count of the body content, in the axis soap data 
structure
  -             sstr->so.http.ip_soapcount=r->remaining;
  -             ap_hard_timeout("util_read", r);
  -             while ((len_read = ap_get_client_block(r, argsbuffer, 
sizeof(argsbuffer))) > 0)
  -             {    
  -                     ap_reset_timeout(r);
  -                     if ((rpos + len_read) > length)
  -                     {
  -                             rsize = length - rpos;
  -                     }
  -                     else 
  -                     {
  -                             rsize = len_read;
  -                     }
  -             } 
  -             ap_kill_timeout(r);
  -     }
  -
  -     //assign the body content, to the axis soap data structure
  -     sstr->so.http.ip_soap= argsbuffer;  
  -
        //ap_table_elts returns an array_header struct. The nelts element of that 
struct contains the number of
        //input header elements. Finally assigns that to the axis soap data structure. 
        sstr->so.http.ip_headercount = ap_table_elts(r->headers_in)->nelts;  
  @@ -70,7 +103,7 @@
        //casting r->headers_in to axis header struct and assigning that to the axis 
soap structure. Hope this is ok
   
        //obtain the array_header from the headers_in table and assign it to the axis 
soap structure
  -     array_header * arr = ap_table_elts(r->headers_in);
  +     arr = ap_table_elts(r->headers_in);
        sstr->so.http.ip_headers = (header *)arr->elts;
   
        //Determine the http method and assign it to the axis soap structure
  @@ -85,17 +118,21 @@
        default:
         sstr->so.http.ip_method = UNSUPPORTED;   
        }
  -  
  -     if(0 == process(sstr))
  -     {
  -              ap_rputs(sstr->so.http.op_soap, r);
  -               //free(sstr->so.http.op_soap);      
  -     }
  -     else
  +
  +     //tell the client that we are ready to receive content and check whether 
client will send content
  +     //control will pass to this block only if there is body content in the request
  +    if (ap_should_client_block(globr));
  +    cont_length_remaining = r->remaining;
  +
  +     if(0 != process_request(sstr))
        {
  -             ap_rputs("SOAP Engined failed to response",r);
  +             ap_rputs("SOAP Engine failed to response",r);
  +             return OK;
        }
  +
  +
        free(sstr);
  +     //free(arr);
        return OK;
   }
   /* Make the name of the content handler known to Apache */
  @@ -108,7 +145,7 @@
   module MODULE_VAR_EXPORT axis_module =
   {
      STANDARD_MODULE_STUFF,
  -  NULL,               /* module initializer                 */
  +  module_init,               /* module initializer                 */
     NULL,               /* per-directory config creator       */
     NULL,               /* dir config merger                  */
     NULL,               /* server config creator              */
  @@ -123,7 +160,7 @@
     NULL,               /* [8]  fixups                        */
     NULL,               /* [10] logger                        */
     NULL,               /* [3]  header parser                 */
  -  NULL,               /* process initialization             */
  -  NULL,               /* process exit/cleanup               */
  +  axis_Init,               /* process initialization             */
  +  axis_Fini,               /* process exit/cleanup               */
     NULL                /* [1]  post read_request handling    */
   };
  
  
  

Reply via email to