/** * Destroy an HTTP handle * @ingroup globus_i_xio_http_handle * * Frees all storage associated with an HTTP handle. The handle must * not be used after this function returns. * * @param http_handle * Handle to be destroyed. * * @return void */ void globus_i_xio_http_handle_destroy( globus_i_xio_http_handle_t * http_handle) { int i; globus_mutex_destroy(&http_handle->mutex); globus_i_xio_http_request_destroy(&http_handle->request_info); globus_i_xio_http_response_destroy(&http_handle->response_info); globus_i_xio_http_target_destroy_internal(&http_handle->target_info); if (http_handle->header_iovec != NULL) { for (i = 0; i < http_handle->header_iovcnt; i++) { globus_libc_free(http_handle->header_iovec[i].iov_base); } globus_libc_free(http_handle->header_iovec); } if (http_handle->read_buffer.iov_base != NULL) { globus_libc_free(http_handle->read_buffer.iov_base); } if (http_handle->close_operation != NULL) { globus_xio_driver_operation_destroy(http_handle->close_operation); } }
/** * Destroy an HTTP attribute * @ingroup globus_i_xio_http_attr * * Frees all storage associated with an HTTP attribute. No further * handle controls may be called on this attribute. This is called by the XIO * driver via globus_xio_attr_destroy(). * * @param driver_attr * Void pointer to a #globus_i_xio_http_attr_t structure to be destroyed. * * @return This function always returns GLOBUS_SUCCESS. * * @see globus_i_xio_http_attr_init() */ globus_result_t globus_i_xio_http_attr_destroy( void * driver_attr) { globus_i_xio_http_attr_t * attr = driver_attr; GlobusXIOName(globus_i_xio_http_attr_destroy); globus_i_xio_http_request_destroy(&attr->request); globus_i_xio_http_response_destroy(&attr->response); globus_libc_free(attr); return GLOBUS_SUCCESS; }
/** * Allocate and initialize an HTTP handle * @ingroup globus_i_xio_http_handle * * Creates a new handle with values derived from the attr and target. This * is called internally by the HTTP driver's open implementation. * * @param http_handle * Pointer to an uninitialized handle. * @param attr * HTTP attributes associated with open operation. * @param target * Target which is being opened. * * This function may return GLOBUS_SUCCESS, or an error generated by * globus_i_xio_http_response_init(), globus_i_xio_http_request_copy(), * or globus_i_xio_http_target_copy(). */ globus_result_t globus_i_xio_http_handle_init( globus_i_xio_http_handle_t * http_handle, globus_i_xio_http_attr_t * attr, globus_i_xio_http_target_t * target) { globus_result_t result; int rc; GlobusXIOName(globus_i_xio_http_handle_init); rc = globus_mutex_init(&http_handle->mutex, NULL); if (rc != 0) { result = GlobusXIOErrorMemory("mutex"); goto error_exit; } if (target->is_client && attr != NULL) { result = globus_i_xio_http_request_copy( &http_handle->request_info, &attr->request); } else { result = globus_i_xio_http_request_init(&http_handle->request_info); } if (target->is_client) { http_handle->parse_state = GLOBUS_XIO_HTTP_STATUS_LINE; http_handle->send_state = GLOBUS_XIO_HTTP_PRE_REQUEST_LINE; } else { http_handle->parse_state = GLOBUS_XIO_HTTP_PRE_REQUEST_LINE; http_handle->send_state = GLOBUS_XIO_HTTP_STATUS_LINE; } if (result != GLOBUS_SUCCESS) { goto free_mutex_exit; } result = globus_i_xio_http_response_init(&http_handle->response_info); if (result != GLOBUS_SUCCESS) { goto free_request_exit; } result = globus_i_xio_http_target_copy(&http_handle->target_info, target); if (result != GLOBUS_SUCCESS) { goto free_response_exit; } http_handle->header_iovec = NULL; http_handle->header_iovcnt = 0; http_handle->read_buffer.iov_base = NULL; http_handle->read_buffer.iov_len = 0; http_handle->close_operation = NULL; http_handle->response_read_operation = NULL; http_handle->read_operation.iov = NULL; http_handle->read_operation.iovcnt = 0; http_handle->read_operation.operation = NULL; http_handle->read_operation.driver_handle = NULL; http_handle->read_operation.nbytes = 0; http_handle->write_operation.iov = NULL; http_handle->write_operation.iovcnt = 0; http_handle->write_operation.operation = NULL; http_handle->write_operation.driver_handle = NULL; http_handle->write_operation.nbytes = 0; http_handle->user_close = GLOBUS_FALSE; http_handle->read_response = GLOBUS_FALSE; return GLOBUS_SUCCESS; free_response_exit: globus_i_xio_http_response_destroy(&http_handle->response_info); free_request_exit: globus_i_xio_http_request_destroy(&http_handle->request_info); free_mutex_exit: globus_mutex_destroy(&http_handle->mutex); error_exit: return result; }
globus_result_t globus_i_xio_http_handle_reinit( globus_i_xio_http_handle_t * http_handle, globus_i_xio_http_attr_t * http_attr, globus_i_xio_http_target_t * http_target) { globus_result_t result; GlobusXIOName(globus_i_xio_http_handle_reinit); if (http_target && http_target->is_client && http_attr != NULL) { globus_i_xio_http_request_destroy(&http_handle->request_info); result = globus_i_xio_http_request_copy( &http_handle->request_info, &http_attr->request); } else { globus_i_xio_http_request_destroy(&http_handle->request_info); result = globus_i_xio_http_request_init(&http_handle->request_info); } if (http_target && http_target->is_client) { http_handle->send_state = GLOBUS_XIO_HTTP_PRE_REQUEST_LINE; } else { http_handle->send_state = GLOBUS_XIO_HTTP_STATUS_LINE; } if (result != GLOBUS_SUCCESS) { goto free_mutex_exit; } globus_i_xio_http_response_destroy(&http_handle->response_info); result = globus_i_xio_http_response_init(&http_handle->response_info); if (result != GLOBUS_SUCCESS) { goto free_request_exit; } globus_i_xio_http_target_destroy_internal(&http_handle->target_info); if (http_target) { result = globus_i_xio_http_target_copy( &http_handle->target_info, http_target); if (result != GLOBUS_SUCCESS) { goto free_response_exit; } } http_handle->header_iovec = NULL; http_handle->header_iovcnt = 0; http_handle->close_operation = NULL; http_handle->read_operation.iov = NULL; http_handle->read_operation.iovcnt = 0; http_handle->read_operation.operation = NULL; http_handle->read_operation.driver_handle = NULL; http_handle->read_operation.nbytes = 0; http_handle->write_operation.iov = NULL; http_handle->write_operation.iovcnt = 0; http_handle->write_operation.operation = NULL; http_handle->write_operation.driver_handle = NULL; http_handle->write_operation.nbytes = 0; http_handle->user_close = GLOBUS_FALSE; http_handle->read_response = GLOBUS_FALSE; return GLOBUS_SUCCESS; free_response_exit: globus_i_xio_http_response_destroy(&http_handle->response_info); free_request_exit: globus_i_xio_http_request_destroy(&http_handle->request_info); free_mutex_exit: globus_mutex_destroy(&http_handle->mutex); return result; }