int main(int argc, char ** argv) { evbase_t * evbase = event_base_new(); evhtp_t * htp = evhtp_new(evbase, NULL); evhtp_callback_t * cb_plurals = NULL; evhtp_callback_t * cb_score = NULL; int num_threads = 6; cb_plurals = evhtp_set_cb(htp, "/blahblah/plurals", receive_plurals, "plurals"); cb_score = evhtp_set_cb(htp, "/blahblah/score", provide_score, "score"); #ifndef EVHTP_DISABLE_EVTHR evhtp_use_threads(htp, NULL, num_threads, NULL); #else if (num_threads != 1) { printf("Error: multithreading is not supported\n"); exit(1); } #endif evhtp_bind_socket(htp, "0.0.0.0", 8081, 1024); event_base_loop(evbase, 0); evhtp_unbind_socket(htp); evhtp_callback_free(cb_score); evhtp_callback_free(cb_plurals); evhtp_free(htp); event_base_free(evbase); return 0; }
void HttpStack::wait_stopped() { LOG_STATUS("Waiting for HTTP stack to stop"); pthread_join(_event_base_thread, NULL); evhtp_free(_evhtp); _evhtp = NULL; event_base_free(_evbase); _evbase = NULL; }
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; }
int main(int argc, char ** argv) { evbase_t * evbase = event_base_new(); evhtp_t * htp = evhtp_new(evbase, NULL); evhtp_set_cb(htp, "/test", webif_test, NULL); evhtp_set_gencb(htp, webif_default, NULL); #ifndef EVHTP_DISABLE_EVTHR evhtp_use_threads(htp, NULL, 8, NULL); #endif evhtp_bind_socket(htp, "0.0.0.0", 8081, 2048); event_base_loop(evbase, 0); evhtp_unbind_socket(htp); evhtp_free(htp); event_base_free(evbase); return 0; }
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 () { 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); }
/** * @brief main The entrance of zimg. * * @param argc Count of args. * @param argv Arg list. * * @return It returns a int to system. */ int main(int argc, char **argv) { int c; _init_path = getcwd(NULL, 0); LOG_PRINT(LOG_INFO, "Get init-path: %s", _init_path); /* Set signal handlers */ sigset_t sigset; sigemptyset(&sigset); struct sigaction siginfo = { .sa_handler = sighandler, .sa_mask = sigset, .sa_flags = SA_RESTART, }; sigaction(SIGINT, &siginfo, NULL); sigaction(SIGTERM, &siginfo, NULL); settings_init(); while (-1 != (c = getopt(argc, argv, "p:" "t:" "l" "c" "M:" "m:" "b:" "h" "k:" ))) { switch(c) { case 'p': settings.port = atoi(optarg); break; case 't': settings.num_threads = atoi(optarg); if (settings.num_threads <= 0) { fprintf(stderr, "Number of threads must be greater than 0\n"); return 1; } /* There're other problems when you get above 64 threads. * In the future we should portably detect # of cores for the * default. */ if (settings.num_threads > 64) { fprintf(stderr, "WARNING: Setting a high number of worker" "threads is not recommended.\n" " Set this value to the number of cores in" " your machine or less.\n"); } break; case 'l': settings.log = true; break; case 'c': settings.cache_on = true; break; case 'M': strcpy(settings.cache_ip, optarg); break; case 'm': settings.cache_port = atoi(optarg); break; case 'b': settings.backlog = atoi(optarg); break; case 'k': settings.max_keepalives = atoll(optarg); break; case 'h': printf("Usage: ./zimg -p port -t thread_num -M memcached_ip -m memcached_port -l[og] -c[ache] -b backlog_num -k max_keepalives -h[elp]\n"); exit(1); default: fprintf(stderr, "Illegal argument \"%c\"\n", c); return 1; } } //init the Path zimg need to use. LOG_PRINT(LOG_INFO, "Begin to Init the Path zimg Using..."); // if(is_dir(settings.root_path) != 1) // { // if(mk_dir(settings.root_path) != 1) // { // LOG_PRINT(LOG_ERROR, "root_path[%s] Create Failed!", settings.root_path); // return -1; // } // } // // //start log module... ./log/zimg.log if(settings.log) { const char *log_path = "./log"; if(is_dir(log_path) != 1) { if(mk_dir(log_path) != 1) { LOG_PRINT(LOG_ERROR, "log_path[%s] Create Failed!", log_path); return -1; } } log_init(); } if(is_dir(settings.img_path) != 1) { if(mk_dir(settings.img_path) != 1) { LOG_PRINT(LOG_ERROR, "img_path[%s] Create Failed!", settings.img_path); return -1; } } LOG_PRINT(LOG_INFO,"Paths Init Finished."); //init memcached connection... if(settings.cache_on == true) { LOG_PRINT(LOG_INFO, "Begin to Init Memcached Connection..."); memcached_st *memc; memc= memcached_create(NULL); char mserver[32]; sprintf(mserver, "%s:%d", settings.cache_ip, settings.cache_port); memcached_server_st *servers = memcached_servers_parse(mserver); memcached_server_push(memc, servers); memcached_server_list_free(servers); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 0); //使用NO-BLOCK,防止memcache倒掉时挂死 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 1); LOG_PRINT(LOG_INFO, "Memcached Connection Init Finished."); if(set_cache("zimg", "1") == -1) { LOG_PRINT(LOG_WARNING, "Memcached[%s] Connect Failed!", mserver); settings.cache_on = false; } else { LOG_PRINT(LOG_INFO, "memcached connection to: %s", mserver); settings.cache_on = true; } memcached_free(memc); } else LOG_PRINT(LOG_INFO, "Don't use memcached as cache."); //init magickwand MagickWandGenesis(); //begin to start httpd... LOG_PRINT(LOG_INFO, "Begin to Start Httpd Server..."); evbase = event_base_new(); evhtp_t * htp = evhtp_new(evbase, NULL); evhtp_set_cb(htp, "/dump", dump_request_cb, NULL); evhtp_set_cb(htp, "/upload", post_request_cb, NULL); //evhtp_set_gencb(htp, echo_cb, NULL); evhtp_set_gencb(htp, send_document_cb, NULL); #ifndef EVHTP_DISABLE_EVTHR evhtp_use_threads(htp, NULL, settings.num_threads, NULL); #endif evhtp_set_max_keepalive_requests(htp, settings.max_keepalives); evhtp_bind_socket(htp, "0.0.0.0", settings.port, settings.backlog); event_base_loop(evbase, 0); evhtp_unbind_socket(htp); evhtp_free(htp); event_base_free(evbase); MagickWandTerminus(); fprintf(stdout, "\nByebye!\n"); return 0; }
/** * @brief main The entrance of zimg. * * @param argc Count of args. * @param argv Arg list. * * @return It returns a int to system. */ int main(int argc, char **argv) { int i; retry_sleep.tv_sec = 0; retry_sleep.tv_nsec = RETRY_TIME_WAIT; //1000 ns = 1 us /* Set signal handlers */ sigset_t sigset; sigemptyset(&sigset); struct sigaction siginfo = { .sa_handler = sighandler, .sa_mask = sigset, .sa_flags = SA_RESTART, }; sigaction(SIGINT, &siginfo, NULL); sigaction(SIGTERM, &siginfo, NULL); if(argc < 2) { usage(argc, argv); return -1; } settings_init(); const char *conf_file = NULL; for(i=1; i<argc; i++) { if(strcmp(argv[i], "-d") == 0){ settings.is_daemon = 1; }else{ conf_file = argv[i]; } } if(conf_file == NULL) { usage(argc, argv); return -1; } if(is_file(conf_file) == -1) { fprintf(stderr, "'%s' is not a file or not exists!\n", conf_file); return -1; } if(load_conf(conf_file) == -1) { fprintf(stderr, "'%s' load failed!\n", conf_file); return -1; } if(settings.is_daemon == 1) { if(daemon(1, 1) < 0) { fprintf(stderr, "Create daemon failed!\n"); return -1; } else { fprintf(stdout, "zimg %s\n", settings.version); fprintf(stdout, "Copyright (c) 2013-2014 zimg.buaa.us\n"); fprintf(stderr, "\n"); } } //init the Path zimg need to use. LOG_PRINT(LOG_DEBUG, "Begin to Init the Path zimg Using..."); //start log module... ./log/zimg.log if(settings.log) { const char *log_path = "./log"; if(is_dir(log_path) != 1) { if(mk_dir(log_path) != 1) { LOG_PRINT(LOG_DEBUG, "log_path[%s] Create Failed!", log_path); fprintf(stderr, "log_path[%s] Create Failed!\n", log_path); return -1; } } log_init(); } if(is_dir(settings.img_path) != 1) { if(mk_dir(settings.img_path) != 1) { LOG_PRINT(LOG_DEBUG, "img_path[%s] Create Failed!", settings.img_path); fprintf(stderr, "%s Create Failed!\n", settings.img_path); return -1; } } LOG_PRINT(LOG_DEBUG,"Paths Init Finished."); if(settings.mode == 2) { LOG_PRINT(LOG_DEBUG, "Begin to Test Memcached Connection..."); memcached_st *beans = memcached_create(NULL); char mserver[32]; snprintf(mserver, 32, "%s:%d", settings.beansdb_ip, settings.beansdb_port); memcached_server_st *servers = memcached_servers_parse(mserver); servers = memcached_servers_parse(mserver); memcached_server_push(beans, servers); memcached_server_list_free(servers); memcached_behavior_set(beans, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 0); memcached_behavior_set(beans, MEMCACHED_BEHAVIOR_NO_BLOCK, 1); memcached_behavior_set(beans, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE, 1); LOG_PRINT(LOG_DEBUG, "beansdb Connection Init Finished."); if(set_cache(beans, "zimg", "1") == -1) { LOG_PRINT(LOG_DEBUG, "Beansdb[%s] Connect Failed!", mserver); fprintf(stderr, "Beansdb[%s] Connect Failed!\n", mserver); memcached_free(beans); return -1; } else { LOG_PRINT(LOG_DEBUG, "beansdb connected to: %s", mserver); } memcached_free(beans); } else if(settings.mode == 3) { redisContext* c = redisConnect(settings.ssdb_ip, settings.ssdb_port); if(c->err) { redisFree(c); LOG_PRINT(LOG_DEBUG, "Connect to ssdb server faile"); fprintf(stderr, "SSDB[%s:%d] Connect Failed!\n", settings.ssdb_ip, settings.ssdb_port); return -1; } else { LOG_PRINT(LOG_DEBUG, "Connect to ssdb server Success"); } } //init magickwand MagickWandGenesis(); //begin to start httpd... LOG_PRINT(LOG_DEBUG, "Begin to Start Httpd Server..."); LOG_PRINT(LOG_INFO, "zimg started"); evbase = event_base_new(); evhtp_t *htp = evhtp_new(evbase, NULL); evhtp_set_cb(htp, "/dump", dump_request_cb, NULL); evhtp_set_cb(htp, "/upload", post_request_cb, NULL); //evhtp_set_gencb(htp, echo_cb, NULL); evhtp_set_gencb(htp, send_document_cb, NULL); #ifndef EVHTP_DISABLE_EVTHR evhtp_use_threads(htp, init_thread, settings.num_threads, NULL); #endif evhtp_set_max_keepalive_requests(htp, settings.max_keepalives); evhtp_bind_socket(htp, "0.0.0.0", settings.port, settings.backlog); event_base_loop(evbase, 0); evhtp_unbind_socket(htp); evhtp_free(htp); event_base_free(evbase); MagickWandTerminus(); free_access_conf(settings.up_access); free_access_conf(settings.down_access); fprintf(stdout, "\nByebye!\n"); return 0; }