int normalize_origin(const char *o, char co[U_URI_STRMAX]) { u_uri_t *u = NULL; const char *scheme, *port; dbg_return_if(o == NULL || o[0] == '\0', -1); dbg_return_if(co == NULL, -1); dbg_err_ifm(u_uri_crumble(o, 0, &u), "%s parse error", o); /* Check that scheme is 'coap' or 'coaps'. */ dbg_err_ifm((scheme = u_uri_get_scheme(u)) == NULL || (strcasecmp(scheme, "coap") && strcasecmp(scheme, "coaps")), "bad %s scheme", scheme); /* Set default port if empty. */ if ((port = u_uri_get_port(u)) == NULL || *port == '\0') (void) u_uri_set_port(u, EC_COAP_DEFAULT_SPORT); dbg_err_ifm(u_uri_knead(u, co), "error normalizing origin (%s)", o); u_uri_free(u), u = NULL; return 0; err: if (u) u_uri_free(u); return -1; }
/** * \brief Parse an URI string and create the corresponding ::u_uri_t object * * Parse the NUL-terminated string \p uri and create an ::u_uri_t object at * \p *pu * * \param uri the NUL-terminated string that must be parsed * \param opts bitmask of or'ed ::u_uri_opts_t values * \param pu the newly created ::u_uri_t object containing the b * * \retval 0 on success * \retval ~0 on error */ int u_uri_crumble (const char *uri, u_uri_opts_t opts, u_uri_t **pu) { u_uri_t *u = NULL; int rc = 0; char es[1024]; regex_t re; regmatch_t pmatch[10]; dbg_return_if (uri == NULL, ~0); dbg_return_if (pu == NULL, ~0); dbg_err_if ((rc = regcomp(&re, uri_pat, REG_EXTENDED))); dbg_err_if ((rc = regexec(&re, uri, 10, pmatch, 0))); dbg_err_if (u_uri_new(opts, &u)); dbg_err_if (u_uri_fill(u, uri, pmatch)); regfree(&re); *pu = u; return 0; err: if (rc) { regerror(rc, &re, es, sizeof es); u_dbg("%s: %s", uri, es); } regfree(&re); if (u) u_uri_free(u); return ~0; }
/** * \brief Make room for a new ::u_uri_t object * * Make room for a new ::u_uri_t object at \p *pu. The returned object is * completely empty: use the needed setter methods to fill it before passing * it to the encoder. * * \param opts bitmask of or'ed ::u_uri_opts_t values * \param pu Reference to an ::u_uri_t that, on success, will point to * the newly created object * * \retval 0 on success * \retval ~0 on error */ int u_uri_new (u_uri_opts_t opts, u_uri_t **pu) { u_uri_t *u = NULL; dbg_return_if (pu == NULL, ~0); dbg_err_sif ((u = u_zalloc(sizeof(u_uri_t))) == NULL); u->scheme = NULL; u->userinfo = NULL; u->user = NULL; u->pwd = NULL; u->host = NULL; u->port = NULL; u->authority = NULL; u->path = NULL; u->query = NULL; u->fragment = NULL; u->opts = opts; *pu = u; return 0; err: if (u) u_uri_free(u); return ~0; }
void wsmc_add_selector_from_uri(WsXmlDocH doc, const char *resource_uri) { u_uri_t *uri; WsXmlNodeH header = ws_xml_get_soap_header(doc); hash_t *query; hnode_t *hn; hscan_t hs; if (resource_uri != NULL) { if (u_uri_parse((const char *) resource_uri, &uri) != 0) return; else if (!uri->query) goto cleanup; } query = u_parse_query(uri->query); hash_scan_begin(&hs, query); while ((hn = hash_scan_next(&hs))) { wsman_add_selector(header, (char *) hnode_getkey(hn), (char *) hnode_get(hn)); debug("key=%s value=%s", (char *) hnode_getkey(hn), (char *) hnode_get(hn)); } hash_free_nodes(query); hash_destroy(query); cleanup: if (uri) { u_uri_free(uri); } }
static hash_t * get_selectors_from_uri(const char *resource_uri) { u_uri_t *uri; hash_t *selectors = NULL; if (resource_uri != NULL) { if (u_uri_parse((const char *) resource_uri, &uri) != 0) return NULL; } else { return NULL; } if (uri->query != NULL) { selectors = u_parse_query(uri->query); } if (uri) { u_uri_free(uri); } return selectors; }