static globus_result_t globus_l_xio_test_read_buffer( globus_xio_handle_t handle, globus_byte_t * msg, globus_size_t msg_size) { globus_size_t nbytes; globus_result_t result = GLOBUS_SUCCESS; globus_byte_t * temp; int i; GlobusXIOName(globus_l_xio_test_read_buffer); temp = globus_libc_malloc(msg_size+1); for (i=0; i<=msg_size; i++) temp[i] = '\0'; result = globus_xio_read( handle, temp, msg_size, msg_size, &nbytes, NULL); if (result != GLOBUS_SUCCESS) { fprintf(stderr, "Error reading from http: %s\n", globus_object_printable_to_string(globus_error_peek(result))); } result = globus_xio_read( handle, msg, msg_size, 1, &nbytes, NULL); if (http_is_eof(result)) { result = GLOBUS_SUCCESS; } return result; }
int client_test( http_test_info_t * info, int timer) { int rc = 0; globus_result_t result; int header_cnt = 0; char content_length_buffer[64]; globus_xio_http_header_t headers[2]; globus_xio_handle_t handle; int i; size_t nbytes; globus_xio_data_descriptor_t descriptor; int status_code; char * reason_phrase; globus_utp_start_timer(timer); if (info->transfer_encoding != NULL) { headers[header_cnt].name = "Transfer-Encoding"; headers[header_cnt].value = info->transfer_encoding; header_cnt++; } if ((info->version == GLOBUS_XIO_HTTP_VERSION_1_0) || ((info->transfer_encoding != NULL) && strcmp(info->transfer_encoding, IDENTITY) == 0)) { sprintf(content_length_buffer, "%lu", (unsigned long) info->size); headers[header_cnt].name = "Content-Length"; headers[header_cnt].value = &content_length_buffer[0]; header_cnt++; } handle = NULL; result = http_test_client_request( &handle, info->tcp_driver, info->http_driver, info->stack, info->contact, "%2fpost-test", "POST", info->version, headers, header_cnt); if (result != GLOBUS_SUCCESS) { fprintf(stderr, "Error making request: %s\n", globus_object_printable_to_string( globus_error_get(result))); rc = 50; goto error_exit; } for (i = 0; i < info->iterations; i++) { result = globus_xio_write( handle, info->buffer, info->size, info->size, &nbytes, NULL); if (result == GLOBUS_SUCCESS) { if (nbytes != info->size) { fprintf(stderr, "Didn't write all I expected.\n"); } } else { fprintf(stderr, "Error writing data: %s\n", globus_object_printable_to_string(globus_error_peek(result))); } } globus_xio_handle_cntl( handle, info->http_driver, GLOBUS_XIO_HTTP_HANDLE_SET_END_OF_ENTITY); /* READ RESPONSE */ result = globus_xio_data_descriptor_init(&descriptor, handle); if (result != GLOBUS_SUCCESS) { rc = 51; goto close_exit; } result = globus_xio_read( handle, info->buffer, 0, 0, NULL, descriptor); if (result != GLOBUS_SUCCESS) { rc = 51; goto close_exit; } result = globus_xio_data_descriptor_cntl( descriptor, info->http_driver, GLOBUS_XIO_HTTP_GET_RESPONSE, &status_code, &reason_phrase, NULL, NULL); if (result != GLOBUS_SUCCESS || status_code < 200 || status_code > 299) { fprintf(stderr, "Get failed with \"%03d %s\"\n", status_code, reason_phrase); rc = 51; goto close_exit; } result = globus_xio_read( handle, info->buffer, info->size, 1, &nbytes, NULL); if (result && !http_is_eof(result)) { fprintf(stderr, "Error reading eof from http: %s\n", globus_error_print_friendly(globus_error_get(result))); } close_exit: globus_xio_close(handle, NULL); globus_utp_stop_timer(timer); error_exit: return rc; }
static void globus_l_xio_test_server_request_callback( void * user_arg, globus_result_t result, const char * method, const char * uri, globus_xio_http_version_t http_version, globus_hashtable_t headers) { http_test_server_t * test_server; http_test_info_t * info; globus_xio_http_header_t response_headers[2]; globus_size_t header_cnt=0; char content_length_buffer[64]; int rc=0; int i; size_t nbytes; test_server = (http_test_server_t*) user_arg; info = test_server->info; if (result == GLOBUS_SUCCESS && method != NULL && uri != NULL && (strcmp(method, "POST") == 0) && (strcmp(uri, "/post-test") == 0)) { for (i = 0; i < info->iterations; i++) { result = globus_xio_read( test_server->handle, info->buffer, info->size, info->size, &nbytes, NULL); if (result != GLOBUS_SUCCESS || nbytes != info->size) { fprintf(stderr, "Error reading from http: %s\n", globus_object_printable_to_string( globus_error_peek(result))); } } } else { rc = 404; goto error_respond_exit; } result = globus_xio_read( test_server->handle, info->buffer, info->size, 1, &nbytes, NULL); if (result && !http_is_eof(result)) { fprintf(stderr, "Error reading eof from http: %s\n", globus_error_print_friendly(globus_error_get(result))); } if (info->transfer_encoding != NULL) { response_headers[header_cnt].name = "Transfer-Encoding"; response_headers[header_cnt].value = info->transfer_encoding; header_cnt++; } if ((http_version == GLOBUS_XIO_HTTP_VERSION_1_0) || ((info->transfer_encoding != NULL) && strcmp(info->transfer_encoding, IDENTITY) == 0)) { sprintf(content_length_buffer, "%lu", (unsigned long) info->size); response_headers[header_cnt].name = "Content-Length"; response_headers[header_cnt].value = &content_length_buffer[0]; header_cnt++; } result = http_test_server_respond( test_server, rc, NULL, response_headers, header_cnt); if (result != GLOBUS_SUCCESS) { goto error_exit; } result = globus_xio_write( test_server->handle, info->buffer, 1, 1, &nbytes, NULL); globus_xio_handle_cntl( test_server->handle, info->http_driver, GLOBUS_XIO_HTTP_HANDLE_SET_END_OF_ENTITY); info->size = throughput_next_size(info->size); if (info->size == -1) { http_test_server_close_handle(test_server); http_test_server_shutdown(test_server); } return; error_respond_exit: http_test_server_respond( test_server, rc, NULL, NULL, 0); error_exit: http_test_server_close_handle(test_server); http_test_server_shutdown(test_server); }
static globus_result_t globus_l_xio_test_read_buffer( globus_xio_handle_t handle, globus_byte_t * message, globus_size_t message_size, globus_size_t buffer_size) { globus_size_t offset=0; globus_size_t left = message_size; globus_size_t to_read; globus_size_t nbytes; globus_result_t result = GLOBUS_SUCCESS; globus_byte_t * buffer; GlobusXIOName(globus_l_xio_test_read_buffer); if (buffer_size == 0) { buffer_size = 1024; } buffer = malloc(buffer_size); if (buffer == NULL) { result = GlobusXIOErrorMemory("buffer"); } while ((left > 0) || (result == GLOBUS_SUCCESS)) { nbytes = 0; to_read = (left > buffer_size) ? buffer_size : (left > 0 ? left : buffer_size); result = globus_xio_read( handle, buffer, buffer_size, 1, &nbytes, NULL); if (nbytes > 0) { if (left > 0) { if (memcmp(message+offset, buffer, nbytes) != 0) { fprintf(stderr, "File doesn't match\n"); result = GlobusXIOErrorParameter("buffer"); } left -= nbytes; } else { fprintf(stderr, "File doesn't match\n"); result = GlobusXIOErrorParameter("buffer"); } offset += nbytes; } } if (offset == message_size && http_is_eof(result)) { result = GLOBUS_SUCCESS; } else if (result != GLOBUS_SUCCESS) { fprintf(stderr, "Error reading from http: %s\n", globus_object_printable_to_string(globus_error_peek(result))); fprintf(stderr, "after reading %lu of %lu bytes\n", (unsigned long) offset, (unsigned long) message_size); } return result; }