static void js_srv(struct v7 *v7, struct v7_val *result, ns_callback_t cb, struct v7_val **args, int num_args) { struct v7_val *listening_port; struct ns_server *srv; if (num_args < 1 || args[0]->type != V7_OBJ || (listening_port = v7_lookup(args[0], "listening_port")) == NULL) return; result->type = V7_OBJ; srv = (struct ns_server *) calloc(1, sizeof(*srv)); ns_server_init(srv, result, cb); //v7_set_num(v7, result, "_priv", (unsigned long) srv); v7_set_obj(v7, result, "options", args[0]); switch (listening_port->type) { case V7_NUM: { char buf[100]; snprintf(buf, sizeof(buf), "%d", (int) listening_port->v.num); ns_bind(srv, buf); } break; case V7_STR: ns_bind(srv, listening_port->v.str.buf); break; default: fprintf(stderr, "%s\n", "Invalid listening_port"); break; } while (srv->listening_sock != INVALID_SOCKET && s_received_signal == 0) { ns_server_poll(srv, 1000); } ns_server_free(srv); }
int main(void) { struct ns_mgr mgr; const char *port1 = "1234", *port2 = "127.0.0.1:17000"; ns_mgr_init(&mgr, NULL); ns_bind(&mgr, port1, ev_handler, NULL); ns_bind(&mgr, port2, ev_handler, NULL); printf("Starting echo mgr on ports %s, %s\n", port1, port2); for (;;) { ns_mgr_poll(&mgr, 1000); } ns_mgr_free(&mgr); return 0; }
static const char *test_http_index(void) { struct ns_mgr mgr; struct ns_connection *nc; const char *local_addr = "127.0.0.1:7777"; char buf[20] = ""; ns_mgr_init(&mgr, NULL); ASSERT((nc = ns_bind(&mgr, local_addr, cb1)) != NULL); ns_set_protocol_http_websocket(nc); /* Test directory. */ ASSERT((nc = ns_connect(&mgr, local_addr, cb9)) != NULL); ns_set_protocol_http_websocket(nc); nc->user_data = buf; ns_printf(nc, "GET /%s HTTP/1.0\n\n", "/"); system("echo testdata >index.html"); /* Run event loop. Use more cycles to let file download complete. */ poll_mgr(&mgr, 200); ns_mgr_free(&mgr); system("rm index.html"); /* Check that test buffer has been filled by the callback properly. */ ASSERT(strcmp(buf, "testdata\n") == 0); return NULL; }
int main(int argc, char *argv[]) { struct ns_mgr mgr; struct ns_connection *nc; int i; char *cp; ns_mgr_init(&mgr, NULL); nc = ns_bind(&mgr, s_http_port, ev_handler); ns_set_protocol_http_websocket(nc); s_http_server_opts.document_root = "."; s_http_server_opts.enable_directory_listing = "yes"; /* Use current binary directory as document root */ if (argc > 0 && ((cp = strrchr(argv[0], '/')) != NULL || (cp = strrchr(argv[0], '/')) != NULL)) { *cp = '\0'; s_http_server_opts.document_root = argv[0]; } /* Process command line options to customize HTTP server */ for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-D") == 0 && i + 1 < argc) { mgr.hexdump_file = argv[++i]; } else if (strcmp(argv[i], "-d") == 0 && i + 1 < argc) { s_http_server_opts.document_root = argv[++i]; } else if (strcmp(argv[i], "-a") == 0 && i + 1 < argc) { s_http_server_opts.auth_domain = argv[++i]; } else if (strcmp(argv[i], "-P") == 0 && i + 1 < argc) { s_http_server_opts.global_auth_file = argv[++i]; } else if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) { s_http_server_opts.per_directory_auth_file = argv[++i]; } else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) { s_http_server_opts.url_rewrites = argv[++i]; #ifndef NS_DISABLE_CGI } else if (strcmp(argv[i], "-i") == 0 && i + 1 < argc) { s_http_server_opts.cgi_interpreter = argv[++i]; #endif #ifdef NS_ENABLE_SSL } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) { const char *ssl_cert = argv[++i]; const char *err_str = ns_set_ssl(nc, ssl_cert, NULL); if (err_str != NULL) { fprintf(stderr, "Error loading SSL cert: %s\n", err_str); exit(1); } #endif } } printf("Starting RESTful server on port %s\n", s_http_port); for (;;) { ns_mgr_poll(&mgr, 1000); } ns_mgr_free(&mgr); return 0; }
static const char *test_http_errors(void) { struct ns_mgr mgr; struct ns_connection *nc; const char *local_addr = "127.0.0.1:7777"; char status[40] = ""; ns_mgr_init(&mgr, NULL); ASSERT((nc = ns_bind(&mgr, local_addr, cb1)) != NULL); ns_set_protocol_http_websocket(nc); /* Test file which exists but cannot be opened */ ASSERT((nc = ns_connect(&mgr, local_addr, cb8)) != NULL); ns_set_protocol_http_websocket(nc); nc->user_data = status; system("touch test_unreadable; chmod 000 test_unreadable"); ns_printf(nc, "GET /%s HTTP/1.0\n\n", "../test_unreadable"); /* Run event loop. Use more cycles to let file download complete. */ poll_mgr(&mgr, 200); system("rm -f test_unreadable"); /* Check that it failed */ ASSERT(strncmp(status, "HTTP/1.1 500", strlen("HTTP/1.1 500")) == 0); /* Test non existing file */ ASSERT((nc = ns_connect(&mgr, local_addr, cb8)) != NULL); ns_set_protocol_http_websocket(nc); nc->user_data = status; ns_printf(nc, "GET /%s HTTP/1.0\n\n", "/please_dont_create_this_file_srsly"); /* Run event loop. Use more cycles to let file download complete. */ poll_mgr(&mgr, 200); /* Check that it failed */ ASSERT(strncmp(status, "HTTP/1.1 404", strlen("HTTP/1.1 404")) == 0); /* Test directory without index.html */ ASSERT((nc = ns_connect(&mgr, local_addr, cb8)) != NULL); ns_set_protocol_http_websocket(nc); nc->user_data = status; ns_printf(nc, "GET /%s HTTP/1.0\n\n", "/"); /* Run event loop. Use more cycles to let file download complete. */ poll_mgr(&mgr, 200); /* Check that it failed */ ASSERT(strncmp(status, "HTTP/1.1 403", strlen("HTTP/1.1 403")) == 0); /* Cleanup */ ns_mgr_free(&mgr); return NULL; }
int main(void) { struct ns_mgr mgr; struct ns_connection *nc; ns_mgr_init(&mgr, NULL); nc = ns_bind(&mgr, s_http_port, ev_handler); ns_set_protocol_http_websocket(nc); printf("Starting JSON-RPC server on port %s\n", s_http_port); for (;;) { ns_mgr_poll(&mgr, 1000); } ns_mgr_free(&mgr); return 0; }
static const char *test_udp(void) { struct ns_mgr mgr; struct ns_connection *nc; const char *address = "udp://127.0.0.1:7878"; char buf[20] = ""; ns_mgr_init(&mgr, buf); ASSERT(ns_bind(&mgr, address, eh3) != NULL); ASSERT((nc = ns_connect(&mgr, address, eh3)) != NULL); ns_printf(nc, "%s", "boo!"); { int i; for (i = 0; i < 50; i++) ns_mgr_poll(&mgr, 1); } ASSERT(memcmp(buf, "boo!", 4) == 0); ns_mgr_free(&mgr); return NULL; }
static const char *test_http(void) { struct ns_mgr mgr; struct ns_connection *nc; const char *local_addr = "127.0.0.1:7777"; char buf[20] = "", status[20] = "", mime[20] = ""; ns_mgr_init(&mgr, NULL); ASSERT((nc = ns_bind(&mgr, local_addr, cb1)) != NULL); ns_set_protocol_http_websocket(nc); /* Valid HTTP request. Pass test buffer to the callback. */ ASSERT((nc = ns_connect(&mgr, local_addr, cb2)) != NULL); ns_set_protocol_http_websocket(nc); nc->user_data = buf; ns_printf(nc, "%s", "POST /foo HTTP/1.0\nContent-Length: 10\n\n" "0123456789"); /* Invalid HTTP request */ ASSERT((nc = ns_connect(&mgr, local_addr, cb2)) != NULL); ns_set_protocol_http_websocket(nc); ns_printf(nc, "%s", "bl\x03\n\n"); /* Test static file download by downloading this executable, argv[0] */ ASSERT((nc = ns_connect(&mgr, local_addr, cb7)) != NULL); ns_set_protocol_http_websocket(nc); nc->user_data = status; ns_printf(nc, "GET /%s HTTP/1.0\n\n", s_argv_0); /* Test mime type for static file */ ASSERT((nc = ns_connect(&mgr, local_addr, cb10)) != NULL); ns_set_protocol_http_websocket(nc); nc->user_data = mime; ns_printf(nc, "%s", "GET /data/dummy.xml HTTP/1.0\n\n"); /* Run event loop. Use more cycles to let file download complete. */ poll_mgr(&mgr, 200); ns_mgr_free(&mgr); /* Check that test buffer has been filled by the callback properly. */ ASSERT(strcmp(buf, "[/foo 10]") == 0); ASSERT(strcmp(status, "success") == 0); ASSERT(strcmp(mime, "text/xml") == 0); return NULL; }
int main(int argc, char *argv[]) { struct ns_mgr mgr; if (argc != 3) { fprintf(stderr, "Usage: %s <port> <client|server>\n", argv[0]); exit(EXIT_FAILURE); } else if (strcmp(argv[2], "client") == 0) { int fds[2]; struct ns_connection *ioconn, *server_conn; ns_mgr_init(&mgr, NULL, client_handler); // Connect to the pubsub server server_conn = ns_connect(&mgr, argv[1], NULL); if (server_conn == NULL) { fprintf(stderr, "Cannot connect to port %s\n", argv[1]); exit(EXIT_FAILURE); } // Create a socketpair and give one end to the thread that reads stdin ns_socketpair(fds); ns_start_thread(stdin_thread, &fds[1]); // The other end of a pair goes inside the server ioconn = ns_add_sock(&mgr, fds[0], NULL); ioconn->flags |= NSF_USER_1; // Mark this so we know this is a stdin ioconn->user_data = server_conn; } else { // Server code path ns_mgr_init(&mgr, NULL, server_handler); ns_bind(&mgr, argv[1], NULL); printf("Starting pubsub server on port %s\n", argv[1]); } for (;;) { ns_mgr_poll(&mgr, 1000); } ns_mgr_free(&mgr); return EXIT_SUCCESS; }
int main(void) { struct ns_mgr mgr; struct ns_connection *nc; signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); ns_mgr_init(&mgr, NULL); nc = ns_bind(&mgr, s_http_port, ev_handler); s_http_server_opts.document_root = "."; ns_set_protocol_http_websocket(nc); printf("Started on port %s\n", s_http_port); while (s_signal_received == 0) { ns_mgr_poll(&mgr, 200); } ns_mgr_free(&mgr); return 0; }
static const char *test_mgr_with_ssl(int use_ssl) { char addr[100] = "127.0.0.1:0", ip[sizeof(addr)], buf[100] = ""; struct ns_mgr mgr; struct ns_connection *nc; int port, port2; #ifndef NS_ENABLE_SSL (void)use_ssl; #endif ns_mgr_init(&mgr, NULL); /* mgr.hexdump_file = "/dev/stdout"; */ ASSERT((nc = ns_bind(&mgr, addr, eh1)) != NULL); port2 = htons(nc->sa.sin.sin_port); ASSERT(port2 > 0); #ifdef NS_ENABLE_SSL if (use_ssl) { ASSERT(ns_set_ssl(nc, S_PEM, CA_PEM) == NULL); } #endif ns_sock_to_str(nc->sock, addr, sizeof(addr), 3); ASSERT(sscanf(addr, "%[^:]:%d", ip, &port) == 2); ASSERT(strcmp(ip, "127.0.0.1") == 0); ASSERT(port == port2); ASSERT((nc = ns_connect(&mgr, addr, eh1)) != NULL); #ifdef NS_ENABLE_SSL if (use_ssl) { ASSERT(ns_set_ssl(nc, C_PEM, CA_PEM) == NULL); } #endif nc->user_data = buf; poll_mgr(&mgr, 50); ASSERT(strcmp(buf, "ok!") == 0); ns_mgr_free(&mgr); return NULL; }
int main(int argc, char *argv[]) { const char *script = "nsv7.js", *port = "4000"; struct ns_server server; struct v7 *v7; int i; // Parse command line options for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-f") == 0 && i + 1 < argc) { script = argv[++i]; } else if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) { port = argv[++i]; } else { elog(1, "Usage: %s [-f FILE] [-p PORT]", argv[0]); } } signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); // Initialize scripting engine v7 = v7_create(); v7_init_stdlib(v7); if (v7_exec_file(v7, script) != V7_OK) { elog(1, "Error executing %s", script); } // Initialize server ns_server_init(&server, v7, ev_handler); ns_bind(&server, port); while (s_received_signal == 0) { ns_server_poll(&server, 1000); } printf("Existing on signal %d\n", s_received_signal); v7_destroy(&v7); ns_server_free(&server); return EXIT_SUCCESS; }
static const char *test_rpc(void) { struct ns_mgr mgr; struct ns_connection *nc; const char *local_addr = "127.0.0.1:7779"; char buf[100] = ""; ns_mgr_init(&mgr, NULL); ASSERT((nc = ns_bind(&mgr, local_addr, rpc_server)) != NULL); ns_set_protocol_http_websocket(nc); ASSERT((nc = ns_connect(&mgr, local_addr, rpc_client)) != NULL); ns_set_protocol_http_websocket(nc); nc->user_data = buf; poll_mgr(&mgr, 50); ns_mgr_free(&mgr); ASSERT(strcmp(buf, "1 1 16") == 0); return NULL; }
/* Big payloads follow a different code path because it will use the extended * length field and possibly ns_avprintf will need to reallocate the buffer. */ static const char *test_websocket_big(void) { struct ns_mgr mgr; struct ns_connection *nc; const char *local_addr = "127.0.0.1:7778"; char buf[20] = ""; struct big_payload_params params; params.buf = buf; ns_mgr_init(&mgr, NULL); /* mgr.hexdump_file = "/dev/stdout"; */ ASSERT((nc = ns_bind(&mgr, local_addr, cb3_big)) != NULL); ns_set_protocol_http_websocket(nc); /* Websocket request */ ASSERT((nc = ns_connect(&mgr, local_addr, cb4_big)) != NULL); ns_set_protocol_http_websocket(nc); params.size = 8192; nc->user_data = ¶ms; ns_send_websocket_handshake(nc, "/ws", NULL); poll_mgr(&mgr, 50); /* Check that test buffer has been filled by the callback properly. */ ASSERT(strcmp(buf, "success") == 0); /* Websocket request */ ASSERT((nc = ns_connect(&mgr, local_addr, cb4_big)) != NULL); ns_set_protocol_http_websocket(nc); params.size = 65535; nc->user_data = ¶ms; ns_send_websocket_handshake(nc, "/ws", NULL); poll_mgr(&mgr, 50); ns_mgr_free(&mgr); /* Check that test buffer has been filled by the callback properly. */ ASSERT(strcmp(buf, "success") == 0); return NULL; }
int main(void) { struct ns_mgr mgr; const char *address = "0.0.0.0:1883"; struct ns_connection *nc; struct ns_mqtt_broker brk; ns_mgr_init(&mgr, NULL); ns_mqtt_broker_init(&brk, NULL); if ((nc = ns_bind(&mgr, address, ns_mqtt_broker)) == NULL) { fprintf(stderr, "ns_bind(%s) failed\n", address); exit(EXIT_FAILURE); } nc->user_data = &brk; /* * TODO: Add a HTTP status page that shows current sessions * and subscriptions */ for(;;) { ns_mgr_poll(&mgr, 1000); } }
int main(int argc, char *argv[]) { struct ns_mgr mgr; struct ns_connection *nc; int i, redirect = 0; const char *vhost = NULL; ns_mgr_init(&mgr, NULL); /* Parse command line arguments */ for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-D") == 0) { mgr.hexdump_file = argv[i + 1]; i++; } else if (strcmp(argv[i], "-k") == 0) { s_backend_keepalive = 1; } else if (strcmp(argv[i], "-l") == 0 && i + 1 < argc) { if (strcmp(argv[i + 1], "-") == 0) { s_log_file = stdout; } else { s_log_file = fopen(argv[i + 1], "a"); if (s_log_file == NULL) { perror("fopen"); exit(EXIT_FAILURE); } } i++; } else if (strcmp(argv[i], "-p") == 0) { s_http_port = argv[i + 1]; i++; } else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) { redirect = 1; } else if (strcmp(argv[i], "-v") == 0 && i + 1 < argc) { if (strcmp(argv[i + 1], "") == 0) { vhost = NULL; } else { vhost = argv[i + 1]; } i++; } else if (strcmp(argv[i], "-b") == 0 && i + 2 < argc) { struct http_backend *be = vhost != NULL ? &s_vhost_backends[s_num_vhost_backends++] : &s_default_backends[s_num_default_backends++]; STAILQ_INIT(&be->conns); char *r = NULL; be->vhost = vhost; be->uri_prefix = argv[i + 1]; be->host_port = argv[i + 2]; be->redirect = redirect; be->uri_prefix_replacement = be->uri_prefix; if ((r = strchr(be->uri_prefix, '=')) != NULL) { *r = '\0'; be->uri_prefix_replacement = r + 1; } printf( "Adding backend for %s%s : %s " "[redirect=%d,prefix_replacement=%s]\n", be->vhost == NULL ? "" : be->vhost, be->uri_prefix, be->host_port, be->redirect, be->uri_prefix_replacement); vhost = NULL; redirect = 0; i += 2; #ifdef NS_ENABLE_SSL } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) { s_ssl_cert = argv[++i]; #endif } else { print_usage_and_exit(argv[0]); } } /* Open listening socket */ if ((nc = ns_bind(&mgr, s_http_port, ev_handler)) == NULL) { fprintf(stderr, "ns_bind(%s) failed\n", s_http_port); exit(EXIT_FAILURE); } #if NS_ENABLE_SSL if (s_ssl_cert != NULL) { const char *err_str = ns_set_ssl(nc, s_ssl_cert, NULL); if (err_str != NULL) { fprintf(stderr, "Error loading SSL cert: %s\n", err_str); exit(1); } } #endif ns_set_protocol_http_websocket(nc); if (s_num_vhost_backends + s_num_default_backends == 0) { print_usage_and_exit(argv[0]); } signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); /* Run event loop until signal is received */ printf("Starting LB on port %s\n", s_http_port); while (s_sig_num == 0) { ns_mgr_poll(&mgr, 1000); } /* Cleanup */ ns_mgr_free(&mgr); printf("Exiting on signal %d\n", s_sig_num); return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { struct ns_mgr mgr; struct ns_connection *nc; int i; int redirect; const char *vhost = NULL; ns_mgr_init(&mgr, NULL); /* Parse command line arguments */ for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-D") == 0) { mgr.hexdump_file = argv[i + 1]; i++; } else if (strcmp(argv[i], "-p") == 0) { s_http_port = argv[i + 1]; i++; } else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) { redirect = 1; i++; } else if (strcmp(argv[i], "-v") == 0 && i + 1 < argc) { vhost = argv[i + 1]; i++; } else if (strcmp(argv[i], "-b") == 0 && i + 2 < argc) { s_http_backends[s_num_http_backends].vhost = vhost; s_http_backends[s_num_http_backends].uri_prefix = argv[i + 1]; s_http_backends[s_num_http_backends].host_port = argv[i + 2]; s_http_backends[s_num_http_backends].redirect = redirect; s_num_http_backends++; vhost = NULL; redirect = 0; i += 2; #ifdef NS_ENABLE_SSL } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) { s_ssl_cert = argv[++i]; #endif } } /* Open listening socket */ if ((nc = ns_bind(&mgr, s_http_port, ev_handler)) == NULL) { fprintf(stderr, "ns_bind(%s) failed\n", s_http_port); exit(EXIT_FAILURE); } #if NS_ENABLE_SSL if (s_ssl_cert != NULL) { const char *err_str = ns_set_ssl(nc, s_ssl_cert, NULL); if (err_str != NULL) { fprintf(stderr, "Error loading SSL cert: %s\n", err_str); exit(1); } } #endif if (s_num_http_backends == 0) { fprintf(stderr, "Usage: %s [-D debug_dump_file] [-p http_port] " #if NS_ENABLE_SSL "[-s ssl_cert] " #endif "<[-r] [-v vhost] -b uri_prefix host_port> ... \n", argv[0]); exit(EXIT_FAILURE); } signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); /* Run event loop until signal is received */ printf("Starting LB on port %s\n", s_http_port); while (s_sig_num == 0) { ns_mgr_poll(&mgr, 1000); } /* Cleanup */ ns_mgr_free(&mgr); printf("Exiting on signal %d\n", s_sig_num); return EXIT_SUCCESS; }