/**************************************************************************//** * Creates and populates a parameter list from a URI structure. * The list does not copy the parameter strings themselves, so the URI structure * must be retained (and its parameters unmodified) while the list is in use. * * @param uri The URI containing the parameters. * @return List created from the parameters of the URI, or NULL on error. */ static VC_CONTAINERS_LIST_T *fill_parameter_list(VC_URI_PARTS_T *uri) { uint32_t num_parameters = vc_uri_num_queries(uri); VC_CONTAINERS_LIST_T *parameters; uint32_t ii; parameters = vc_containers_list_create(num_parameters, sizeof(PARAMETER_T), (VC_CONTAINERS_LIST_COMPARATOR_T)parameter_comparator); if (!parameters) return NULL; for (ii = 0; ii < num_parameters; ii++) { PARAMETER_T param; vc_uri_query(uri, ii, ¶m.name, ¶m.value); if (!vc_containers_list_insert(parameters, ¶m, false)) { vc_containers_list_destroy(parameters); return NULL; } } #ifdef RTP_DEBUG vc_containers_list_validate(parameters); #endif return parameters; }
VC_CONTAINER_STATUS_T vc_container_io_http_open(VC_CONTAINER_IO_T *p_ctx, const char *unused, VC_CONTAINER_IO_MODE_T mode) { VC_CONTAINER_STATUS_T status = VC_CONTAINER_SUCCESS; VC_CONTAINER_IO_MODULE_T *module = 0; VC_CONTAINER_PARAM_UNUSED(unused); /* Check the URI to see if we're dealing with an http stream */ if (!vc_uri_scheme(p_ctx->uri_parts) || strcasecmp(vc_uri_scheme(p_ctx->uri_parts), "http")) return VC_CONTAINER_ERROR_FORMAT_NOT_SUPPORTED; /* * Some basic error checking. */ if (mode == VC_CONTAINER_IO_MODE_WRITE) { status = VC_CONTAINER_ERROR_UNSUPPORTED_OPERATION; goto error; } if (strlen(p_ctx->uri) > HTTP_URI_LENGTH_MAX) { status = VC_CONTAINER_ERROR_URI_OPEN_FAILED; goto error; } module = calloc(1, sizeof(*module)); if (!module) { status = VC_CONTAINER_ERROR_OUT_OF_MEMORY; goto error; } p_ctx->module = module; /* header_list will contain pointers into the response_buffer, so take care in re-use */ module->header_list = vc_containers_list_create(HEADER_LIST_INITIAL_CAPACITY, sizeof(HTTP_HEADER_T), (VC_CONTAINERS_LIST_COMPARATOR_T)io_http_header_comparator); if (!module->header_list) { status = VC_CONTAINER_ERROR_OUT_OF_MEMORY; goto error; } /* * Make sure that we have a port number. */ if (vc_uri_port(p_ctx->uri_parts) == NULL) vc_uri_set_port(p_ctx->uri_parts, IO_HTTP_DEFAULT_PORT); status = io_http_open_socket(p_ctx); if (status != VC_CONTAINER_SUCCESS) goto error; /* * Whoo hoo! Our socket is open. Now let's send a HEAD request. */ status = io_http_head(p_ctx); if (status != VC_CONTAINER_SUCCESS) goto error; p_ctx->pf_close = io_http_close; p_ctx->pf_read = io_http_read; p_ctx->pf_write = NULL; p_ctx->pf_control = io_http_control; p_ctx->pf_seek = io_http_seek; p_ctx->capabilities = VC_CONTAINER_IO_CAPS_NO_CACHING; p_ctx->capabilities |= VC_CONTAINER_IO_CAPS_SEEK_SLOW; return VC_CONTAINER_SUCCESS; error: io_http_close(p_ctx); return status; }