Author: dumindu Date: Sat Dec 8 20:55:02 2007 New Revision: 602635 URL: http://svn.apache.org/viewvc?rev=602635&view=rev Log: Fixing Jira issues 716, 757, 821, 817, 820, 814, 815 and 819. (HTTP authentication and Proxy authetication related issues)
Thanks Senaka for the patch. Modified: webservices/axis2/trunk/c/include/axis2_const.h webservices/axis2/trunk/c/include/axis2_http_transport.h webservices/axis2/trunk/c/include/axis2_options.h webservices/axis2/trunk/c/include/axis2_svc_client.h webservices/axis2/trunk/c/samples/server/axis2.xml webservices/axis2/trunk/c/src/core/clientapi/options.c webservices/axis2/trunk/c/src/core/clientapi/svc_client.c webservices/axis2/trunk/c/src/core/transport/http/sender/http_sender.c Modified: webservices/axis2/trunk/c/include/axis2_const.h URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/include/axis2_const.h?rev=602635&r1=602634&r2=602635&view=diff ============================================================================== --- webservices/axis2/trunk/c/include/axis2_const.h (original) +++ webservices/axis2/trunk/c/include/axis2_const.h Sat Dec 8 20:55:02 2007 @@ -313,6 +313,12 @@ #define AXIS2_ENABLE_REST "enableREST" #define AXIS2_ENABLE_REST_THROUGH_GET "restThroughGet" +#define AXIS2_FORCE_PROXY_AUTH "forceProxyAuth" +#define AXIS2_FORCE_HTTP_AUTH "forceHTTPAuth" + +#define AXIS2_PROXY_AUTH_TYPE "proxyAuthType" +#define AXIS2_HTTP_AUTH_TYPE "HTTPAuthType" + /* globally enable MTOM */ #define AXIS2_ENABLE_MTOM "enableMTOM" #define AXIS2_ATTACHMENT_TEMP_DIR "attachmentDIR" Modified: webservices/axis2/trunk/c/include/axis2_http_transport.h URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/include/axis2_http_transport.h?rev=602635&r1=602634&r2=602635&view=diff ============================================================================== --- webservices/axis2/trunk/c/include/axis2_http_transport.h (original) +++ webservices/axis2/trunk/c/include/axis2_http_transport.h Sat Dec 8 20:55:02 2007 @@ -74,6 +74,11 @@ #define AXIS2_HTTP_RESPONSE_HTTP_UNAUTHORIZED_CODE_VAL 401 /** + * AXIS2_HTTP_RESPONSE_PROXY_AUTHENTICATION_REQUIRED_CODE_VAL + */ +#define AXIS2_HTTP_RESPONSE_PROXY_AUTHENTICATION_REQUIRED_CODE_VAL 407 + + /** * RESPONSE_ACK_CODE_VAL */ #define AXIS2_HTTP_RESPONSE_ACK_CODE_VAL 202 @@ -190,6 +195,11 @@ #define AXIS2_HTTP_HEADER_WWW_AUTHENTICATE "WWW-Authenticate" /** + * HEADER_PROXY_AUTHENTICATE + */ +#define AXIS2_HTTP_HEADER_PROXY_AUTHENTICATE "Proxy-Authenticate" + + /** * HEADER_PROXY_AUTHORIZATION */ #define AXIS2_HTTP_HEADER_PROXY_AUTHORIZATION "Proxy-Authorization" @@ -371,6 +381,11 @@ #define AXIS2_HTTP_RESPONSE_HTTP_UNAUTHORIZED "401 Unauthorized" /** + * RESPONSE_PROXY_AUTHENTICATION_REQUIRED + */ +#define AXIS2_HTTP_RESPONSE_PROXY_AUTHENTICATION_REQUIRED "401 Proxy Authentication Required" + + /** * RESPONSE_BAD_REQUEST */ #define AXIS2_HTTP_RESPONSE_BAD_REQUEST "400 Bad Request" @@ -433,6 +448,21 @@ #define MTOM_RECIVED_CONTENT_TYPE "MTOM_RECEIVED" /** + * Constant for HTTP authentication + */ +#define AXIS2_HTTP_AUTHENTICATION "HTTP-Authentication" + + /** + * Constant for HTTP authentication username + */ +#define AXIS2_HTTP_AUTHENTICATION_USERNAME "http_authentication_username" + + /** + * Constant for HTTP authentication password + */ +#define AXIS2_HTTP_AUTHENTICATION_PASSWORD "http_authentication_password" + + /** * Constant for HTTP proxy */ #define AXIS2_HTTP_PROXY "PROXY" @@ -447,6 +477,17 @@ */ #define AXIS2_HTTP_PROXY_PORT "proxy_port" + /** + * Constant for HTTP proxy username + */ +#define AXIS2_HTTP_PROXY_USERNAME "proxy_username" + + /** + * Constant for HTTP proxy password + */ +#define AXIS2_HTTP_PROXY_PASSWORD "proxy_password" + + #define AXIS2_HTTP_PROXY_API "PROXY_API" /** @@ -479,6 +520,17 @@ */ #define AXIS2_HTTP_AUTH_PASSWD "HTTP_AUTH_PASSWD" + /** + * Proxy authentication username property name + */ +#define AXIS2_PROXY_AUTH_UNAME "PROXY_AUTH_USERNAME" + + /** + * Proxy authentication password property name + */ +#define AXIS2_PROXY_AUTH_PASSWD "PROXY_AUTH_PASSWD" + + /*#define AXIS2_HTTP_AUTH_TYPE "HTTP_AUTH_TYPE"*/ /** @@ -490,6 +542,17 @@ * HTTP "Digest" authentication */ #define AXIS2_HTTP_AUTH_TYPE_DIGEST "Digest" + + /** + * Proxy "Basic" authentication + */ +#define AXIS2_PROXY_AUTH_TYPE_BASIC "Basic" + + /** + * Proxy "Digest" authentication + */ +#define AXIS2_PROXY_AUTH_TYPE_DIGEST "Digest" + /** *HTTP Transport Level Error Modified: webservices/axis2/trunk/c/include/axis2_options.h URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/include/axis2_options.h?rev=602635&r1=602634&r2=602635&view=diff ============================================================================== --- webservices/axis2/trunk/c/include/axis2_options.h (original) +++ webservices/axis2/trunk/c/include/axis2_options.h Sat Dec 8 20:55:02 2007 @@ -737,8 +737,8 @@ axis2_options_t * options, const axutil_env_t * env, const axis2_bool_t enable_rest); - - /** + +/** * Sets the HTTP method to be used * @param options pointer to options struct * @param env pointer to environment struct @@ -775,6 +775,44 @@ axis2_options_create_with_parent( const axutil_env_t * env, axis2_options_t * parent); + + /** + * Sets HTTP authentication information. + * @param env pointer to environment stnuct + * @param parent pointer to parent struct + * @param username string representing username + * @param password string representing password + * @param auth_type use "Basic" to force basic authentication + * and "Digest" to force digest authentication or NULL for not + * forcing authentication + * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE + */ + AXIS2_EXTERN axis2_status_t AXIS2_CALL + axis2_options_set_http_auth_info( + axis2_options_t * options, + const axutil_env_t * env, + const axis2_char_t * username, + const axis2_char_t * password, + const axis2_char_t * auth_type); + + /** + * Sets proxy authentication information. + * @param env pointer to environment stnuct + * @param parent pointer to parent struct + * @param username string representing username + * @param password string representing password + * @param auth_type use "Basic" to force basic authentication + * and "Digest" to force digest authentication or NULL for not + * forcing authentication + * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE + */ + AXIS2_EXTERN axis2_status_t AXIS2_CALL + axis2_options_set_proxy_auth_info( + axis2_options_t * options, + const axutil_env_t * env, + const axis2_char_t * username, + const axis2_char_t * password, + const axis2_char_t * auth_type); /** @} */ #ifdef __cplusplus Modified: webservices/axis2/trunk/c/include/axis2_svc_client.h URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/include/axis2_svc_client.h?rev=602635&r1=602634&r2=602635&view=diff ============================================================================== --- webservices/axis2/trunk/c/include/axis2_svc_client.h (original) +++ webservices/axis2/trunk/c/include/axis2_svc_client.h Sat Dec 8 20:55:02 2007 @@ -407,16 +407,34 @@ axis2_endpoint_ref_t * target_epr); /** - * Sets the proxy. + * Sets the proxy with authentication support. * @param svc_client pointer to service client struct * @param env pointer to environment struct * @param proxy_host pointer to the proxy_host settings to be set - * as * @param proxy_port pointer to the proxy_port settings to be set - * as - * target. service client takes over the ownership of the struct. + * @param username pointer to the username associated with proxy + * which is required for authentication + * @param password pointer to the password associated with proxy + * which is required for authentication * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE */ + AXIS2_EXTERN axis2_status_t AXIS2_CALL + axis2_svc_client_set_proxy_with_auth( + axis2_svc_client_t * svc_client, + const axutil_env_t * env, + axis2_char_t * proxy_host, + axis2_char_t * proxy_port, + axis2_char_t * username, + axis2_char_t * password); + + /** + * Sets the proxy. + * @param svc_client pointer to service client struct + * @param env pointer to environment struct + * @param proxy_host pointer to the proxy_host settings to be set + * @param proxy_port pointer to the proxy_port settings to be set + * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE + */ AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_svc_client_set_proxy( axis2_svc_client_t * svc_client, Modified: webservices/axis2/trunk/c/samples/server/axis2.xml URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/samples/server/axis2.xml?rev=602635&r1=602634&r2=602635&view=diff ============================================================================== --- webservices/axis2/trunk/c/samples/server/axis2.xml (original) +++ webservices/axis2/trunk/c/samples/server/axis2.xml Sat Dec 8 20:55:02 2007 @@ -39,7 +39,8 @@ <transportSender name="http" class="axis2_http_sender"> <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter> <!--parameter name="Transfer-Encoding">chunked</parameter--> - <!--parameter name="PROXY" proxy_host="127.0.0.1" proxy_port="8080" locked="true"/--> + <!--parameter name="HTTP-Authentication" http_authentication_username="" http_authentication_password="" locked="true"/--> + <!--parameter name="PROXY" proxy_host="127.0.0.1" proxy_port="8080" proxy_username="" proxy_password="" locked="true"/--> </transportSender> <!-- Uncomment this one with the appropriate papameters to enable the XMPP transport Sender--> <!--transportSender name="xmpp" class="axis2_xmpp_sender"> Modified: webservices/axis2/trunk/c/src/core/clientapi/options.c URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/clientapi/options.c?rev=602635&r1=602634&r2=602635&view=diff ============================================================================== --- webservices/axis2/trunk/c/src/core/clientapi/options.c (original) +++ webservices/axis2/trunk/c/src/core/clientapi/options.c Sat Dec 8 20:55:02 2007 @@ -934,3 +934,108 @@ method_property); return AXIS2_SUCCESS; } + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +axis2_options_set_proxy_auth_info( + axis2_options_t * options, + const axutil_env_t * env, + const axis2_char_t * username, + const axis2_char_t * password, + const axis2_char_t * auth_type) +{ + AXIS2_ENV_CHECK(env, NULL); + axutil_property_t *prop_un = axutil_property_create(env); + axutil_property_set_value(prop_un, env, axutil_strdup(env, username)); + axis2_options_set_property(options, env, AXIS2_PROXY_AUTH_UNAME, prop_un); + + axutil_property_t *prop_pw = axutil_property_create(env); + axutil_property_set_value(prop_pw, env, axutil_strdup(env, password)); + axis2_options_set_property(options, env, AXIS2_PROXY_AUTH_PASSWD, prop_pw); + + axis2_bool_t force_proxy_auth = AXIS2_FALSE; + + if(auth_type) + { + if ((axutil_strcmp (auth_type, AXIS2_PROXY_AUTH_TYPE_BASIC) == 0) || + (axutil_strcmp (auth_type, AXIS2_PROXY_AUTH_TYPE_DIGEST) == 0)) + { + force_proxy_auth = AXIS2_TRUE; + } + } + if (force_proxy_auth) + { + axutil_property_t *proxy_auth_property = axutil_property_create(env); + axutil_property_set_value(proxy_auth_property, env, + axutil_strdup(env, AXIS2_VALUE_TRUE)); + axis2_options_set_property(options, env, AXIS2_FORCE_PROXY_AUTH, + proxy_auth_property); + + axutil_property_t *proxy_auth_type_property = axutil_property_create(env); + axutil_property_set_value(proxy_auth_type_property, env, + axutil_strdup(env, auth_type)); + axis2_options_set_property(options, env, AXIS2_PROXY_AUTH_TYPE, + proxy_auth_type_property); + } + else + { + axutil_property_t *proxy_auth_property = axutil_property_create(env); + axutil_property_set_value(proxy_auth_property, env, + axutil_strdup(env, AXIS2_VALUE_FALSE)); + axis2_options_set_property(options, env, AXIS2_FORCE_PROXY_AUTH, + proxy_auth_property); + } + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +axis2_options_set_http_auth_info( + axis2_options_t * options, + const axutil_env_t * env, + const axis2_char_t * username, + const axis2_char_t * password, + const axis2_char_t * auth_type) +{ + AXIS2_ENV_CHECK(env, NULL); + axutil_property_t *prop_un = axutil_property_create(env); + axutil_property_set_value(prop_un, env, axutil_strdup(env, username)); + axis2_options_set_property(options, env, AXIS2_HTTP_AUTH_UNAME, prop_un); + + axutil_property_t *prop_pw = axutil_property_create(env); + axutil_property_set_value(prop_pw, env, axutil_strdup(env, password)); + axis2_options_set_property(options, env, AXIS2_HTTP_AUTH_PASSWD, prop_pw); + + axis2_bool_t force_http_auth = AXIS2_FALSE; + + if (auth_type) + { + if ((axutil_strcmp (auth_type, AXIS2_HTTP_AUTH_TYPE_BASIC) == 0) || + (axutil_strcmp (auth_type, AXIS2_HTTP_AUTH_TYPE_DIGEST) == 0)) + { + force_http_auth = AXIS2_TRUE; + } + } + if (force_http_auth) + { + axutil_property_t *http_auth_property = axutil_property_create(env); + axutil_property_set_value(http_auth_property, env, + axutil_strdup(env, AXIS2_VALUE_TRUE)); + axis2_options_set_property(options, env, AXIS2_FORCE_HTTP_AUTH, + http_auth_property); + + axutil_property_t *http_auth_type_property = axutil_property_create(env); + axutil_property_set_value(http_auth_type_property, env, + axutil_strdup(env, auth_type)); + axis2_options_set_property(options, env, AXIS2_HTTP_AUTH_TYPE, + http_auth_type_property); + } + else + { + axutil_property_t *http_auth_property = axutil_property_create(env); + axutil_property_set_value(http_auth_property, env, + axutil_strdup(env, AXIS2_VALUE_FALSE)); + axis2_options_set_property(options, env, AXIS2_FORCE_HTTP_AUTH, + http_auth_property); + } + return AXIS2_SUCCESS; +} + Modified: webservices/axis2/trunk/c/src/core/clientapi/svc_client.c URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/clientapi/svc_client.c?rev=602635&r1=602634&r2=602635&view=diff ============================================================================== --- webservices/axis2/trunk/c/src/core/clientapi/svc_client.c (original) +++ webservices/axis2/trunk/c/src/core/clientapi/svc_client.c Sat Dec 8 20:55:02 2007 @@ -1417,11 +1417,13 @@ } AXIS2_EXTERN axis2_status_t AXIS2_CALL -axis2_svc_client_set_proxy( +axis2_svc_client_set_proxy_with_auth( axis2_svc_client_t * svc_client, const axutil_env_t * env, axis2_char_t * proxy_host, - axis2_char_t * proxy_port) + axis2_char_t * proxy_port, + axis2_char_t * username, + axis2_char_t * password) { axis2_transport_out_desc_t *trans_desc = NULL; axis2_conf_t *conf = NULL; @@ -1431,8 +1433,12 @@ axutil_hash_t *attribute; axutil_generic_obj_t *host_obj = NULL; axutil_generic_obj_t *port_obj = NULL; + axutil_generic_obj_t *username_obj = NULL; + axutil_generic_obj_t *password_obj = NULL; axiom_attribute_t *host_attr = NULL; axiom_attribute_t *port_attr = NULL; + axiom_attribute_t *username_attr = NULL; + axiom_attribute_t *password_attr = NULL; AXIS2_PARAM_CHECK(env->error, svc_client, AXIS2_FAILURE); AXIS2_PARAM_CHECK(env->error, proxy_host, AXIS2_FAILURE); @@ -1455,7 +1461,7 @@ { return AXIS2_FAILURE; } - + attribute = axutil_hash_make(env); host_obj = axutil_generic_obj_create(env); port_obj = axutil_generic_obj_create(env); @@ -1468,11 +1474,33 @@ host_obj); axutil_hash_set(attribute, AXIS2_HTTP_PROXY_PORT, AXIS2_HASH_KEY_STRING, port_obj); + if (username && password) + { + username_obj = axutil_generic_obj_create(env); + password_obj = axutil_generic_obj_create(env); + username_attr = axiom_attribute_create(env, username, NULL, NULL); + password_attr = axiom_attribute_create(env, password, NULL, NULL); + axutil_generic_obj_set_value(username_obj, env, username_attr); + axutil_generic_obj_set_value(password_obj, env, password_attr); + axutil_hash_set(attribute, AXIS2_HTTP_PROXY_USERNAME, AXIS2_HASH_KEY_STRING, + username_obj); + axutil_hash_set(attribute, AXIS2_HTTP_PROXY_PASSWORD, AXIS2_HASH_KEY_STRING, + password_obj); + } axutil_param_set_attributes(param, env, attribute); axutil_param_container_add_param(param_container, env, param); - } return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +axis2_svc_client_set_proxy( + axis2_svc_client_t * svc_client, + const axutil_env_t * env, + axis2_char_t * proxy_host, + axis2_char_t * proxy_port) +{ + return axis2_svc_client_set_proxy_with_auth(svc_client, env, proxy_host, proxy_port, NULL, NULL); } AXIS2_EXTERN axis2_status_t AXIS2_CALL Modified: webservices/axis2/trunk/c/src/core/transport/http/sender/http_sender.c URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/sender/http_sender.c?rev=602635&r1=602634&r2=602635&view=diff ============================================================================== --- webservices/axis2/trunk/c/src/core/transport/http/sender/http_sender.c (original) +++ webservices/axis2/trunk/c/src/core/transport/http/sender/http_sender.c Sat Dec 8 20:55:02 2007 @@ -86,11 +86,24 @@ axis2_http_simple_request_t * request); static axis2_status_t +axis2_http_sender_configure_proxy_auth (axis2_http_sender_t * sender, + const axutil_env_t * env, + axis2_msg_ctx_t * msg_ctx, + axis2_http_simple_request_t * request); + +static axis2_status_t axis2_http_sender_configure_http_basic_auth (axis2_http_sender_t * sender, const axutil_env_t * env, axis2_msg_ctx_t * msg_ctx, axis2_http_simple_request_t * request); + +static axis2_status_t +axis2_http_sender_configure_proxy_basic_auth (axis2_http_sender_t * sender, + const axutil_env_t * env, + axis2_msg_ctx_t * msg_ctx, + axis2_http_simple_request_t * + request); #endif AXIS2_EXTERN axis2_http_sender_t *AXIS2_CALL @@ -171,6 +184,12 @@ axutil_property_t *dump_property = NULL; axutil_param_t *ssl_pp_param = NULL; /* ssl passphrase */ axis2_char_t *ssl_pp = NULL; + axutil_property_t *proxy_auth_property = NULL; + axis2_char_t *proxy_auth_property_value = NULL; + axis2_bool_t force_proxy_auth = AXIS2_FALSE; + axutil_property_t *http_auth_property = NULL; + axis2_char_t *http_auth_property_value = NULL; + axis2_bool_t force_http_auth = AXIS2_FALSE; axutil_property_t *content_type_property = NULL; axutil_hash_t *content_type_hash = NULL; axis2_char_t *content_type_value = NULL; @@ -583,26 +602,111 @@ ssl_pp = axutil_param_get_value (ssl_pp_param, env); } - /* how should this status_code be handled? */ - status_code = axis2_http_client_send (sender->client, env, request, ssl_pp); + proxy_auth_property = (axutil_property_t *) axis2_msg_ctx_get_property (msg_ctx, env, + AXIS2_FORCE_PROXY_AUTH); + if (proxy_auth_property) + proxy_auth_property_value = (axis2_char_t *) axutil_property_get_value (proxy_auth_property, + env); + + if (proxy_auth_property_value && 0 == axutil_strcmp (proxy_auth_property_value, AXIS2_VALUE_TRUE)) + { + force_proxy_auth = AXIS2_TRUE; + } + http_auth_property = (axutil_property_t *) axis2_msg_ctx_get_property (msg_ctx, env, + AXIS2_FORCE_HTTP_AUTH); + if (http_auth_property) + http_auth_property_value = (axis2_char_t *) axutil_property_get_value (http_auth_property, + env); + + if (http_auth_property_value && 0 == axutil_strcmp (http_auth_property_value, AXIS2_VALUE_TRUE)) + { + force_http_auth = AXIS2_TRUE; + } - status_code = axis2_http_client_recieve_header (sender->client, env); + axis2_bool_t http_auth_header_added = AXIS2_FALSE; - if (AXIS2_HTTP_RESPONSE_HTTP_UNAUTHORIZED_CODE_VAL == status_code) + if (force_proxy_auth) + { + status_code = AXIS2_HTTP_RESPONSE_PROXY_AUTHENTICATION_REQUIRED_CODE_VAL; + } + else + { + if (force_http_auth) + { + axis2_status_t auth_status; + auth_status = axis2_http_sender_configure_http_auth (sender, + env, + msg_ctx, request); + + if (auth_status != AXIS2_SUCCESS) + AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "Error in setting HTTP" + " Authentication header"); + http_auth_header_added = AXIS2_TRUE; + } + /* how should this status_code be handled? */ + status_code = axis2_http_client_send (sender->client, env, request, ssl_pp); + + status_code = axis2_http_client_recieve_header (sender->client, env); + } + + if (AXIS2_HTTP_RESPONSE_PROXY_AUTHENTICATION_REQUIRED_CODE_VAL == status_code) { axis2_status_t auth_status; - auth_status = axis2_http_sender_configure_http_auth (sender, + auth_status = axis2_http_sender_configure_proxy_auth (sender, env, msg_ctx, request); if (auth_status != AXIS2_SUCCESS) - AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "Error in setting HTTP" + AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "Error in setting Proxy" " Authentication header"); - status_code = axis2_http_client_send (sender->client, - env, request, ssl_pp); + if (force_http_auth && !http_auth_header_added) + { + status_code = AXIS2_HTTP_RESPONSE_HTTP_UNAUTHORIZED_CODE_VAL; + } + else + { + /* how should this status_code be handled? */ + status_code = axis2_http_client_send (sender->client, env, request, ssl_pp); - status_code = axis2_http_client_recieve_header (sender->client, env); + status_code = axis2_http_client_recieve_header (sender->client, env); + if (AXIS2_HTTP_RESPONSE_PROXY_AUTHENTICATION_REQUIRED_CODE_VAL == status_code) + { + AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "Proxy Authentication failed"); + } + } + } + + if (AXIS2_HTTP_RESPONSE_HTTP_UNAUTHORIZED_CODE_VAL == status_code) + { + if (!http_auth_header_added) + { + axis2_status_t auth_status; + auth_status = axis2_http_sender_configure_http_auth (sender, + env, + msg_ctx, request); + + if (auth_status != AXIS2_SUCCESS) + AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "Error in setting HTTP" + " Authentication header"); + + status_code = axis2_http_client_send (sender->client, + env, request, ssl_pp); + + status_code = axis2_http_client_recieve_header (sender->client, env); + if (AXIS2_HTTP_RESPONSE_HTTP_UNAUTHORIZED_CODE_VAL == status_code) + { + AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "HTTP Authentication failed"); + } + if (AXIS2_HTTP_RESPONSE_PROXY_AUTHENTICATION_REQUIRED_CODE_VAL == status_code) + { + AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "Proxy Authentication failed"); + } + } + else + { + AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "HTTP Authentication failed"); + } } /*AXIS2_FREE(env->allocator, buffer); buffer = NULL; */ @@ -878,7 +982,7 @@ return AXIS2_SUCCESS; } -AXIS2_EXTERN axis2_status_t AXIS2_CALL + AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_http_sender_set_http_version (axis2_http_sender_t * sender, const axutil_env_t * env, axis2_char_t * version) @@ -947,7 +1051,14 @@ proxy_param = axutil_param_container_get_param (axis2_transport_out_desc_param_container (trans_desc, env), env, - AXIS2_HTTP_PROXY); + AXIS2_HTTP_PROXY_API); + if (!proxy_param) + { + proxy_param = + axutil_param_container_get_param + (axis2_transport_out_desc_param_container (trans_desc, env), env, + AXIS2_HTTP_PROXY); + } if (proxy_param) { transport_attrs = axutil_param_get_attributes (proxy_param, env); @@ -992,59 +1103,6 @@ } } } - else - { - proxy_param = - axutil_param_container_get_param - (axis2_transport_out_desc_param_container (trans_desc, env), env, - AXIS2_HTTP_PROXY_API); - if (proxy_param) - { - transport_attrs = axutil_param_get_attributes (proxy_param, env); - if (transport_attrs) - { - axutil_generic_obj_t *obj = NULL; - axiom_attribute_t *host_attr = NULL; - axiom_attribute_t *port_attr = NULL; - - obj = axutil_hash_get (transport_attrs, AXIS2_HTTP_PROXY_HOST, - AXIS2_HASH_KEY_STRING); - if (!obj) - { - return AXIS2_FAILURE; - } - host_attr = - (axiom_attribute_t *) axutil_generic_obj_get_value (obj, env); - if (!host_attr) - { - return AXIS2_FAILURE; - } - proxy_host = axiom_attribute_get_localname (host_attr, env); - if (!proxy_host) - { - return AXIS2_FAILURE; - } - /* Now we get the port */ - obj = NULL; - - obj = axutil_hash_get (transport_attrs, AXIS2_HTTP_PROXY_PORT, - AXIS2_HASH_KEY_STRING); - port_attr = - (axiom_attribute_t *) axutil_generic_obj_get_value (obj, env); - if (!port_attr) - { - return AXIS2_FAILURE; - } - - proxy_port = axiom_attribute_get_localname (port_attr, env); - if (!proxy_port) - { - return AXIS2_FAILURE; - } - - } - } - } if (proxy_port && proxy_host) { axis2_http_client_set_proxy (sender->client, env, proxy_host, @@ -1160,45 +1218,231 @@ { uname = (axis2_char_t *) axutil_property_get_value (http_auth_un, env); passwd = (axis2_char_t *) axutil_property_get_value (http_auth_pw, env); + } + if (!uname || !passwd) + { + axis2_conf_ctx_t *conf_ctx = NULL; + axis2_conf_t *conf = NULL; + axis2_transport_out_desc_t *trans_desc = NULL; + axutil_param_t *http_auth_param = NULL; + axutil_hash_t *transport_attrs = NULL; - if (uname && passwd) + conf_ctx = axis2_msg_ctx_get_conf_ctx (msg_ctx, env); + if (conf_ctx) { - int elen; - int plen = axutil_strlen (uname) + axutil_strlen (passwd) + 1; - axis2_char_t *to_encode = - (axis2_char_t - *) (AXIS2_MALLOC (env->allocator, sizeof (axis2_char_t) * plen)); - axis2_char_t *encoded = NULL; - axis2_char_t *auth_str = NULL; - sprintf (to_encode, "%s:%s", uname, passwd); - elen = axutil_base64_encode_len (plen); - encoded = (axis2_char_t *) (AXIS2_MALLOC (env->allocator, - sizeof (axis2_char_t) * - elen)); - auth_str = - (axis2_char_t - *) (AXIS2_MALLOC (env->allocator, - sizeof (axis2_char_t) * (elen + 6))); - axutil_base64_encode (encoded, to_encode, plen); - sprintf (auth_str, "%s %s", AXIS2_HTTP_AUTH_TYPE_BASIC, encoded); - axis2_http_sender_util_add_header (env, request, - AXIS2_HTTP_HEADER_AUTHORIZATION, - auth_str); - - AXIS2_FREE (env->allocator, to_encode); - to_encode = NULL; - AXIS2_FREE (env->allocator, encoded); - encoded = NULL; - AXIS2_FREE (env->allocator, auth_str); - auth_str = NULL; + conf = axis2_conf_ctx_get_conf (conf_ctx, env); + if (conf) + { + trans_desc = axis2_conf_get_transport_out (conf, + env, AXIS2_TRANSPORT_ENUM_HTTP); + } + } + if (trans_desc) + { + http_auth_param = + axutil_param_container_get_param + (axis2_transport_out_desc_param_container (trans_desc, env), env, + AXIS2_HTTP_AUTHENTICATION); + if (http_auth_param) + { + transport_attrs = axutil_param_get_attributes (http_auth_param, env); + if (transport_attrs) + { + axutil_generic_obj_t *obj = NULL; + axiom_attribute_t *username_attr = NULL; + axiom_attribute_t *password_attr = NULL; + + obj = axutil_hash_get (transport_attrs, AXIS2_HTTP_AUTHENTICATION_USERNAME, + AXIS2_HASH_KEY_STRING); + if (obj) + { + username_attr = (axiom_attribute_t *) axutil_generic_obj_get_value (obj, + env); + } + if (username_attr) + { + uname = axiom_attribute_get_value (username_attr, env); + } + obj = NULL; - return AXIS2_SUCCESS; + obj = axutil_hash_get (transport_attrs, AXIS2_HTTP_AUTHENTICATION_PASSWORD, + AXIS2_HASH_KEY_STRING); + if (obj) + { + password_attr = (axiom_attribute_t *) axutil_generic_obj_get_value (obj, + env); + } + if (password_attr) + { + passwd = axiom_attribute_get_value (password_attr, env); + } + } + } } } + if (uname && passwd) + { + int elen; + int plen = axutil_strlen (uname) + axutil_strlen (passwd) + 1; + axis2_char_t *to_encode = + (axis2_char_t + *) (AXIS2_MALLOC (env->allocator, sizeof (axis2_char_t) * plen)); + axis2_char_t *encoded = NULL; + axis2_char_t *auth_str = NULL; + sprintf (to_encode, "%s:%s", uname, passwd); + elen = axutil_base64_encode_len (plen); + encoded = (axis2_char_t *) (AXIS2_MALLOC (env->allocator, + sizeof (axis2_char_t) * + elen)); + auth_str = + (axis2_char_t + *) (AXIS2_MALLOC (env->allocator, + sizeof (axis2_char_t) * (elen + 6))); + axutil_base64_encode (encoded, to_encode, plen); + sprintf (auth_str, "%s %s", AXIS2_HTTP_AUTH_TYPE_BASIC, encoded); + axis2_http_sender_util_add_header (env, request, + AXIS2_HTTP_HEADER_AUTHORIZATION, + auth_str); + + AXIS2_FREE (env->allocator, to_encode); + to_encode = NULL; + AXIS2_FREE (env->allocator, encoded); + encoded = NULL; + AXIS2_FREE (env->allocator, auth_str); + auth_str = NULL; + + return AXIS2_SUCCESS; + } return AXIS2_FAILURE; } + +static axis2_status_t +axis2_http_sender_configure_proxy_basic_auth (axis2_http_sender_t * sender, + const axutil_env_t * env, + axis2_msg_ctx_t * msg_ctx, + axis2_http_simple_request_t * + request) +{ + axutil_property_t *proxy_auth_un = NULL; + axutil_property_t *proxy_auth_pw = NULL; + axis2_char_t *uname = NULL; + axis2_char_t *passwd = NULL; + + proxy_auth_un = axis2_msg_ctx_get_property (msg_ctx, env, + AXIS2_PROXY_AUTH_UNAME); + proxy_auth_pw = axis2_msg_ctx_get_property (msg_ctx, env, + AXIS2_PROXY_AUTH_PASSWD); + + if (proxy_auth_un && proxy_auth_pw) + { + uname = (axis2_char_t *) axutil_property_get_value (proxy_auth_un, env); + passwd = (axis2_char_t *) axutil_property_get_value (proxy_auth_pw, env); + } + if (!uname || !passwd) + { + axis2_conf_ctx_t *conf_ctx = NULL; + axis2_conf_t *conf = NULL; + axis2_transport_out_desc_t *trans_desc = NULL; + axutil_param_t *proxy_param = NULL; + axutil_hash_t *transport_attrs = NULL; + + conf_ctx = axis2_msg_ctx_get_conf_ctx (msg_ctx, env); + if (conf_ctx) + { + conf = axis2_conf_ctx_get_conf (conf_ctx, env); + if (conf) + { + trans_desc = axis2_conf_get_transport_out (conf, + env, AXIS2_TRANSPORT_ENUM_HTTP); + } + } + if (trans_desc) + { + proxy_param = + axutil_param_container_get_param + (axis2_transport_out_desc_param_container (trans_desc, env), env, + AXIS2_HTTP_PROXY_API); + if (!proxy_param) + { + proxy_param = + axutil_param_container_get_param + (axis2_transport_out_desc_param_container (trans_desc, env), env, + AXIS2_HTTP_PROXY); + } + if (proxy_param) + { + transport_attrs = axutil_param_get_attributes (proxy_param, env); + if (transport_attrs) + { + axutil_generic_obj_t *obj = NULL; + axiom_attribute_t *username_attr = NULL; + axiom_attribute_t *password_attr = NULL; + + obj = axutil_hash_get (transport_attrs, AXIS2_HTTP_PROXY_USERNAME, + AXIS2_HASH_KEY_STRING); + if (obj) + { + username_attr = (axiom_attribute_t *) axutil_generic_obj_get_value (obj, + env); + } + if (username_attr) + { + uname = axiom_attribute_get_value (username_attr, env); + } + obj = NULL; + + obj = axutil_hash_get (transport_attrs, AXIS2_HTTP_PROXY_PASSWORD, + AXIS2_HASH_KEY_STRING); + if (obj) + { + password_attr = (axiom_attribute_t *) axutil_generic_obj_get_value (obj, + env); + } + if (password_attr) + { + passwd = axiom_attribute_get_value (password_attr, env); + } + } + } + } + } + if (uname && passwd) + { + int elen; + int plen = axutil_strlen (uname) + axutil_strlen (passwd) + 1; + axis2_char_t *to_encode = + (axis2_char_t + *) (AXIS2_MALLOC (env->allocator, sizeof (axis2_char_t) * plen)); + axis2_char_t *encoded = NULL; + axis2_char_t *auth_str = NULL; + sprintf (to_encode, "%s:%s", uname, passwd); + elen = axutil_base64_encode_len (plen); + encoded = (axis2_char_t *) (AXIS2_MALLOC (env->allocator, + sizeof (axis2_char_t) * + elen)); + auth_str = + (axis2_char_t + *) (AXIS2_MALLOC (env->allocator, + sizeof (axis2_char_t) * (elen + 6))); + axutil_base64_encode (encoded, to_encode, plen); + sprintf (auth_str, "%s %s", AXIS2_PROXY_AUTH_TYPE_BASIC, encoded); + axis2_http_sender_util_add_header (env, request, + AXIS2_HTTP_HEADER_PROXY_AUTHORIZATION, + auth_str); + + AXIS2_FREE (env->allocator, to_encode); + to_encode = NULL; + AXIS2_FREE (env->allocator, encoded); + encoded = NULL; + AXIS2_FREE (env->allocator, auth_str); + auth_str = NULL; + + return AXIS2_SUCCESS; + } + return AXIS2_FAILURE; +} #endif #ifndef AXIS2_LIBCURL_ENABLED @@ -1212,6 +1456,17 @@ /*TODO: Implement Digest Auth */ return AXIS2_FAILURE; } + +static axis2_status_t +axis2_http_sender_configure_proxy_digest_auth (axis2_http_sender_t * sender, + const axutil_env_t * env, + axis2_msg_ctx_t * msg_ctx, + axis2_http_simple_request_t * + request) +{ + /*TODO: Implement Digest Auth */ + return AXIS2_FAILURE; +} #endif #ifndef AXIS2_LIBCURL_ENABLED @@ -1221,29 +1476,61 @@ axis2_msg_ctx_t * msg_ctx, axis2_http_simple_request_t * request) { - axis2_status_t status = AXIS2_FALSE; axis2_char_t *auth_type = NULL; - axis2_http_header_t *auth_header = NULL; - axis2_http_simple_response_t *response = NULL; - axis2_char_t *auth_type_end = NULL; + axis2_status_t status = AXIS2_FALSE; + axutil_property_t *http_auth_property = NULL; + axis2_char_t *http_auth_property_value = NULL; + axis2_bool_t force_http_auth = AXIS2_FALSE; + axutil_property_t *http_auth_type_property = NULL; + axis2_char_t *http_auth_type_property_value = NULL; - response = axis2_http_client_get_response (sender->client, env); + http_auth_property = (axutil_property_t *) axis2_msg_ctx_get_property (msg_ctx, env, + AXIS2_FORCE_HTTP_AUTH); + if (http_auth_property) + http_auth_property_value = (axis2_char_t *) axutil_property_get_value (http_auth_property, + env); - if (response) - auth_header = axis2_http_simple_response_get_first_header (response, env, - AXIS2_HTTP_HEADER_WWW_AUTHENTICATE); + if (http_auth_property_value && 0 == axutil_strcmp (http_auth_property_value, AXIS2_VALUE_TRUE)) + { + force_http_auth = AXIS2_TRUE; + } - if (auth_header) - auth_type = axis2_http_header_get_value (auth_header, env); + if (force_http_auth) + { + http_auth_type_property = (axutil_property_t *) axis2_msg_ctx_get_property (msg_ctx, env, + AXIS2_HTTP_AUTH_TYPE); + if (http_auth_type_property) + http_auth_type_property_value = (axis2_char_t *) axutil_property_get_value (http_auth_type_property, + env); - if (auth_type) + if (http_auth_type_property_value) + { + auth_type = http_auth_type_property_value; + } + } + else { - auth_type_end = axutil_strchr (auth_type, ' '); - *auth_type_end = '\0'; - auth_type_end++; - /*Read the realm and the rest stuff now from auth_type_end */ + axis2_http_header_t *auth_header = NULL; + axis2_http_simple_response_t *response = NULL; + axis2_char_t *auth_type_end = NULL; + + response = axis2_http_client_get_response (sender->client, env); + + if (response) + auth_header = axis2_http_simple_response_get_first_header (response, env, + AXIS2_HTTP_HEADER_WWW_AUTHENTICATE); + + if (auth_header) + auth_type = axis2_http_header_get_value (auth_header, env); + + if (auth_type) + { + auth_type_end = axutil_strchr (auth_type, ' '); + *auth_type_end = '\0'; + auth_type_end++; + /*Read the realm and the rest stuff now from auth_type_end */ + } } - if (auth_type) { if (axutil_strcmp (auth_type, AXIS2_HTTP_AUTH_TYPE_BASIC) == 0) @@ -1252,6 +1539,90 @@ request); else if (axutil_strcmp (auth_type, AXIS2_HTTP_AUTH_TYPE_DIGEST) == 0) status = axis2_http_sender_configure_http_digest_auth (sender, env, + msg_ctx, + request); + else + AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "Authtype %s is not" + "supported", auth_type); + } + else + { + AXIS2_ERROR_SET (env->error, AXIS2_ERROR_HTTP_CLIENT_TRANSPORT_ERROR, + AXIS2_FAILURE); + } + + return status; +} + +static axis2_status_t +axis2_http_sender_configure_proxy_auth (axis2_http_sender_t * sender, + const axutil_env_t * env, + axis2_msg_ctx_t * msg_ctx, + axis2_http_simple_request_t * request) +{ + axis2_char_t *auth_type = NULL; + axis2_status_t status = AXIS2_FALSE; + axutil_property_t *proxy_auth_property = NULL; + axis2_char_t *proxy_auth_property_value = NULL; + axis2_bool_t force_proxy_auth = AXIS2_FALSE; + axutil_property_t *proxy_auth_type_property = NULL; + axis2_char_t *proxy_auth_type_property_value = NULL; + + proxy_auth_property = (axutil_property_t *) axis2_msg_ctx_get_property (msg_ctx, env, + AXIS2_FORCE_PROXY_AUTH); + if (proxy_auth_property) + proxy_auth_property_value = (axis2_char_t *) axutil_property_get_value (proxy_auth_property, + env); + + if (proxy_auth_property_value && 0 == axutil_strcmp (proxy_auth_property_value, AXIS2_VALUE_TRUE)) + { + force_proxy_auth = AXIS2_TRUE; + } + + if (force_proxy_auth) + { + proxy_auth_type_property = (axutil_property_t *) axis2_msg_ctx_get_property (msg_ctx, env, + AXIS2_PROXY_AUTH_TYPE); + if (proxy_auth_type_property) + proxy_auth_type_property_value = (axis2_char_t *) axutil_property_get_value (proxy_auth_type_property, + env); + + if (proxy_auth_type_property_value) + { + auth_type = proxy_auth_type_property_value; + } + } + else + { + axis2_http_header_t *auth_header = NULL; + axis2_http_simple_response_t *response = NULL; + axis2_char_t *auth_type_end = NULL; + + response = axis2_http_client_get_response (sender->client, env); + + if (response) + auth_header = axis2_http_simple_response_get_first_header (response, env, + AXIS2_HTTP_HEADER_PROXY_AUTHENTICATE); + + if (auth_header) + auth_type = axis2_http_header_get_value (auth_header, env); + + if (auth_type) + { + auth_type_end = axutil_strchr (auth_type, ' '); + *auth_type_end = '\0'; + auth_type_end++; + /*Read the realm and the rest stuff now from auth_type_end */ + } + } + if (auth_type) + { + if (axutil_strcmp (auth_type, AXIS2_PROXY_AUTH_TYPE_BASIC) == 0) + status = axis2_http_sender_configure_proxy_basic_auth (sender, env, + msg_ctx, + request); + else if (axutil_strcmp (auth_type, AXIS2_PROXY_AUTH_TYPE_DIGEST) == 0) + status = axis2_http_sender_configure_proxy_digest_auth (sender, env, msg_ctx, request); else --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]