blob: 1e0306a6d50923f5d902f27971918ee2973c0bef [file] [log] [blame]
/*
* 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_http_request_line.h>
#include <axis2_string.h>
#include <string.h>
#include <axis2_http_transport.h>
#include <stdio.h>
/**
* @brief HTTP Request Line struct impl
* Axis2 HTTP Request Line impl
*/
typedef struct axis2_http_request_line_impl
{
axis2_http_request_line_t request_line;
axis2_char_t *http_version;
axis2_char_t *method;
axis2_char_t *uri;
}
axis2_http_request_line_impl_t;
#define AXIS2_INTF_TO_IMPL(request_line) \
((axis2_http_request_line_impl_t *)(request_line))
/***************************** Function headers *******************************/
/*
* This is just a function
* Not assciated with an ops struct
*/
axis2_http_request_line_t *AXIS2_CALL
axis2_http_request_line_parse_line(
const axis2_env_t *env,
const axis2_char_t *str);
axis2_char_t *AXIS2_CALL
axis2_http_request_line_get_method(
const axis2_http_request_line_t *request_line,
const axis2_env_t *env);
axis2_char_t *AXIS2_CALL
axis2_http_request_line_get_http_version(
const axis2_http_request_line_t *request_line,
const axis2_env_t *env);
axis2_char_t *AXIS2_CALL
axis2_http_request_line_get_uri(
const axis2_http_request_line_t *request_line,
const axis2_env_t *env);
axis2_char_t *AXIS2_CALL
axis2_http_request_line_to_string(
axis2_http_request_line_t *request_line,
const axis2_env_t *env);
axis2_status_t AXIS2_CALL
axis2_http_request_line_free(
axis2_http_request_line_t *request_line,
const axis2_env_t *env);
/***************************** End of function headers ************************/
AXIS2_EXTERN axis2_http_request_line_t *AXIS2_CALL
axis2_http_request_line_create(
const axis2_env_t *env,
const axis2_char_t *method,
const axis2_char_t *uri,
const axis2_char_t *http_version)
{
axis2_http_request_line_impl_t *request_line_impl = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK(env->error, method, NULL);
AXIS2_PARAM_CHECK(env->error, uri, NULL);
AXIS2_PARAM_CHECK(env->error, http_version, NULL);
request_line_impl = (axis2_http_request_line_impl_t *)AXIS2_MALLOC
(env->allocator, sizeof(
axis2_http_request_line_impl_t));
if (NULL == request_line_impl)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
request_line_impl->method = (axis2_char_t *)AXIS2_STRDUP(method, env);
request_line_impl->uri = (axis2_char_t *)AXIS2_STRDUP(uri, env);
request_line_impl->http_version = (axis2_char_t *)AXIS2_STRDUP(
http_version, env);
request_line_impl->request_line.ops = AXIS2_MALLOC(env->allocator,
sizeof(axis2_http_request_line_ops_t));
if (NULL == request_line_impl->request_line.ops)
{
axis2_http_request_line_free((axis2_http_request_line_t *)
request_line_impl, env);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
request_line_impl->request_line.ops->get_method =
axis2_http_request_line_get_method;
request_line_impl->request_line.ops->get_http_version =
axis2_http_request_line_get_http_version;
request_line_impl->request_line.ops->get_uri =
axis2_http_request_line_get_uri;
request_line_impl->request_line.ops->to_string =
axis2_http_request_line_to_string;
request_line_impl->request_line.ops->free =
axis2_http_request_line_free;
return &(request_line_impl->request_line);
}
axis2_status_t AXIS2_CALL
axis2_http_request_line_free(
axis2_http_request_line_t *request_line,
const axis2_env_t *env)
{
axis2_http_request_line_impl_t *request_line_impl = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
request_line_impl = AXIS2_INTF_TO_IMPL(request_line);
if (request_line_impl->method)
{
AXIS2_FREE(env->allocator, request_line_impl->method);
request_line_impl->method = NULL;
}
if (request_line_impl->uri)
{
AXIS2_FREE(env->allocator, request_line_impl->uri);
request_line_impl->uri = NULL;
}
if (request_line_impl->http_version)
{
AXIS2_FREE(env->allocator, request_line_impl->http_version);
request_line_impl->http_version = NULL;
}
if (request_line->ops)
AXIS2_FREE(env->allocator, request_line->ops);
AXIS2_FREE(env->allocator, AXIS2_INTF_TO_IMPL(request_line));
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_http_request_line_t *AXIS2_CALL
axis2_http_request_line_parse_line(
const axis2_env_t *env,
const axis2_char_t *str)
{
axis2_char_t *req_line = NULL;
axis2_char_t *method = NULL;
axis2_char_t *uri = NULL;
axis2_char_t *http_version = NULL;
axis2_http_request_line_t *ret = NULL;
axis2_char_t *tmp = NULL;
int i = 0;
AXIS2_PARAM_CHECK(env->error, str, NULL);
tmp = AXIS2_STRSTR(str, AXIS2_HTTP_CRLF);
if (NULL == tmp)
{
AXIS2_ERROR_SET(env->error,
AXIS2_ERROR_INVALID_HTTP_HEADER_START_LINE,
AXIS2_FAILURE);
return NULL;
}
i = tmp - str;
req_line = AXIS2_MALLOC(env->allocator, i * sizeof(axis2_char_t) + 1);
if (NULL == req_line)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
memcpy(req_line, str, i * sizeof(axis2_char_t));
req_line[i] = '\0';
tmp = req_line;
method = tmp;
tmp = strchr(tmp, ' ');
if (NULL == tmp)
{
AXIS2_FREE(env->allocator, req_line);
AXIS2_ERROR_SET(env->error,
AXIS2_ERROR_INVALID_HTTP_HEADER_START_LINE,
AXIS2_FAILURE);
return NULL;
}
*tmp++ = '\0';
uri = tmp;
tmp = strrchr(tmp, ' ');
if (NULL == tmp)
{
AXIS2_FREE(env->allocator, req_line);
AXIS2_ERROR_SET(env->error,
AXIS2_ERROR_INVALID_HTTP_HEADER_START_LINE,
AXIS2_FAILURE);
return NULL;
}
*tmp++ = '\0';
http_version = tmp;
ret = axis2_http_request_line_create(env, method, uri, http_version);
AXIS2_FREE(env->allocator, req_line);
return ret;
}
axis2_char_t *AXIS2_CALL
axis2_http_request_line_get_method(
const axis2_http_request_line_t *request_line,
const axis2_env_t *env)
{
AXIS2_ENV_CHECK(env, NULL);
return AXIS2_INTF_TO_IMPL(request_line)->method;
}
axis2_char_t *AXIS2_CALL
axis2_http_request_line_get_http_version(
const axis2_http_request_line_t *request_line,
const axis2_env_t *env)
{
AXIS2_ENV_CHECK(env, NULL);
return AXIS2_INTF_TO_IMPL(request_line)->http_version;
}
axis2_char_t *AXIS2_CALL
axis2_http_request_line_get_uri(
const axis2_http_request_line_t *request_line,
const axis2_env_t *env)
{
AXIS2_ENV_CHECK(env, NULL);
return AXIS2_INTF_TO_IMPL(request_line)->uri;
}
axis2_char_t *AXIS2_CALL
axis2_http_request_line_to_string(
axis2_http_request_line_t *request_line,
const axis2_env_t *env)
{
axis2_http_request_line_impl_t *req_line_impl = NULL;
int alloc_len = 0;
axis2_char_t *ret = NULL;
AXIS2_ENV_CHECK(env, NULL);
req_line_impl = AXIS2_INTF_TO_IMPL(
request_line);
alloc_len = AXIS2_STRLEN(req_line_impl->method) +
AXIS2_STRLEN(req_line_impl->uri) +
AXIS2_STRLEN(req_line_impl->http_version) + 6;
/* 5 = 2 * spaces + '/' +CR + LF + '\0' */
ret = AXIS2_MALLOC(env->allocator,
alloc_len * sizeof(axis2_char_t));
if (NULL == ret)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
if (req_line_impl->uri[0] != '/')
{
sprintf(ret, "%s /%s %s%s", req_line_impl->method, req_line_impl->uri,
req_line_impl->http_version, AXIS2_HTTP_CRLF);
}
else
{
sprintf(ret, "%s %s %s%s", req_line_impl->method, req_line_impl->uri,
req_line_impl->http_version, AXIS2_HTTP_CRLF);
}
return ret;
}