static enum http_rc_e handler_action (struct http_request_s *rq, struct http_reply_ctx_s *rp) { // Get a request id for the current request const gchar *reqid = g_tree_lookup (rq->tree_headers, PROXYD_HEADER_REQID); if (reqid) oio_ext_set_reqid(reqid); else oio_ext_set_random_reqid(); // Then parse the request to find a handler struct oio_url_s *url = NULL; struct oio_requri_s ruri = {NULL, NULL, NULL, NULL}; oio_requri_parse (rq->req_uri, &ruri); struct path_matching_s **matchings = _metacd_match (rq->cmd, ruri.path); GRID_TRACE2("URI path[%s] query[%s] fragment[%s] matches[%u]", ruri.path, ruri.query, ruri.fragment, g_strv_length((gchar**)matchings)); GQuark gq_count = gq_count_unexpected; GQuark gq_time = gq_time_unexpected; enum http_rc_e rc; if (!*matchings) { rp->set_content_type ("application/json"); rp->set_body_gstr (g_string_new("{\"status\":404,\"message\":\"No handler found\"}")); rp->set_status (HTTP_CODE_NOT_FOUND, "No handler found"); rp->finalize (); rc = HTTPRC_DONE; } else { struct req_args_s args = {0}; args.req_uri = &ruri; args.matchings = matchings; args.rq = rq; args.rp = rp; args.url = url = _metacd_load_url (&args); rp->subject(oio_url_get(url, OIOURL_HEXID)); gq_count = (*matchings)->last->gq_count; gq_time = (*matchings)->last->gq_time; GRID_TRACE("%s %s URL %s", __FUNCTION__, ruri.path, oio_url_get(args.url, OIOURL_WHOLE)); req_handler_f handler = (*matchings)->last->u; rc = (*handler) (&args); } gint64 spent = oio_ext_monotonic_time () - rq->client->time.evt_in; network_server_stat_push4 (rq->client->server, TRUE, gq_count, 1, gq_count_all, 1, gq_time, spent, gq_time_all, spent); path_matching_cleanv (matchings); oio_requri_clear (&ruri); oio_url_pclean (&url); oio_ext_set_reqid (NULL); return rc; }
static int _parse_oldurl(struct oio_url_s *url, const char *str) { struct oio_requri_s ruri = {NULL, NULL, NULL, NULL}; // Purify the url size_t len = strlen (str); char *tmp = g_alloca (len+1); do { char *p = tmp; for (; *str && *str == '/' ;++str) {} // skip the leading slashes if (*str) { // Copy the NS for (; *str && *str != '/' ;++str) *(p++) = *str; } if (*str) *(p++) = '/'; // Copy a single separator for (; *str && *str == '/' ;++str) {} // skip separators if (*str) strcpy(p, str); // Copy what remains } while (0); if (oio_requri_parse (tmp, &ruri)) { // Parse the path gchar **path_tokens = g_strsplit (ruri.path, "/", 3); if (path_tokens) { if (path_tokens[0]) { oio_str_reuse (&url->ns, path_tokens[0]); oio_str_replace (&url->account, HCURL_DEFAULT_ACCOUNT); if (path_tokens[1]) { oio_str_reuse (&url->user, path_tokens[1]); oio_str_replace (&url->type, HCURL_DEFAULT_TYPE); if (path_tokens[2]) oio_str_reuse (&url->path, path_tokens[2]); } } g_free (path_tokens); } if (ruri.query_tokens) { // Parse the options for (gchar **p=ruri.query_tokens; *p ;++p) _add_option(url, *p); } } oio_requri_clear (&ruri); return _check_parsed_url (url); }