AXIS2_EXTERN axutil_url_t *AXIS2_CALL axutil_url_clone( axutil_url_t *url, const axutil_env_t *env) { axis2_char_t *temp = NULL; axutil_url_t *ret = NULL; AXIS2_ENV_CHECK(env, NULL); AXIS2_PARAM_CHECK(env->error, url, NULL); if(url->path && url->query) { temp = axutil_stracat(env, url->path, url->query); } else if(url->path) { temp = axutil_strdup(env, url->path); } else if(url->query) { temp = axutil_strdup(env, url->query); } ret = axutil_url_create(env, url->protocol, url->host, url->port, url->path); if(temp) { AXIS2_FREE(env->allocator, temp); } return ret; }
axis2_endpoint_ref_t *AXIS2_CALL axis2_tcp_server_get_reply_to_epr( axis2_transport_receiver_t * server, const axutil_env_t * env, const axis2_char_t * svc_name) { axis2_endpoint_ref_t *epr = NULL; const axis2_char_t *host_address = NULL; axis2_char_t *svc_path = NULL; axutil_url_t *url = NULL; AXIS2_ENV_CHECK(env, NULL); AXIS2_PARAM_CHECK(env->error, svc_name, NULL); host_address = "127.0.0.1"; /* TODO : get from axis2.xml */ svc_path = axutil_stracat(env, "/axis2/services/", svc_name); url = axutil_url_create(env, "tcp", host_address, AXIS2_INTF_TO_IMPL(server)->port, svc_path); AXIS2_FREE(env->allocator, svc_path); if (!url) { return NULL; } epr = axis2_endpoint_ref_create(env, axutil_url_to_external_form(url, env)); axutil_url_free(url, env); return epr; }
axis2_endpoint_ref_t *AXIS2_CALL axis2_udp_receiver_get_reply_to_epr( axis2_transport_receiver_t * receiver, const axutil_env_t * env, const axis2_char_t * svc_name) { axis2_endpoint_ref_t *epr = NULL; const axis2_char_t *host_address = NULL; axis2_char_t *svc_path = NULL; axutil_url_t *url = NULL; AXIS2_PARAM_CHECK(env->error, svc_name, NULL); AXIS2_PARAM_CHECK(env->error, receiver, NULL); host_address = AXIS2_DEFAULT_HOST_ADDRESS; /* TODO : get from axis2.xml */ svc_path = axutil_stracat(env, AXIS2_DEFAULT_SVC_PATH, svc_name); url = axutil_url_create(env, "soap.udp", host_address, AXIS2_INTF_TO_IMPL(receiver)->port, svc_path); AXIS2_FREE(env->allocator, svc_path); if (!url) { return NULL; } epr = axis2_endpoint_ref_create(env, axutil_url_to_external_form(url, env)); axutil_url_free(url, env); return epr; }
AXIS2_EXTERN axutil_url_t *AXIS2_CALL axutil_url_parse_string( const axutil_env_t *env, const axis2_char_t *str_url) { /** * Only accepted format is : * protocol://host:port/path * Added file:///path * port is optional and the default port is assumed * if path is not present / (root) is assumed */ axis2_char_t *tmp_url_str = NULL; axutil_url_t *ret = NULL; const axis2_char_t *protocol = NULL; axis2_char_t *path = NULL; axis2_char_t *port_str = NULL; axis2_char_t *host = NULL; int port = 0; AXIS2_ENV_CHECK(env, NULL); AXIS2_PARAM_CHECK(env->error, str_url, NULL); tmp_url_str = axutil_strdup(env, str_url); if(!tmp_url_str) { return NULL; } protocol = tmp_url_str; host = strstr(tmp_url_str, "://"); if(!host) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_ADDRESS, AXIS2_FAILURE); AXIS2_FREE(env->allocator, tmp_url_str); return NULL; } if(axutil_strlen(host) < 3 * sizeof(axis2_char_t)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_ADDRESS, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid IP or hostname"); AXIS2_FREE(env->allocator, tmp_url_str); return NULL; } *host = '\0'; host += 3 * sizeof(axis2_char_t); /* skip "://" part */ if(axutil_strlen(host) <= 0) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_ADDRESS, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid IP or hostname"); AXIS2_FREE(env->allocator, tmp_url_str); return NULL; } /* if the url is file:// thing we need the protocol and * path only */ if(0 == axutil_strcasecmp(protocol, (const axis2_char_t *)"file")) { ret = axutil_url_create(env, protocol, NULL, 0, host); AXIS2_FREE(env->allocator, tmp_url_str); return ret; } port_str = strchr(host, ':'); if(!port_str) { path = strchr(host, '/'); if(!path) { path = strchr(host, '?'); } else { *path++ = '\0'; } if(!path) { path = strchr(host, '#'); } if(!path) { /* No path - assume def path ('/') */ /* here we have protocol + host + def port + def path */ ret = axutil_url_create(env, protocol, host, port, "/"); AXIS2_FREE(env->allocator, tmp_url_str); return ret; } else { axis2_char_t *path_temp = NULL; path_temp = axutil_strdup(env, path); *path = '\0'; /* here we have protocol + host + def port + path */ ret = axutil_url_create(env, protocol, host, port, path_temp); AXIS2_FREE(env->allocator, tmp_url_str); AXIS2_FREE(env->allocator, path_temp); return ret; } } else { *port_str++ = '\0'; path = strchr(port_str, '/'); if(!path) { path = strchr(port_str, '?'); if(path) { *path = '\0'; port = AXIS2_ATOI(port_str); *path = '?'; } } else { *path++ = '\0'; port = AXIS2_ATOI(port_str); } if(!path) { path = strchr(port_str, '#'); if(path) { *path = '\0'; port = AXIS2_ATOI(port_str); *path = '#'; } } if(!path) { port = AXIS2_ATOI(port_str); /* here we have protocol + host + port + def path */ ret = axutil_url_create(env, protocol, host, port, "/"); AXIS2_FREE(env->allocator, tmp_url_str); return ret; } else { if(axutil_strlen(path) > 0) { axis2_char_t *path_temp = NULL; path_temp = axutil_strdup(env, path); *path = '\0'; /* here we have protocol + host + port + path */ ret = axutil_url_create(env, protocol, host, port, path_temp); AXIS2_FREE(env->allocator, tmp_url_str); AXIS2_FREE(env->allocator, path_temp); return ret; } else { /* here we have protocol + host + port + def path */ ret = axutil_url_create(env, protocol, host, port, "/"); AXIS2_FREE(env->allocator, tmp_url_str); return ret; } } } }