int upload_file_init (evhtp_t *htp) { evhtp_callback_t *cb; if (g_mkdir_with_parents (TEMP_FILE_DIR, 0777) < 0) { seaf_warning ("Failed to create temp file dir %s.\n", TEMP_FILE_DIR); return -1; } cb = evhtp_set_regex_cb (htp, "^/upload/.*", upload_cb, NULL); /* upload_headers_cb() will be called after evhtp parsed all http headers. */ evhtp_set_hook(&cb->hooks, evhtp_hook_on_headers, upload_headers_cb, NULL); cb = evhtp_set_regex_cb (htp, "^/update/.*", update_cb, NULL); evhtp_set_hook(&cb->hooks, evhtp_hook_on_headers, upload_headers_cb, NULL); evhtp_set_regex_cb (htp, "^/upload_progress.*", upload_progress_cb, NULL); upload_progress = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); pthread_mutex_init (&pg_lock, NULL); return 0; }
int main() { evbase_t *evbase = event_base_new(); evhtp_t *htp = evhtp_new(evbase, NULL); fprintf(stdout, "Welcome to CAvatar.\n"); // A place for our images mkdir(imgfolder, 0700); // A few static routes evhtp_set_cb(htp, "/", route_index, NULL); evhtp_set_cb(htp, "/favicon.ico", route_favicon, NULL); // Metas evhtp_set_regex_cb(htp, "[\\/](meta)[\\/]([0-9a-fA-F]{32})", route_meta, NULL); // Images evhtp_set_regex_cb(htp, "[\\/](avatar)[\\/]([0-9a-fA-F]{32})", route_image, NULL); evhtp_set_regex_cb(htp, "[\\/]([0-9a-fA-F]{32})", route_image, NULL); // 404 routes evhtp_set_regex_cb(htp, "[\\/](.{1,})", route_generic, NULL); evhtp_set_gencb(htp, route_generic, NULL); // libevhtp has a cool wrapper for pthreads evhtp_use_threads(htp, NULL, threads, NULL); // aaaand bind a socket.. if (evhtp_bind_socket(htp, "0.0.0.0", port, 1024) < 0) { fprintf(stderr, "Could not bind to socket %d: %s\n", port, strerror(errno)); exit(-1); } fprintf(stdout, "Binded to socket %d\n", port); // and listen! event_base_loop(evbase, 0); // free stuff after event loop evhtp_unbind_socket(htp); evhtp_free(htp); event_base_free(evbase); //MagickWandTerminus(); return 0; }
void HttpStack::register_controller(char* path, HttpStack::ControllerInterface* controller) { evhtp_callback_t* cb = evhtp_set_regex_cb(_evhtp, path, handler_callback_fn, (void*)controller); if (cb == NULL) { throw Exception("evhtp_set_cb", 0); // LCOV_EXCL_LINE } }
int main(int argc, char ** argv) { struct event * ev_sigint; evbase_t * evbase = NULL; evhtp_t * htp = NULL; evhtp_callback_t * cb_1 = NULL; evhtp_callback_t * cb_2 = NULL; evhtp_callback_t * cb_3 = NULL; evhtp_callback_t * cb_4 = NULL; evhtp_callback_t * cb_5 = NULL; #ifndef EVHTP_DISABLE_REGEX evhtp_callback_t * cb_6 = NULL; #endif evhtp_callback_t * cb_7 = NULL; #ifndef EVHTP_DISABLE_REGEX evhtp_callback_t * cb_8 = NULL; #endif evhtp_callback_t * cb_9 = NULL; evhtp_callback_t * cb_10 = NULL; evhtp_callback_t * cb_11 = NULL; evhtp_callback_t * cb_12 = NULL; if (parse_args(argc, argv) < 0) { exit(1); } srand((unsigned)time(NULL)); evbase = event_base_new(); htp = evhtp_new(evbase, NULL); evhtp_set_parser_flags(htp, EVHTP_PARSE_QUERY_FLAG_LENIENT); evhtp_set_max_keepalive_requests(htp, max_keepalives); //htp->enable_nodelay = 1; //htp->enable_defer_accept = 1; htp->enable_reuseport = 1; cb_1 = evhtp_set_cb(htp, "/ref", test_default_cb, "fjdkls"); cb_2 = evhtp_set_cb(htp, "/foo", test_foo_cb, "bar"); cb_3 = evhtp_set_cb(htp, "/foo/", test_foo_cb, "bar"); cb_4 = evhtp_set_cb(htp, "/bar", test_bar_cb, "baz"); cb_5 = evhtp_set_cb(htp, "/500", test_500_cb, "500"); #ifndef EVHTP_DISABLE_REGEX cb_6 = evhtp_set_regex_cb(htp, "^(/anything/).*", test_regex, NULL); #endif cb_7 = evhtp_set_cb(htp, "/pause", test_pause_cb, NULL); #ifndef EVHTP_DISABLE_REGEX cb_8 = evhtp_set_regex_cb(htp, "^/create/(.*)", create_callback, NULL); #endif cb_9 = evhtp_set_glob_cb(htp, "*/glob/*", test_glob_cb, NULL); cb_10 = evhtp_set_cb(htp, "/max_body_size", test_max_body, NULL); /* set a callback to test out chunking API */ cb_11 = evhtp_set_cb(htp, "/chunkme", test_chunking, NULL); /* set a callback which takes ownership of the underlying bufferevent and * just starts echoing things */ cb_12 = evhtp_set_cb(htp, "/ownme", test_ownership, NULL); /* set a callback to pause on each header for cb_7 */ evhtp_set_hook(&cb_7->hooks, evhtp_hook_on_path, pause_init_cb, NULL); /* set a callback to set hooks specifically for the cb_6 callback */ #ifndef EVHTP_DISABLE_REGEX evhtp_set_hook(&cb_6->hooks, evhtp_hook_on_headers, test_regex_hdrs_cb, NULL); #endif evhtp_set_hook(&cb_10->hooks, evhtp_hook_on_headers, set_max_body, NULL); /* set a default request handler */ evhtp_set_gencb(htp, test_default_cb, "foobarbaz"); /* set a callback invoked before a connection is accepted */ //evhtp_set_pre_accept_cb(htp, test_pre_accept, &bind_port); /* set a callback to set per-connection hooks (via a post_accept cb) */ evhtp_set_post_accept_cb(htp, set_my_connection_handlers, NULL); #ifndef EVHTP_DISABLE_SSL if (ssl_pem != NULL) { evhtp_ssl_cfg_t scfg = { .pemfile = ssl_pem, .privfile = ssl_pem, .cafile = ssl_ca, .capath = ssl_capath, .ciphers = "RC4+RSA:HIGH:+MEDIUM:+LOW", .ssl_opts = SSL_OP_NO_SSLv2, .ssl_ctx_timeout = 60 * 60 * 48, .verify_peer = SSL_VERIFY_PEER, .verify_depth = 42, .x509_verify_cb = dummy_ssl_verify_callback, .x509_chk_issued_cb = dummy_check_issued_cb, .scache_type = evhtp_ssl_scache_type_internal, .scache_size = 1024, .scache_timeout = 1024, .scache_init = NULL, .scache_add = NULL, .scache_get = NULL, .scache_del = NULL, }; evhtp_ssl_init(htp, &scfg); #ifndef EVHTP_DISABLE_EVTHR if (use_threads) { #define OPENSSL_THREAD_DEFINES #include <openssl/opensslconf.h> #if defined(OPENSSL_THREADS) #else fprintf(stderr, "Your version of OpenSSL does not support threading!\n"); exit(-1); #endif } #endif } #endif #ifndef EVHTP_DISABLE_EVTHR if (use_threads) { evhtp_use_threads(htp, NULL, num_threads, NULL); } #endif if (evhtp_bind_socket(htp, bind_addr, bind_port, backlog) < 0) { fprintf(stderr, "Could not bind socket: %s\n", strerror(errno)); exit(-1); } ev_sigint = evsignal_new(evbase, SIGINT, sigint, evbase); evsignal_add(ev_sigint, NULL); event_base_loop(evbase, 0); event_free(ev_sigint); evhtp_unbind_socket(htp); evhtp_free(htp); event_base_free(evbase); return 0; } /* main */
int main(int argc, char ** argv) { evbase_t * evbase = NULL; evhtp_t * htp = NULL; evhtp_callback_t * cb_1 = NULL; evhtp_callback_t * cb_2 = NULL; evhtp_callback_t * cb_3 = NULL; evhtp_callback_t * cb_4 = NULL; evhtp_callback_t * cb_5 = NULL; evhtp_callback_t * cb_6 = NULL; evhtp_callback_t * cb_7 = NULL; evhtp_callback_t * cb_8 = NULL; if (parse_args(argc, argv) < 0) { exit(1); } srand((unsigned)time(NULL)); evbase = event_base_new(); htp = evhtp_new(evbase, NULL); cb_1 = evhtp_set_cb(htp, "/ref", test_default_cb, "fjdkls"); cb_2 = evhtp_set_cb(htp, "/foo", test_foo_cb, "bar"); cb_3 = evhtp_set_cb(htp, "/foo/", test_foo_cb, "bar"); cb_4 = evhtp_set_cb(htp, "/bar", test_bar_cb, "baz"); cb_5 = evhtp_set_cb(htp, "/500", test_500_cb, "500"); cb_6 = evhtp_set_regex_cb(htp, "^(/anything/).*", test_regex, NULL); cb_7 = evhtp_set_cb(htp, "/pause", test_pause_cb, NULL); cb_8 = evhtp_set_regex_cb(htp, "^/create/(.*)", create_callback, NULL); /* set a callback to pause on each header for cb_7 */ evhtp_set_hook(&cb_7->hooks, evhtp_hook_on_path, pause_init_cb, NULL); /* set a callback to set hooks specifically for the cb_6 callback */ evhtp_set_hook(&cb_6->hooks, evhtp_hook_on_headers, test_regex_hdrs_cb, NULL); /* set a default request handler */ evhtp_set_gencb(htp, test_default_cb, "foobarbaz"); /* set a callback invoked before a connection is accepted */ evhtp_set_pre_accept_cb(htp, test_pre_accept, &bind_port); /* set a callback to set per-connection hooks (via a post_accept cb) */ evhtp_set_post_accept_cb(htp, set_my_connection_handlers, NULL); #ifndef DISABLE_SSL if (ssl_pem != NULL) { evhtp_ssl_cfg_t scfg = { .pemfile = ssl_pem, .privfile = ssl_pem, .cafile = ssl_ca, .capath = ssl_capath, .ciphers = "RC4+RSA:HIGH:+MEDIUM:+LOW", .ssl_opts = SSL_OP_NO_SSLv2, .verify_peer = SSL_VERIFY_PEER, .verify_depth = 42, .x509_verify_cb = dummy_ssl_verify_callback, .x509_chk_issued_cb = dummy_check_issued_cb, .scache_type = evhtp_ssl_scache_type_internal, .scache_size = 1024, .scache_timeout = 1024, .scache_init = NULL, .scache_add = NULL, .scache_get = NULL, .scache_del = NULL, }; evhtp_ssl_init(htp, &scfg); if (use_threads) { #define OPENSSL_THREAD_DEFINES #include <openssl/opensslconf.h> #if defined(OPENSSL_THREADS) #else fprintf(stderr, "Your version of OpenSSL does not support threading!\n"); exit(-1); #endif } } #endif #ifndef DISABLE_EVTHR if (use_threads) { evhtp_use_threads(htp, NULL, num_threads, NULL); } #endif if (evhtp_bind_socket(htp, bind_addr, bind_port, 128) < 0) { fprintf(stderr, "Could not bind socket: %s\n", strerror(errno)); exit(-1); } signal(SIGINT, sigint); event_base_loop(evbase, 0); return 0; } /* main */
int main () { evhtp_t * htp; int status = 0; struct maytrics * maytrics; evhtp_callback_t * controller_cb; maytrics = (struct maytrics *)malloc (sizeof (struct maytrics)); if (maytrics == NULL) { log_fatal ("malloc() failed."); status = 1; goto exit; } if (init_maytrics (maytrics) == -1) { log_fatal ("init_maytrics() failed."); status = 2; goto free_maytrics; } maytrics->evbase = event_base_new(); if (maytrics->evbase == NULL) { log_fatal ("event_base_new() failed."); status = 3; goto free_maytrics; } if (init_redis_client (maytrics) == -1) { log_fatal ("init_redis_server() failed."); status = 4; goto event_base_free; } htp = evhtp_new (maytrics->evbase, NULL); if (htp == NULL) { log_fatal ("evhtp_new() failed."); status = 5; goto free_redis_client; } controller_cb = evhtp_set_regex_cb (htp, "/api/v1/(.+)/metrics.json", metrics_controller, maytrics); if (controller_cb == NULL) { log_fatal ("evhtp_set_regex_cb() failed."); status = 8; goto evhtp_free; } controller_cb = evhtp_set_regex_cb (htp, "/api/v1/(.+)/metrics/(.+).json", metric_controller, maytrics); if (controller_cb == NULL) { log_fatal("evhtp_set_regex_cb() failed."); status = 9; goto evhtp_free; } controller_cb = evhtp_set_regex_cb (htp, "/api/v1/(.+).json", user_controller, maytrics); if (controller_cb == NULL) { log_fatal ("evhtp_set_regex_cb() failed."); status = 7; goto evhtp_free; } if (evhtp_bind_socket (htp, maytrics->host, maytrics->port, 1024) != 0) { log_fatal ("evhtp_bind_socket(%s, %d) failed.", maytrics->host, maytrics->port); status = 10; goto evhtp_free; } log_info ("Server launched on %s:%d", maytrics->host, maytrics->port); if (event_base_loop (maytrics->evbase, 0) == -1) { log_fatal ("event_base_loop() failed."); status = 11; goto evhtp_unbind_socket; } evhtp_unbind_socket: evhtp_unbind_socket (htp); evhtp_free: evhtp_free (htp); free_redis_client: redisFree (maytrics->redis); event_base_free: event_base_free (maytrics->evbase); free_maytrics: free (maytrics); exit: return (status); }
int main(int argc, char **argv) { init_config(argc, argv); open_authorizations("r"); init_webfinger(); /** OPEN MAGIC DATABASE **/ magic_cookie = magic_open(MAGIC_MIME); if(magic_load(magic_cookie, RS_MAGIC_DATABASE) != 0) { log_error("Failed to load magic database: %s", magic_error(magic_cookie)); exit(EXIT_FAILURE); } log_info("starting process: main"); if(prctl(PR_SET_NAME, "rs-serve [main]", 0, 0, 0) != 0) { log_error("Failed to set process name: %s", strerror(errno)); } /** SETUP EVENT BASE **/ rs_event_base = event_base_new(); ASSERT_NOT_NULL(rs_event_base, "event_base_new()"); log_debug("libevent method: %s", event_base_get_method(rs_event_base)); event_set_log_callback(log_event_base_message); // TODO: add error cb to base /** SETUP AUTH TOKENS HASH TABLE **/ auth_sessions = sm_new(1024); // FIXME: this a hardcoded value. /** SETUP MAIN LISTENER **/ struct sockaddr_in sin; memset(&sin, 0, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(0); sin.sin_port = htons(RS_PORT); evhtp_t *server = evhtp_new(rs_event_base, NULL); if(RS_USE_SSL) { evhtp_ssl_cfg_t ssl_config = { .pemfile = RS_SSL_CERT_PATH, .privfile = RS_SSL_KEY_PATH, .cafile = RS_SSL_CA_PATH, // what's this??? .capath = NULL, .ciphers = "RC4+RSA:HIGH:+MEDIUM:+LOW", .ssl_opts = SSL_OP_NO_SSLv2, .ssl_ctx_timeout = 60*60*48, .verify_peer = SSL_VERIFY_PEER, .verify_depth = 42, .x509_verify_cb = dummy_ssl_verify_callback, .x509_chk_issued_cb = dummy_check_issued_cb, .scache_type = evhtp_ssl_scache_type_internal, .scache_size = 1024, .scache_timeout = 1024, .scache_init = NULL, .scache_add = NULL, .scache_get = NULL, .scache_del = NULL }; if(evhtp_ssl_init(server, &ssl_config) != 0) { log_error("evhtp_ssl_init() failed"); exit(EXIT_FAILURE); } } /* WEBFINGER */ evhtp_callback_cb webfinger_cb = (RS_WEBFINGER_ENABLED ? handle_webfinger : reject_webfinger); evhtp_set_cb(server, "/.well-known/webfinger", webfinger_cb, NULL); // support legacy webfinger clients (we don't support XRD though): evhtp_set_cb(server, "/.well-known/host-meta", webfinger_cb, NULL); evhtp_set_cb(server, "/.well-known/host-meta.json", webfinger_cb, NULL); /* REMOTESTORAGE */ evhtp_callback_t *storage_cb = evhtp_set_regex_cb(server, "^/storage/([^/]+)/.*$", handle_storage, NULL); evhtp_set_hook(&storage_cb->hooks, evhtp_hook_on_request_fini, finish_request, NULL); if(evhtp_bind_sockaddr(server, (struct sockaddr*)&sin, sizeof(sin), 1024) != 0) { log_error("evhtp_bind_sockaddr() failed: %s", strerror(errno)); exit(EXIT_FAILURE); } /** SETUP AUTH LISTENER **/ memset(&sin, 0, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(0); sin.sin_port = htons(RS_AUTH_PORT); evhtp_t *server_auth = evhtp_new(rs_event_base, NULL); if(RS_USE_SSL) { evhtp_ssl_cfg_t ssl_config = { .pemfile = RS_SSL_CERT_PATH, .privfile = RS_SSL_KEY_PATH, .cafile = RS_SSL_CA_PATH, // what's this??? .capath = NULL, .ciphers = "RC4+RSA:HIGH:+MEDIUM:+LOW", .ssl_opts = SSL_OP_NO_SSLv2, .ssl_ctx_timeout = 60*60*48, .verify_peer = SSL_VERIFY_PEER, .verify_depth = 42, .x509_verify_cb = dummy_ssl_verify_callback, .x509_chk_issued_cb = dummy_check_issued_cb, .scache_type = evhtp_ssl_scache_type_internal, .scache_size = 1024, .scache_timeout = 1024, .scache_init = NULL, .scache_add = NULL, .scache_get = NULL, .scache_del = NULL }; if(evhtp_ssl_init(server_auth, &ssl_config) != 0) { log_error("evhtp_ssl_init() failed"); exit(EXIT_FAILURE); } } /* AUTH */ evhtp_set_cb(server_auth, "/authenticate", handle_authenticate, NULL); evhtp_set_cb(server_auth, "/authorizations", handle_authorizations, NULL); evhtp_set_hook(&storage_cb->hooks, evhtp_hook_on_request_fini, finish_request, NULL); if(evhtp_bind_sockaddr(server_auth, (struct sockaddr*)&sin, sizeof(sin), 1024) != 0) { log_error("evhtp_bind_sockaddr() failed: %s", strerror(errno)); exit(EXIT_FAILURE); } /** SETUP SIGNALS **/ sigset_t sigmask; sigemptyset(&sigmask); sigaddset(&sigmask, SIGINT); sigaddset(&sigmask, SIGTERM); sigaddset(&sigmask, SIGCHLD); ASSERT_ZERO(sigprocmask(SIG_BLOCK, &sigmask, NULL), "sigprocmask()"); int sfd = signalfd(-1, &sigmask, SFD_NONBLOCK); ASSERT_NOT_EQ(sfd, -1, "signalfd()"); struct event *signal_event = event_new(rs_event_base, sfd, EV_READ | EV_PERSIST, handle_signal, NULL); event_add(signal_event, NULL); /** RUN EVENT LOOP **/ if(RS_DETACH) { int pid = fork(); if(pid == 0) { event_reinit(rs_event_base); if(RS_LOG_FILE == stdout) { log_warn("No --log-file option given. Future output will be lost."); freopen("/dev/null", "r", stdout); freopen("/dev/null", "r", stderr); } return event_base_dispatch(rs_event_base); } else { printf("rs-serve detached with pid %d\n", pid); if(RS_PID_FILE) { fprintf(RS_PID_FILE, "%d", pid); fflush(RS_PID_FILE); } _exit(EXIT_SUCCESS); } } else { if(RS_PID_FILE) { fprintf(RS_PID_FILE, "%d", getpid()); fflush(RS_PID_FILE); } return event_base_dispatch(rs_event_base); } }