Hi,

I have created axis2_util.h and util.c files to support axis2 utility
functions. Also I have written
axis2_parse_request_url_for_svc_and_operation(axis2_env_t **env,
axis2_char_t *request) function as a start. Please commit the code.

- Sahan

/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef AXIS2_UTILS_H
#define AXIS2_UTILS_H

#include <axis2.h>
#include <axis2_defines.h>
#include <axis2_error.h>
#include <axis2_env.h>

#ifdef __cplusplus
extern "C"
{
#endif

/**
 * @defgroup axis2_utils Utils
 * @ingroup axis2_utils
 * @{
 */
#define AXIS2_REQUEST_URL_PREFIX "/services"
    /**
     * This function allows users to reolve the service and operation from the 
     * url. It returns an array of 2 elements of axis2_char_t arrays (strings).
     * The caller is responsible to free the memory allocated by the function
     * for the return value.
     *
     * @param request url
     * @return axis2_char_t ** <code>axis2_char_t **<code>
     */
    AXIS2_DECLARE(axis2_char_t**)
    axis2_parse_request_url_for_svc_and_operation(axis2_env_t **env, axis2_char_t *request);

/** @} */
    
#ifdef __cplusplus
}
#endif

#endif                          /* AXIS2_UTILS_H */
/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <axis2_utils.h>
#include <stdlib.h>
#include <axis2_string.h>
#include <string.h>

AXIS2_DECLARE(axis2_char_t**)
axis2_parse_request_url_for_svc_and_operation(axis2_env_t **env, 
                                                axis2_char_t *request)

{
    AXIS2_FUNC_PARAM_CHECK(request, env, NULL);
    axis2_char_t **ret  = AXIS2_MALLOC((*env)->allocator, 
                                        2*(sizeof(axis2_char_t *)));
    memset(ret, 0, 2*sizeof(axis2_char_t*)); 

    axis2_char_t *service_str = NULL;
    axis2_char_t *tmp = request;
    int i = 0;
    
    while(1)
    {
        tmp = strstr(tmp, AXIS2_REQUEST_URL_PREFIX);
        if(NULL == tmp)
            break;
        else
        {
            service_str = tmp;
            tmp += AXIS2_STRLEN(AXIS2_REQUEST_URL_PREFIX);
        }
    }
    if(NULL != service_str)
    {
        service_str += AXIS2_STRLEN(AXIS2_REQUEST_URL_PREFIX);
        if('\0' != *service_str)
        {
            service_str++; /*to remove the leading '/' */
            tmp = strchr(service_str, '/');
            if(NULL != tmp)
            {
                i = tmp - service_str;
                ret[0] = AXIS2_MALLOC((*env)->allocator, i*sizeof(char)+1);
                strncpy(ret[0], service_str,i);
                ret[0][i] = '\0';

                /* Now search for the operation */
                service_str = tmp;
                if('\0' != *service_str)
                {
                    service_str++;
                    tmp = strchr(service_str, '?');
                    if(NULL != tmp)
                    {
                        i = tmp - service_str;
                        ret[1] = AXIS2_MALLOC((*env)->allocator, 
                                                i*sizeof(char)+1);
                        strncpy(ret[1], service_str,i);
                        ret[1][i] = '\0';
                    }
                    else
                    {
                        ret[1] = AXIS2_STRDUP(service_str, env);
                    }
                }
            }
            else
            {
                ret[0] = AXIS2_STRDUP(service_str, env);
            }
        }
    }
    return ret;
}

Reply via email to