sanjaya     2003/08/27 02:41:05

  Added:       c/src/server/apache mod_axis2.c
  Log:
  Apache 2.0  module
  
  Revision  Changes    Path
  1.1                  xml-axis/c/src/server/apache/mod_axis2.c
  
  Index: mod_axis2.c
  ===================================================================
  /* -*- C++ -*- */
  
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "SOAP" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   *
   *
   *
   * @author Sanjaya Singharage ([EMAIL PROTECTED])
   *
   */
  
  #include <apache2_0/httpd.h>
  #include <apache2_0/http_config.h>
  #include <apache2_0/http_core.h>
  #include <apache2_0/http_protocol.h>
  #include <apache2_0/http_log.h>
  #include <apache2_0/ap_compat.h>
  #include "../../../src/common/Packet.h"
  #include <malloc.h>
  
  /*
  The apache 2.0 module for Axis. THIS IS NOT COMPLETED
  */
  
  extern int process_request(Ax_soapstream* str);
  //extern int process(soapstream *);
  extern unsigned char chEBuf[1024];
  
  //Call initialize_module() [of Packet.h] from within this method
  void module_init(server_rec *svr_rec, apr_pool_t* p)
  {
        initialize_module();
  }
  
  
  //Call initialize_process() [of Packet.h] from within this method
  void  axis_Init(server_rec *svr_rec, apr_pool_t* p)
  {}
  //Call finalize_process() [of Packet.h] from within this method
  void axis_Fini(server_rec *svr_rec, apr_pool_t* p)
  {}
  
  
  
  int send_response_bytes(char* res, void* opstream)
  {
        ap_rputs(res, (request_rec*)opstream);
        return 0;
  }
  
  
  
  //Should dispatch the headers from within this method
  int send_transport_information(Ax_soapstream* hdr)
  {
        ap_send_http_header((request_rec*)hdr->str.op_stream);
          return 0;
  }
  
  int get_request_bytes(char* req, int reqsize, int* retsize, void* ipstream)
  {
        int len_read;
        //ap_hard_timeout("util_read", (request_rec*)ipstream);
        len_read = ap_get_client_block((request_rec*)ipstream, req, reqsize);
        //ap_reset_timeout((request_rec*)ipstream);
        *retsize =  len_read;
        return 0;
  }
  
  
  static int mod_axis_method_handler (request_rec *req_rec)
  {
        int rc;
        Ax_soapstream* sstr;
        apr_array_header_t* arr;
  
        sstr = malloc(sizeof(Ax_soapstream));
        sstr->trtype = APTHTTP;
        //req_rec is used as both input and output streams
        sstr->str.ip_stream = req_rec;
        sstr->str.op_stream = req_rec;
        //just add some sessionid
        sstr->sessionid = "this is temporary session id";
  
        req_rec->content_type = "text/xml"; //for SOAP 1.2 this this should be 
"application/soap+xml" but keep this for the moment
        //set up the read policy from the client.
        if ((rc = ap_setup_client_block(req_rec, REQUEST_CHUNKED_ERROR)) != OK)
        {
                return rc;
        }
  
        //the member, "path" of "parsed_uri" contains the uri of the 
        //request (i.e "/abc/xyz" part of http://somehost/abc/xyz)
        sstr->so.http.uri_path = req_rec->parsed_uri.path;
  
        //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(req_rec->headers_in)->nelts;  
  
        //casting req_rec->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
        arr = ap_table_elts(req_rec->headers_in);
        sstr->so.http.ip_headers = (Ax_header*)arr->elts;
  
        //Determine the http method and assign it to the axis soap structure
        switch (req_rec->method_number)
        {
        case M_GET:
        sstr->so.http.ip_method = AXIS_HTTP_GET;
        break;
        case M_POST:
        sstr->so.http.ip_method = AXIS_HTTP_POST;
        break;
        default:
        sstr->so.http.ip_method = AXIS_HTTP_UNSUPPORTED;   
        }
  
        //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(req_rec));
  
        if(0 != process_request(sstr))
        {
                ap_rputs("SOAP Engine failed to response",req_rec);
                return OK;
        }
  
  
        free(sstr);
        //free(arr);
        return OK;
  }
  
  /*
   * This function is a callback and it declares what other functions
   * should be called for request processing and configuration requests.
   * This callback function declares the Handlers for other events.
   */
  static void mod_axis_register_hooks (apr_pool_t *p)
  {
        // I think this is the call to make to register a handler for method calls 
(GET PUT et. al.).
        // We will ask to be last so that the comment has a higher tendency to
        // go at the end.
        ap_hook_handler(mod_axis_method_handler, NULL, NULL, APR_HOOK_LAST);
  }
  
  /*
   * Declare and populate the module's data structure.  The
   * name of this structure ('tut1_module') is important - it
   * must match the name of the module.  This structure is the
   * only "glue" between the httpd core and the module.
   */
  module AP_MODULE_DECLARE_DATA mod_axis =
  {
        // Only one callback function is provided.  Real
        // modules will need to declare callback functions for
        // server/directory configuration, configuration merging
        // and other tasks.
        STANDARD20_MODULE_STUFF,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        mod_axis_register_hooks,                        /* callback for registering 
hooks */
        //      mod_tut1_register_hooks
  };
  
  
  
  

Reply via email to