int main (int argc, char **argv) { if (argc < 2) { g_printerr ("Usage:i\n"); g_printerr (" %s addr IP:PORT\n", argv[0]); g_printerr (" %s cid OIOURL\n", argv[0]); g_printerr (" %s hash [PREFIX]\n", argv[0]); g_printerr (" %s stat [path]...\n", argv[0]); return 2; } oio_ext_set_random_reqid (); if (!strcmp("addr", argv[1])) { for (int i=2; i<argc ;++i) _dump_addr (argv[i]); return 0; } else if (!strcmp("cid", argv[1])) { for (int i=2; i<argc ;++i) _dump_cid (argv[i]); return 0; } else if (!strcmp("hash", argv[1])) { if (argc < 2 || argc > 4) { g_printerr ("Usage: %s hash ACCOUNT [PREFIX]\n", argv[0]); return 1; } _same_hash (argv[2], argc==4 ? argv[3] : ""); return 0; } else if (!strcmp("stat", argv[1])) { _sysstat (argv+2); return 0; } return 1; }
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; }
void oio_ext_init_test (int *argc, char ***argv) { g_test_init (argc, argv, NULL); char *sep = strrchr ((*argv)[0], '/'); g_set_prgname (sep ? sep+1 : (*argv)[0]); oio_log_lazy_init (); oio_log_init_level(GRID_LOGLVL_INFO); oio_log_init_level_from_env("G_DEBUG_LEVEL"); g_log_set_default_handler(oio_log_stderr, NULL); oio_ext_set_random_reqid (); }
int main (int argc, char **argv) { if (argc < 2) { g_printerr ("Usage:i\n"); g_printerr (" %s addr IP:PORT\n", argv[0]); g_printerr (" %s cid OIOURL\n", argv[0]); g_printerr (" %s ping IP:PORT\n", argv[0]); g_printerr (" %s version IP:PORT\n", argv[0]); g_printerr (" %s handlers IP:PORT\n", argv[0]); g_printerr (" %s stats IP:PORT\n", argv[0]); g_printerr (" %s hash [PREFIX]\n", argv[0]); return 2; } oio_ext_set_random_reqid (); if (!strcmp("addr", argv[1])) { for (int i=2; i<argc ;++i) _dump_addr (argv[i]); return 0; } else if (!strcmp("cid", argv[1])) { for (int i=2; i<argc ;++i) _dump_cid (argv[i]); return 0; } else if (!strcmp("version", argv[1])) { for (int i=2; i<argc ;++i) _do_version(argv[i]); return 0; } else if (!strcmp("ping", argv[1])) { for (int i=2; i<argc ;++i) _do_ping (argv[i]); return 0; } else if (!strcmp("handlers", argv[1])) { for (int i=2; i<argc ;++i) _do_handlers (argv[i]); return 0; } else if (!strcmp("stats", argv[1])) { for (int i=2; i<argc ;++i) _do_stat (argv[i]); return 0; } else if (!strcmp("hash", argv[1])) { _same_hash (argc>2 ? argv[2] : ""); return 0; } return 1; }
GByteArray* message_marshall_gba(MESSAGE m, GError **err) { asn_enc_rval_t encRet; /*sanity check */ if (!m) { GSETERROR(err, "Invalid parameter"); return NULL; } /*set an ID if it is not present */ if (!metautils_message_has_ID(m)) { const char *reqid = oio_ext_get_reqid (); if (!reqid) oio_ext_set_random_reqid (); reqid = oio_ext_get_reqid (); metautils_message_set_ID(m, (guint8*)reqid, strlen(reqid)); } metautils_message_add_field_strint(m, NAME_MSGKEY_ADMIN_COMMAND, oio_ext_is_admin()); /*try to encode */ guint32 u32 = 0; GByteArray *result = g_byte_array_sized_new(256); g_byte_array_append(result, (guint8*)&u32, sizeof(u32)); encRet = der_encode(&asn_DEF_Message, m, metautils_asn1c_write_gba, result); if (encRet.encoded < 0) { g_byte_array_free(result, TRUE); GSETERROR(err, "Encoding error (Message)"); return NULL; } guint32 s32 = result->len - 4; *((guint32*)(result->data)) = g_htonl(s32); return result; }
static GError * _proxy_call_notime (CURL *h, const char *method, const char *url, struct http_ctx_s *in, struct http_ctx_s *out) { g_assert (h != NULL); g_assert (method != NULL); g_assert (url != NULL); struct view_GString_s view_input = {.data=NULL, .done=0}; GError *err = NULL; curl_easy_setopt (h, CURLOPT_URL, url); curl_easy_setopt (h, CURLOPT_CUSTOMREQUEST, method); /* Populate the request headers */ struct oio_headers_s headers = {NULL,NULL}; oio_headers_common (&headers); curl_easy_setopt (h, CURLOPT_HTTPHEADER, headers.headers); if (in && in->headers) { for (gchar **p=in->headers; *p && *(p+1) ;p+=2) oio_headers_add (&headers, *p, *(p+1)); } /* Intercept the headers from the response */ if (out) { curl_easy_setopt (h, CURLOPT_HEADERDATA, out); curl_easy_setopt (h, CURLOPT_HEADERFUNCTION, _header_callback); } else { curl_easy_setopt (h, CURLOPT_HEADERDATA, NULL); curl_easy_setopt (h, CURLOPT_HEADERFUNCTION, NULL); } if (in && in->body) { view_input.data = in->body; gint64 len = in->body->len; curl_easy_setopt (h, CURLOPT_READFUNCTION, _read_GString); curl_easy_setopt (h, CURLOPT_READDATA, &view_input); curl_easy_setopt (h, CURLOPT_UPLOAD, 1L); curl_easy_setopt (h, CURLOPT_INFILESIZE_LARGE, len); } else { curl_easy_setopt (h, CURLOPT_READFUNCTION, NULL); curl_easy_setopt (h, CURLOPT_READDATA, NULL); curl_easy_setopt (h, CURLOPT_UPLOAD, 0L); curl_easy_setopt (h, CURLOPT_INFILESIZE, 0L); } if (out && out->body) { curl_easy_setopt (h, CURLOPT_WRITEFUNCTION, _write_GString); curl_easy_setopt (h, CURLOPT_WRITEDATA, out->body); } else { curl_easy_setopt (h, CURLOPT_WRITEFUNCTION, _write_NOOP); } CURLcode rc = curl_easy_perform (h); if (CURLE_OK != rc) err = NEWERROR(0, "Proxy error: (%d) %s", rc, curl_easy_strerror(rc)); else { long code = 0; rc = curl_easy_getinfo (h, CURLINFO_RESPONSE_CODE, &code); if (2 != (code/100)) { if (out && out->body) { err = _body_parse_error (out->body); g_prefix_error (&err, "Request error (%ld): ", code); } else { err = NEWERROR(code, "Request error (%ld)", code); } } } oio_headers_clear (&headers); return err; } static GError * _proxy_call (CURL *h, const char *method, const char *url, struct http_ctx_s *in, struct http_ctx_s *out) { if (!oio_ext_get_reqid ()) oio_ext_set_random_reqid(); gint64 t = g_get_monotonic_time (); GError *err = _proxy_call_notime (h, method, url, in, out); t = g_get_monotonic_time () - t; GRID_TRACE("proxy: %s %s took %"G_GINT64_FORMAT"us", method, url, t); return err; } /* -------------------------------------------------------------------------- */ GError * oio_proxy_call_container_create (CURL *h, struct oio_url_s *u) { GString *http_url = _curl_container_url (u, "create"); gchar *hdrin[] = {PROXYD_HEADER_MODE, "autocreate", NULL}; struct http_ctx_s i = { .headers = hdrin, .body = NULL }; GError *err = _proxy_call (h, "POST", http_url->str, &i, NULL); g_string_free(http_url, TRUE); return err; }