/**************************************************************************//** * Send a GET request to the HTTP server. * * @param p_ctx The reader context. * @return The resulting status of the function. */ static VC_CONTAINER_STATUS_T io_http_send_get_request(VC_CONTAINER_IO_T *p_ctx, size_t size) { VC_CONTAINER_IO_MODULE_T *module = p_ctx->module; char *ptr = module->comms_buffer, *end = ptr + sizeof(module->comms_buffer); int64_t end_offset; ptr += snprintf(ptr, end - ptr, HTTP_REQUEST_LINE_FORMAT, GET_METHOD, vc_uri_path(p_ctx->uri_parts), vc_uri_host(p_ctx->uri_parts)); end_offset = module->cur_offset + size - 1; if (end_offset >= p_ctx->size) end_offset = p_ctx->size - 1; if (ptr < end) ptr += snprintf(ptr, end - ptr, HTTP_RANGE_REQUEST, module->cur_offset, end_offset); if (ptr < end) ptr += snprintf(ptr, end - ptr, TRAILING_HEADERS_FORMAT); if (ptr >= end) { LOG_ERROR(0, "comms buffer too small (%i/%u)", (int)(end - ptr), sizeof(module->comms_buffer)); return VC_CONTAINER_ERROR_OUT_OF_RESOURCES; } if (ENABLE_HTTP_EXTRA_LOGGING) LOG_DEBUG(NULL, "Sending server read request:\n%s\n---------------------\n", module->comms_buffer); return io_http_send(p_ctx); }
static int check_null_uri_pointer(void) { int error_count = 0; char buffer[1]; /* Check NULL URI can be passed without failure to all routines */ vc_uri_release( NULL ); vc_uri_clear( NULL ); if (vc_uri_parse( NULL, NULL )) error_count++; if (vc_uri_parse( NULL, "" )) error_count++; if (vc_uri_build( NULL, NULL, 0 ) != 0) error_count++; buffer[0] = TEST_CHAR; if (vc_uri_build( NULL, buffer, sizeof(buffer) ) != 0) error_count++; if (buffer[0] != TEST_CHAR) error_count++; if (vc_uri_scheme( NULL )) error_count++; if (vc_uri_userinfo( NULL )) error_count++; if (vc_uri_host( NULL )) error_count++; if (vc_uri_port( NULL )) error_count++; if (vc_uri_path( NULL )) error_count++; if (vc_uri_fragment( NULL )) error_count++; if (vc_uri_num_queries( NULL ) != 0) error_count++; vc_uri_query( NULL, 0, NULL, NULL ); if (vc_uri_set_scheme( NULL, NULL )) error_count++; if (vc_uri_set_userinfo( NULL, NULL )) error_count++; if (vc_uri_set_host( NULL, NULL )) error_count++; if (vc_uri_set_port( NULL, NULL )) error_count++; if (vc_uri_set_path( NULL, NULL )) error_count++; if (vc_uri_set_fragment( NULL, NULL )) error_count++; if (vc_uri_add_query( NULL, NULL, NULL )) error_count++; if (error_count) LOG_ERROR(NULL, "NULL URI parameter testing failed"); return error_count; }
/** Dump a URI structure to the log. * * \param uri URI structure to be dumped. */ static void dump_uri(VC_URI_PARTS_T *uri) { const char *str; uint32_t query_count, ii; str = vc_uri_scheme(uri); if (str) LOG_DEBUG(NULL, "Scheme: <%s>", str); str = vc_uri_userinfo(uri); if (str) LOG_DEBUG(NULL, "Userinfo: <%s>", str); str = vc_uri_host(uri); if (str) LOG_DEBUG(NULL, "Host: <%s>", str); str = vc_uri_port(uri); if (str) LOG_DEBUG(NULL, "Port: <%s>", str); str = vc_uri_path(uri); if (str) LOG_DEBUG(NULL, "Path: <%s>", str); query_count = vc_uri_num_queries(uri); for (ii = 0; ii < query_count; ii++) { const char *value; vc_uri_query(uri, ii, &str, &value); if (str) { if (value) LOG_DEBUG(NULL, "Query %d: <%s>=<%s>", ii, str, value); else LOG_DEBUG(NULL, "Query %d: <%s>", ii, str); } } str = vc_uri_fragment(uri); if (str) LOG_DEBUG(NULL, "Fragment: <%s>", str); }
/**************************************************************************//** * Send a HEAD request to the HTTP server. * * @param p_ctx The reader context. * @return The resulting status of the function. */ static VC_CONTAINER_STATUS_T io_http_send_head_request(VC_CONTAINER_IO_T *p_ctx) { VC_CONTAINER_IO_MODULE_T *module = p_ctx->module; char *ptr = module->comms_buffer, *end = ptr + sizeof(module->comms_buffer); ptr += snprintf(ptr, end - ptr, HTTP_REQUEST_LINE_FORMAT, HEAD_METHOD, vc_uri_path(p_ctx->uri_parts), vc_uri_host(p_ctx->uri_parts)); if (ptr < end) ptr += snprintf(ptr, end - ptr, TRAILING_HEADERS_FORMAT); if (ptr >= end) { LOG_ERROR(0, "comms buffer too small (%i/%u)", (int)(end - ptr), sizeof(module->comms_buffer)); return VC_CONTAINER_ERROR_OUT_OF_RESOURCES; } return io_http_send(p_ctx); }
static VC_CONTAINER_STATUS_T io_http_open_socket(VC_CONTAINER_IO_T *ctx) { VC_CONTAINER_IO_MODULE_T *module = ctx->module; VC_CONTAINER_STATUS_T status; const char *host, *port; /* Treat empty host or port strings as not defined */ port = vc_uri_port(ctx->uri_parts); if (port && !*port) port = NULL; /* Require the port to be defined */ if (!port) { status = VC_CONTAINER_ERROR_URI_OPEN_FAILED; goto error; } host = vc_uri_host(ctx->uri_parts); if (host && !*host) host = NULL; if (!host) { status = VC_CONTAINER_ERROR_URI_OPEN_FAILED; goto error; } module->sock = vc_container_net_open(host, port, VC_CONTAINER_NET_OPEN_FLAG_STREAM, NULL); if (!module->sock) { status = VC_CONTAINER_ERROR_URI_NOT_FOUND; goto error; } return VC_CONTAINER_SUCCESS; error: return status; }
static int check_get_defaults(VC_URI_PARTS_T *uri) { int error_count = 0; const char *name = NULL, *value = NULL; char buffer[1]; if (vc_uri_scheme( uri )) error_count++; if (vc_uri_userinfo( uri )) error_count++; if (vc_uri_host( uri )) error_count++; if (vc_uri_port( uri )) error_count++; if (vc_uri_path( uri )) error_count++; if (vc_uri_fragment( uri )) error_count++; if (vc_uri_num_queries( uri ) != 0) error_count++; vc_uri_query( uri, 0, &name, &value ); if (name != NULL || value != NULL) error_count++; if (vc_uri_build(uri, NULL, 0) != 0) error_count++; buffer[0] = ~*TEST_STRING; /* Initialize with something */ vc_uri_build(uri, buffer, sizeof(buffer)); if (buffer[0] != '\0') /* Expect empty string */ error_count++; if (error_count) LOG_ERROR(NULL, "Getting default values gave unexpected values"); return error_count; }
static int check_accessors(VC_URI_PARTS_T *uri) { int error_count = 0; const char *str; if (vc_uri_set_scheme( uri, TEST_STRING )) { str = vc_uri_scheme(uri); if (!str || strcmp(TEST_STRING, str)) error_count++; if (!vc_uri_set_scheme( uri, NULL )) error_count++; if (vc_uri_scheme(uri)) error_count++; } else error_count++; if (vc_uri_set_userinfo( uri, TEST_STRING )) { str = vc_uri_userinfo(uri); if (!str || strcmp(TEST_STRING, str)) error_count++; if (!vc_uri_set_userinfo( uri, NULL )) error_count++; if (vc_uri_userinfo(uri)) error_count++; } else error_count++; if (vc_uri_set_host( uri, TEST_STRING )) { str = vc_uri_host(uri); if (!str || strcmp(TEST_STRING, str)) error_count++; if (!vc_uri_set_host( uri, NULL )) error_count++; if (vc_uri_host(uri)) error_count++; } else error_count++; if (vc_uri_set_port( uri, TEST_STRING )) { str = vc_uri_port(uri); if (!str || strcmp(TEST_STRING, str)) error_count++; if (!vc_uri_set_port( uri, NULL )) error_count++; if (vc_uri_port(uri)) error_count++; } else error_count++; if (vc_uri_set_path( uri, TEST_STRING )) { str = vc_uri_path(uri); if (!str || strcmp(TEST_STRING, str)) error_count++; if (!vc_uri_set_path( uri, NULL )) error_count++; if (vc_uri_path(uri)) error_count++; } else error_count++; if (vc_uri_set_fragment( uri, TEST_STRING )) { str = vc_uri_fragment(uri); if (!str || strcmp(TEST_STRING, str)) error_count++; if (!vc_uri_set_fragment( uri, NULL )) error_count++; if (vc_uri_fragment(uri)) error_count++; } else error_count++; if (vc_uri_add_query( uri, NULL, NULL )) error_count++; if (vc_uri_add_query( uri, NULL, TEST_VALUE )) error_count++; if (!vc_uri_add_query( uri, TEST_STRING, NULL )) error_count++; if (!vc_uri_add_query( uri, TEST_NAME, TEST_VALUE )) error_count++; if (vc_uri_num_queries(uri) == 2) { const char *name = NULL, *value = NULL; vc_uri_query(uri, 0, &name, &value); if (!name || strcmp(TEST_STRING, name)) error_count++; if (value) error_count++; vc_uri_query(uri, 1, &name, &value); if (!name || strcmp(TEST_NAME, name)) error_count++; if (!value || strcmp(TEST_VALUE, value)) error_count++; } else error_count++; if (error_count) LOG_ERROR(NULL, "Accessors failed"); return error_count; }