struct mg_context * start_websocket_server()
{
    const char * options[] = { "document_root", DOCUMENT_ROOT,
        "ssl_certificate", SSL_CERT,
        "listening_ports", PORT,
        "request_timeout_ms", "5000",
        0
    };
    struct mg_callbacks callbacks;
    struct mg_context *ctx;

    memset(&callbacks, 0, sizeof(callbacks));

#if defined(MG_LEGACY_INTERFACE)
    /* Obsolete: */
    callbacks.websocket_connect = websock_server_connect;
    callbacks.websocket_ready = websocket_server_ready;
    callbacks.websocket_data = websocket_server_data;
    callbacks.connection_close = websocket_server_connection_close;

    ctx = mg_start(&callbacks, 0, options);
#else
    /* New interface: */
    ctx = mg_start(&callbacks, 0, options);

    mg_set_websocket_handler(ctx, "/websocket",
                             websocket_server_connect,
                             websocket_server_ready,
                             websocket_server_data,
                             websocket_server_connection_close,
                             NULL);
#endif

    return ctx;
}
Exemple #2
0
int main(void) {
  struct mg_callbacks callbacks;
  struct mg_context *ctx;

  // Initialize random number generator. It will be used later on for
  // the session identifier creation.
  srand((unsigned) time(0));

  // Setup and start Civetweb
  memset(&callbacks, 0, sizeof(callbacks));
  callbacks.begin_request = begin_request_handler;
  if ((ctx = mg_start(&callbacks, NULL, options)) == NULL) {
    printf("%s\n", "Cannot start chat server, fatal exit");
    exit(EXIT_FAILURE);
  }

  // Wait until enter is pressed, then exit
  printf("Chat server started on ports %s, press enter to quit.\n",
         mg_get_option(ctx, "listening_ports"));
  getchar();
  mg_stop(ctx);
  printf("%s\n", "Chat server stopped.");

  return EXIT_SUCCESS;
}
int main(int argc, char *argv[])
{

    const char * options[] = { "document_root", DOCUMENT_ROOT,
                               "listening_ports", PORT, 0
                             };
    struct mg_callbacks callbacks;
    struct mg_context *ctx;

    memset(&callbacks, 0, sizeof(callbacks));
    ctx = mg_start(&callbacks, 0, options);

    mg_set_request_handler(ctx,EXAMPLE_URI, ExampleHandler,0);
    mg_set_request_handler(ctx,EXIT_URI, ExitHandler,0);
    mg_set_request_handler(ctx,"/a", AHandler,0);
    mg_set_request_handler(ctx,"/a/b", ABHandler,0);
    mg_set_request_handler(ctx,"**.foo$", FooHandler,0);

    printf("Browse files at http://localhost:%s/\n", PORT);
    printf("Run example at http://localhost:%s%s\n", PORT, EXAMPLE_URI);
    printf("Exit at http://localhost:%s%s\n", PORT, EXIT_URI);

    while (!exitNow) {
#ifdef _WIN32
        Sleep(1000);
#else
        sleep(1);
#endif
    }

    printf("Bye!\n");

    return 0;
}
Exemple #4
0
int httpserver_init(unsigned port)
{
   char str[16];
   snprintf(str, sizeof(str), "%u", port);
   str[sizeof(str) - 1] = 0;

   const char* options[] =
   {
      "listening_ports", str,
      NULL, NULL
   };

   memset(&s_httpserver_callbacks, 0, sizeof(s_httpserver_callbacks));
   s_httpserver_ctx = mg_start(&s_httpserver_callbacks, NULL, options);

   if (s_httpserver_ctx == NULL)
      return -1;

   mg_set_request_handler(s_httpserver_ctx, "/" BASIC_INFO, httpserver_handle_basic_info, NULL);

   mg_set_request_handler(s_httpserver_ctx, "/" MEMORY_MAP, httpserver_handle_mmaps, NULL);
   mg_set_request_handler(s_httpserver_ctx, "/" MEMORY_MAP "/", httpserver_handle_mmaps, NULL);

   return 0;
}
Exemple #5
0
static int ml_aitvaras_init(lua_State* l) {
	checkargs(0, "aitvaras.init");

	invocation_cs = async_make_cs();
	mempool_init(&invocation_pool, sizeof(Invocation));

	cb_l = l;

	lua_getglobal(l, "aitvaras");	

	if(!_validate_conf(l)) 
		return luaL_error(l, "invalid configuration");

	const char* lobby_addr = _getstr(l, "lobby_addr");
	const char* server_addr = _getstr(l, "server_addr");
	char* enlist_req = alloca(strlen(lobby_addr) + strlen("/enlist") + 1);
	strcpy(enlist_req, lobby_addr);
	strcat(enlist_req, "/enlist");

	http_post(enlist_req, false, server_addr, NULL, _enlist_cb);

	aatree_init(&clients);

	const char* options[] = {
		"listening_ports", _getstr(l, "listening_port"),
		"document_root", _getstr(l, "document_root"),
		NULL
	};
	mg_ctx = mg_start(mg_callback, NULL, options);

	lua_pop(l, 1);

	return 0;
}
Exemple #6
0
static void
test_set_option(void)
{
	struct {
		const char	*opt_name;	/* Option name		*/
		const char	*opt_value;	/* Option value		*/
		int result;			/* Expected result	*/
	} tests[] = {
		{"aliases", "a,b,c", 0},	/* Zero length value	*/
		{"aliases", "a=,b=c,c=d", 0},	/* Zero length value	*/
		{"aliases", "=a,b=c,c=d", 0},	/* Zero length key	*/
		{"aliases", "a=b,b=c,c=d", 1},	/* OK */
		{"not_existent_option", "", -1}, /* Unknown option */
		{NULL, NULL, 0}
	};

	struct mg_context	*ctx;
	int			i;

	ctx = mg_start();
	for (i = 0; tests[i].opt_name != NULL; i++) {
		if (mg_set_option(ctx, tests[i].opt_name,
		    tests[i].opt_value) != tests[i].result)
			fail("%s: mg_set_option(%s): failed expectation",
			    __func__, tests[i].opt_name);
	}
	mg_stop(ctx);
}
Exemple #7
0
int cg_init(cg_configuration *cg_conf)
{
   int rval = 0;

   struct mg_context  *ctx;
   struct mg_callbacks callbacks;

   const char *options[] = {
     "listening_ports", "8901",
     "document_root",   "websocket_html_root",
     NULL
   };

   // Setting all callback pointers to 0
   memset(&callbacks, 0, sizeof(callbacks));

   // Initialize
   callbacks.websocket_ready = websocket_ready_handler;

   // Respond to data received
   callbacks.websocket_data = websocket_data_handler;

   // Start the server
   ctx = mg_start(&callbacks, NULL, options);

   // Wait until the user press something
   getchar();

   // Stopping the server
   mg_stop(ctx);

   return rval;
}
TMongSrv::TMongSrv(const int& _PortN, const bool& FixedPortNP,
		const PNotify& _Notify, int Threads) :
		Notify(_Notify), PortN(_PortN), HomeNrFPath(
				TStr::GetNrFPath(TDir::GetCurDir())), Rnd(TTm::GetMSecsFromOsStart()) {

	ClientsLock = new TCriticalSection();
	const char *options[] = {
			//"document_root",  HomeNrFPath.GetCStr(),
			"listening_ports", TInt::GetStr(PortN).GetCStr(), "num_threads",
			TInt::GetStr(Threads).GetCStr(),
			//"enable_keep_alive", "yes",
			//"auth_domain", TStr("").GetCStr(),
			0 };

	Ctx = mg_start(&HandleRequest, NULL, options);

	IAssertR(Ctx != NULL, "Web-Server: Server failed to start!");

	TChA MsgChA;
	MsgChA += "Web-Server: Started at port ";
	MsgChA += TInt::GetStr(PortN);
	MsgChA += ".";
	TNotify::OnNotify(Notify, ntInfo, MsgChA);

	PMongSrv Pt(this);
	Registry.AddDat(PortN, Pt);

}
Exemple #9
0
END_TEST


START_TEST(test_mg_start_stop_https_server)
{
#ifndef NO_SSL

	struct mg_context *ctx;

	size_t ports_cnt;
	int ports[16];
	int ssl[16];
	struct mg_callbacks callbacks;
	char errmsg[256];

	const char *OPTIONS[8]; /* initializer list here is rejected by CI test */
	int opt_idx = 0;
	const char *ssl_cert = locate_ssl_cert();
	ck_assert(ssl_cert != NULL);

	memset((void *)OPTIONS, 0, sizeof(OPTIONS));
#if !defined(NO_FILES)
	OPTIONS[opt_idx++] = "document_root";
	OPTIONS[opt_idx++] = ".";
#endif
	OPTIONS[opt_idx++] = "listening_ports";
	OPTIONS[opt_idx++] = "8080r,8443s";
	OPTIONS[opt_idx++] = "ssl_certificate";
	OPTIONS[opt_idx++] = ssl_cert;

	ck_assert_int_le(opt_idx, (int)(sizeof(OPTIONS) / sizeof(OPTIONS[0])));
	ck_assert(OPTIONS[sizeof(OPTIONS) / sizeof(OPTIONS[0]) - 1] == NULL);
	ck_assert(OPTIONS[sizeof(OPTIONS) / sizeof(OPTIONS[0]) - 2] == NULL);


	memset(ports, 0, sizeof(ports));
	memset(ssl, 0, sizeof(ssl));
	memset(&callbacks, 0, sizeof(callbacks));
	memset(errmsg, 0, sizeof(errmsg));

	callbacks.log_message = log_msg_func;

	ctx = mg_start(&callbacks, (void *)errmsg, OPTIONS);
	test_sleep(1);
	ck_assert_str_eq(errmsg, "");
	ck_assert(ctx != NULL);

	ports_cnt = mg_get_ports(ctx, 16, ports, ssl);
	ck_assert_uint_eq(ports_cnt, 2);
	ck_assert_int_eq(ports[0], 8080);
	ck_assert_int_eq(ssl[0], 0);
	ck_assert_int_eq(ports[1], 8443);
	ck_assert_int_eq(ssl[1], 1);
	ck_assert_int_eq(ports[2], 0);
	ck_assert_int_eq(ssl[2], 0);

	test_sleep(1);
	mg_stop(ctx);
#endif
}
Exemple #10
0
static void start_mongoose(int argc, char *argv[]) {
  char *options[MAX_OPTIONS];
  int i;

  // Edit passwords file if -A option is specified
  if (argc > 1 && !strcmp(argv[1], "-A")) {
    if (argc != 6) {
      show_usage_and_exit();
    }
    exit(mg_modify_passwords_file(argv[2], argv[3], argv[4], argv[5]) ?
         EXIT_SUCCESS : EXIT_FAILURE);
  }

  // Show usage if -h or --help options are specified
  if (argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))) {
    show_usage_and_exit();
  }

  /* Update config based on command line arguments */
  process_command_line_arguments(argv, options);

  /* Setup signal handler: quit on Ctrl-C */
  signal(SIGTERM, signal_handler);
  signal(SIGINT, signal_handler);

  /* Start Mongoose */
  ctx = mg_start(&mongoose_callback, NULL, (const char **) options);
  for (i = 0; options[i] != NULL; i++) {
    free(options[i]);
  }

  if (ctx == NULL) {
    die("%s", "Failed to start Mongoose.");
  }
}
Exemple #11
0
/* Main program: Set callbacks and start the server.  */
int main(void)
{
    /* Test server will use this port */
    const char * PORT = "8080";

    /* Startup options for the server */
    struct mg_context *ctx;
    const char *options[] = {
        "listening_ports", PORT,
        NULL};
    struct mg_callbacks callbacks;

    memset(&callbacks, 0, sizeof(callbacks));
    callbacks.begin_request = begin_request_handler;
    callbacks.upload = upload_handler;

    /* Display a welcome message */
    printf("File upload demo.\n");
    printf("Open http://localhost:%s/ in your browser.\n\n", PORT);

    /* Start the server */
    ctx = mg_start(&callbacks, NULL, options);

    /* Wait until thr user hits "enter", then stop the server */
    getchar();
    mg_stop(ctx);

    return 0;
}
Exemple #12
0
web_engine::web_engine(emu_options &options)
	: m_options(options),
		m_machine(NULL),
		m_ctx(NULL),
		m_lastupdatetime(0),
		m_exiting_core(false)

{
	struct mg_callbacks callbacks;

	// List of options. Last element must be NULL.
	const char *web_options[] = {
		"listening_ports", options.http_port(),
		"document_root", options.http_path(),
		NULL
	};

	// Prepare callbacks structure.
	memset(&callbacks, 0, sizeof(callbacks));
	callbacks.begin_request = begin_request_handler_static;
	callbacks.websocket_ready = websocket_ready_handler_static;
	callbacks.websocket_data = websocket_data_handler_static;
	callbacks.http_error = begin_http_error_handler_static;

	// Start the web server.
	if (m_options.http()) {
		m_ctx = mg_start(&callbacks, this, web_options);

		mg_start_thread(websocket_keepalive_static, this);
	}

}
Exemple #13
0
  void Start()
  {
    Internal("Http::Start","()");

    if (enabled && !ctx)
    {
      // Try listening on the configured port number (8080 by default)
      // and advance foward until one is available

      for (int i = 0; i<100; ++i)
      {
        string j = print_string(port+i);
        const char *options[3] = { "listening_ports", j.c_str(), NULL};
        ctx = mg_start(&callback, NULL, options);
        if (ctx)
          break;
      }

      const char *option = NULL;
      if (ctx)
        option = mg_get_option(ctx,"listening_ports");

      if (option)
      {
        Info("Listening for HTTP connections on port ",option);
      }
      else
      {
        Info("Not listening for HTTP connections.");
      }
    }
  }
Exemple #14
0
static void start_mongoose(void)
{
#ifndef __ANDROID_
    const char *options[] = {
        "listening_ports", "8080",
        "document_root", ".",
        NULL
    };
    /* Setup signal handler: quit on Ctrl-C */
    signal(SIGTERM, signal_handler);
    signal(SIGINT, signal_handler);
#else
    const char *options[] = {
        "listening_ports", "8080",
        "document_root", "/mnt/sdcard/",
        NULL
    };
#endif

    /* Start Mongoose, and put hls_sys_t hls_glb->hls_ctx->m3u8_download_q to mongoose */
    ctx = mg_start(&mongoose_callback, NULL, (const char **) options);

    if (ctx == NULL) {
        die("%s", "Failed to start Mongoose.");
    }
}
Exemple #15
0
void run_ssdp(int port, const char *pFriendlyName, const char * pModelName, const char *pUuid) {
    struct sockaddr sa;
    socklen_t len = sizeof(sa);
    if(pFriendlyName) {
        strncpy(friendly_name, pFriendlyName, sizeof(friendly_name));
        friendly_name[255] = '\0';
    } else {
        strcpy(friendly_name, "DIAL server sample");
    }
    if(pModelName) {
        strncpy(model_name, pModelName, sizeof(model_name));
        uuid[255] = '\0';
    } else {
        strcpy(model_name, "deadbeef-dead-beef-dead-beefdeadbeef");
    }
    if(pUuid) {
        strncpy(uuid, pUuid, sizeof(uuid));
        uuid[255] = '\0';
    } else {
        strcpy(uuid, "deadbeef-dead-beef-dead-beefdeadbeef");
    }
    dial_port = port;
    get_local_address();
    ctx = mg_start(&request_handler, NULL, SSDP_PORT);
    if (mg_get_listen_addr(ctx, &sa, &len)) {
        my_port = ntohs(((struct sockaddr_in *)&sa)->sin_port);
    }
    printf("SSDP listening on %s:%d\n", ip_addr, my_port);
    handle_mcast();
}
Exemple #16
0
END_TEST


START_TEST(test_mg_start_stop_http_server)
{
	struct mg_context *ctx;
	const char *OPTIONS[] = {
	    "document_root", ".", "listening_ports", "8080", NULL,
	};
	size_t ports_cnt;
	int ports[16];
	int ssl[16];

	memset(ports, 0, sizeof(ports));
	memset(ssl, 0, sizeof(ssl));

	ctx = mg_start(NULL, NULL, OPTIONS);
	ck_assert(ctx != NULL);

	ports_cnt = mg_get_ports(ctx, 16, ports, ssl);
	ck_assert_uint_eq(ports_cnt, 1);
	ck_assert_int_eq(ports[0], 8080);
	ck_assert_int_eq(ssl[0], 0);
	ck_assert_int_eq(ports[1], 0);
	ck_assert_int_eq(ssl[1], 0);

	mg_Sleep(1);
	mg_stop(ctx);
}
Exemple #17
0
int main(int argc, char **argv)
{
    printf("rtvd %s\n", RTVD_VERSION);

    char *port = "8080";

    if (argc > 1)
        port = argv[1];

    char *webPath   = malloc(128);
    strcpy(webPath,"./"); 
    //if (get_conf_string("System", "WebServerPath", webPath) != RETURN_SUCCESS) {
    //    mg_set_option(ctx, "root", "./www");
   // } else {
    mg_set_option(ctx, "root", webPath);
   // }
    mg_set_option(ctx, "ports", port);
    //Test_InPutTs();
    mg_bind_to_uri(ctx, "/test", &show_post, "7");
    mg_bind_to_uri(ctx, "/stati", &stati_handler, "8");
    mg_bind_to_uri(ctx, "/s", &stream_page_handler, "9");
    mg_bind_to_uri(ctx, "/si", &stream_info_handler, "10");
    mg_bind_to_uri(ctx, "/ss", &stream_static_handler, "11");
    mg_bind_to_uri(ctx, "/pcr", &stream_pcr_handler, "12");
    mg_bind_to_uri(ctx, "/ajax/start_flow", &stream_start_flow_handler, "13");
    mg_bind_to_uri(ctx, "/ajax/stop_flow", &stream_stop_flow_handler, "14");

    mg_bind_to_error_code(ctx, 404, &test_error, NULL);
    ctx = mg_start();
    printf("Mongoose %s started on port(s) [%s], serving directory [%s]\n",
            mg_version(),
            mg_get_option(ctx, "listening_ports"),
            mg_get_option(ctx, "root"));
    while (1) {sleep(1);}
}
Exemple #18
0
static void test_mg_upload(void) {
  static const char *boundary = "OOO___MY_BOUNDARY___OOO";
  struct mg_context *ctx;
  struct mg_connection *conn;
  char ebuf[100], buf[20], *file_data, *post_data = NULL;
  int file_len, post_data_len;

  ASSERT((ctx = mg_start(&CALLBACKS, NULL, OPTIONS)) != NULL);
  ASSERT((file_data = read_file("mongoose.c", &file_len)) != NULL);
  post_data_len = alloc_printf(&post_data, 0,
                                       "--%s\r\n"
                                       "Content-Disposition: form-data; "
                                       "name=\"file\"; "
                                       "filename=\"%s\"\r\n\r\n"
                                       "%.*s\r\n"
                                       "--%s\r\n",
                                       boundary, upload_filename,
                                       file_len, file_data, boundary);
  ASSERT(post_data_len > 0);
  ASSERT((conn = mg_download("localhost", atoi(HTTPS_PORT), 1,
                             ebuf, sizeof(ebuf),
                             "POST /upload HTTP/1.1\r\n"
                             "Content-Length: %d\r\n"
                             "Content-Type: multipart/form-data; "
                             "boundary=%s\r\n\r\n"
                             "%.*s", post_data_len, boundary,
                             post_data_len, post_data)) != NULL);
  free(file_data), free(post_data);
  ASSERT(mg_read(conn, buf, sizeof(buf)) == (int) strlen(upload_ok_message));
  ASSERT(memcmp(buf, upload_ok_message, strlen(upload_ok_message)) == 0);
  mg_close_connection(conn);
  mg_stop(ctx);
}
static void WINAPI
ServiceMain(void)
{
   char path[MAX_PATH], *p, *av[] = {"mongoose_service", NULL, NULL};
   struct mg_context *ctx;

   av[1] = path;

   ss.dwServiceType      = SERVICE_WIN32;
   ss.dwCurrentState     = SERVICE_RUNNING;
   ss.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;

   hStatus = RegisterServiceCtrlHandler(service_name, ControlHandler);
   SetServiceStatus(hStatus, &ss);

   GetModuleFileName(NULL, path, sizeof(path));

   if ((p = strrchr(path, DIRSEP)) != NULL)
      *++p = '\0';

   strcat(path, CONFIG_FILE);           /* woo ! */

   Sleep(3000);
   if ((ctx = mg_start()) != NULL) {
      process_command_line_arguments(ctx, av);

      while (ss.dwCurrentState == SERVICE_RUNNING)
         Sleep(1000);
      mg_stop(ctx);
   }

   ss.dwCurrentState  = SERVICE_STOPPED;
   ss.dwWin32ExitCode = (DWORD) -1;
   SetServiceStatus(hStatus, &ss);
}
Exemple #20
0
int
main_ztv_webui_init(int argc, char *argv[])
{
	if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'A') {
		if (argc != 6)
			show_usage_and_exit();
		exit(mg_edit_passwords(argv[2], argv[3], argv[4],argv[5]));
	}

	if (argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")))
		show_usage_and_exit();

#ifndef _WIN32
	(void) signal(SIGCHLD, signal_handler);
#endif /* _WIN32 */
	(void) signal(SIGTERM, signal_handler);
	(void) signal(SIGINT, signal_handler);

	if ((ctx = mg_start()) == NULL) {
		(void) printf("%s\n", "Cannot initialize Mongoose context");
		exit(EXIT_FAILURE);
	}

	process_command_line_arguments(ctx, argv);
	if (mg_get_option(ctx, "ports") == NULL &&
	    mg_set_option(ctx, "ports", "8080") != 1)
		exit(EXIT_FAILURE);

	printf("Mongoose %s started on port(s) [%s], serving directory [%s]\n",
	    mg_version(),
	    mg_get_option(ctx, "ports"),
	    mg_get_option(ctx, "root"));

    mg_set_uri_callback(ctx, "/login", &login_page, NULL);
    mg_set_uri_callback(ctx, "/ztv", &ztv_page, NULL);
    mg_set_uri_callback(ctx, "/share.apk", &share_pkg,NULL);
    mg_set_uri_callback(ctx, "/shs", &shs_page, NULL);
    mg_set_uri_callback(ctx, "/about", &shs_page, NULL);
    mg_set_uri_callback(ctx, "/uploadfile", &upload_page, NULL);
    mg_set_uri_callback(ctx, "/upload.html", &upload_input_page, NULL);
    mg_set_uri_callback(ctx, "/upload.htm", &upload_input_page, NULL);    
    mg_set_uri_callback(ctx, "/r.html", &rili_page, NULL);
    mg_set_uri_callback(ctx, "/r.manifest", &r_manifest_page, NULL);        
    mg_set_uri_callback(ctx, "/http302Jobs.mp4", &http302Jobs_mp4_page, NULL);  
    mg_set_uri_callback(ctx, "/bbs.html", &bbs_input_page, NULL);  
    mg_set_uri_callback(ctx, "/bbs", &bbs_page, NULL);

	fflush(stdout);
/*	while (exit_flag == 0)
		sleep(1);

	(void) printf("Exiting on signal %d, "
	    "waiting for all threads to finish...", exit_flag);
	fflush(stdout);
	mg_stop(ctx);
	(void) printf("%s", " done.\n");   */

	return (EXIT_SUCCESS);
}
void Server::start() {
	//initializes Mongoose
	ctx = mg_start(&event_handler, NULL, options);
	if (ctx == NULL)
		throw 42;
	
	_log.log(LOG_STATUS,"PerVERT Server started on port %s.\n", mg_get_option(ctx, "listening_ports"));
}	
Exemple #22
0
static void test_user_data(void) {
  struct mg_context *ctx;

  ASSERT((ctx = mg_start(user_data_tester, (void *) 123, OPTIONS)) != NULL);
  ASSERT(ctx->user_data == (void *) 123);
  call_user(fc(ctx), MG_NEW_REQUEST);
  mg_stop(ctx);
}
Exemple #23
0
int main(void) {
  struct mg_context *ctx;
  const char *options[] = {"listening_ports", LISTENING_PORT, NULL};

  ctx = mg_start(callback, NULL, options);
  pause();
  return 0;
}
Exemple #24
0
static void test_mg_download(void) {
  char *p1, *p2, ebuf[100];
  int len1, len2, port = atoi(HTTPS_PORT);
  struct mg_connection *conn;
  struct mg_context *ctx;

  ASSERT((ctx = mg_start(event_handler, NULL, OPTIONS)) != NULL);

  ASSERT(mg_download(NULL, port, 0, ebuf, sizeof(ebuf), "") == NULL);
  ASSERT(mg_download("localhost", 0, 0, ebuf, sizeof(ebuf), "") == NULL);
  ASSERT(mg_download("localhost", port, 1, ebuf, sizeof(ebuf), "") == NULL);

  // Fetch nonexistent file, should see 404
  ASSERT((conn = mg_download("localhost", port, 1, ebuf, sizeof(ebuf), "%s",
                             "GET /gimbec HTTP/1.0\r\n\r\n")) != NULL);
  ASSERT(strcmp(conn->request_info.uri, "404") == 0);
  mg_close_connection(conn);

  // Fetch mongoose.c, should succeed
  ASSERT((conn = mg_download("localhost", port, 1, ebuf, sizeof(ebuf), "%s",
                             "GET /mongoose.c HTTP/1.0\r\n\r\n")) != NULL);
  ASSERT(!strcmp(conn->request_info.uri, "200"));
  ASSERT((p1 = read_conn(conn, &len1)) != NULL);
  ASSERT((p2 = read_file("mongoose.c", &len2)) != NULL);
  ASSERT(len1 == len2);
  ASSERT(memcmp(p1, p2, len1) == 0);
  free(p1), free(p2);
  mg_close_connection(conn);

  // Fetch in-memory file, should succeed.
  ASSERT((conn = mg_download("localhost", port, 1, ebuf, sizeof(ebuf), "%s",
                             "GET /blah HTTP/1.1\r\n\r\n")) != NULL);
  ASSERT((p1 = read_conn(conn, &len1)) != NULL);
  ASSERT(len1 == (int) strlen(inmemory_file_data));
  ASSERT(memcmp(p1, inmemory_file_data, len1) == 0);
  free(p1);
  mg_close_connection(conn);

  // Test SSL redirect, IP address
  ASSERT((conn = mg_download("localhost", atoi(HTTP_PORT), 0,
                             ebuf, sizeof(ebuf), "%s",
                             "GET /foo HTTP/1.1\r\n\r\n")) != NULL);
  ASSERT(strcmp(conn->request_info.uri, "302") == 0);
  ASSERT(strcmp(mg_get_header(conn, "Location"),
                "https://127.0.0.1:" HTTPS_PORT "/foo") == 0);
  mg_close_connection(conn);

  // Test SSL redirect, Host:
  ASSERT((conn = mg_download("localhost", atoi(HTTP_PORT), 0,
                             ebuf, sizeof(ebuf), "%s",
                             "GET /foo HTTP/1.1\r\nHost: a.b:77\n\n")) != NULL);
  ASSERT(strcmp(conn->request_info.uri, "302") == 0);
  ASSERT(strcmp(mg_get_header(conn, "Location"),
                "https://a.b:" HTTPS_PORT "/foo") == 0);
  mg_close_connection(conn);

  mg_stop(ctx);
}
Exemple #25
0
int main(void) {
  struct mg_context *ctx;
  const char *options[] = {"listening_ports", "8080", NULL};
  ctx = mg_start(options, event_handler, NULL);
  getchar();  // Wait until user hits "enter"
  mg_stop(ctx);

  return 0;
}
  void MongooseServer::Start()
  {
    if (!IsRunning())
    {
      std::string port = boost::lexical_cast<std::string>(port_);

      if (ssl_)
      {
        port += "s";
      }

      const char *options[] = {
        // Set the TCP port for the HTTP server
        "listening_ports", port.c_str(), 
        
        // Optimization reported by Chris Hafey
        // https://groups.google.com/d/msg/orthanc-users/CKueKX0pJ9E/_UCbl8T-VjIJ
        "enable_keep_alive", (keepAlive_ ? "yes" : "no"),

        // Set the SSL certificate, if any. This must be the last option.
        ssl_ ? "ssl_certificate" : NULL,
        certificate_.c_str(),
        NULL
      };

#if MONGOOSE_USE_CALLBACKS == 0
      pimpl_->context_ = mg_start(&Callback, this, options);

#elif MONGOOSE_USE_CALLBACKS == 1
      struct mg_callbacks callbacks;
      memset(&callbacks, 0, sizeof(callbacks));
      callbacks.begin_request = Callback;
      pimpl_->context_ = mg_start(&callbacks, this, options);

#else
#error Please set MONGOOSE_USE_CALLBACKS
#endif

      if (!pimpl_->context_)
      {
        throw OrthancException("Unable to launch the Mongoose server");
      }
    }
  }
Exemple #27
0
static void start_mongoose(int argc, char *argv[]) {
  struct mg_callbacks callbacks;
  char *options[MAX_OPTIONS];
  int i;

  // Edit passwords file if -A option is specified
  if (argc > 1 && !strcmp(argv[1], "-A")) {
    if (argc != 6) {
      show_usage_and_exit();
    }
    exit(mg_modify_passwords_file(argv[2], argv[3], argv[4], argv[5]) ?
         EXIT_SUCCESS : EXIT_FAILURE);
  }

  // Show usage if -h or --help options are specified
  if (argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))) {
    show_usage_and_exit();
  }

  options[0] = NULL;
  set_option(options, "document_root", ".");

  // Update config based on command line arguments
  process_command_line_arguments(argv, options);

  // Make sure we have absolute paths for files and directories
  // https://github.com/valenok/mongoose/issues/181
  set_absolute_path(options, "document_root", argv[0]);
  set_absolute_path(options, "put_delete_auth_file", argv[0]);
  set_absolute_path(options, "cgi_interpreter", argv[0]);
  set_absolute_path(options, "access_log_file", argv[0]);
  set_absolute_path(options, "error_log_file", argv[0]);
  set_absolute_path(options, "global_auth_file", argv[0]);
  set_absolute_path(options, "ssl_certificate", argv[0]);

  // Make extra verification for certain options
  verify_existence(options, "document_root", 1);
  verify_existence(options, "cgi_interpreter", 0);
  verify_existence(options, "ssl_certificate", 0);

  // Setup signal handler: quit on Ctrl-C
  signal(SIGTERM, signal_handler);
  signal(SIGINT, signal_handler);

  // Start Mongoose
  memset(&callbacks, 0, sizeof(callbacks));
  callbacks.log_message = &log_message;
  ctx = mg_start(&callbacks, NULL, (const char **) options);
  for (i = 0; options[i] != NULL; i++) {
    free(options[i]);
  }

  if (ctx == NULL) {
    die("%s", "Failed to start Mongoose.");
  }
}
Exemple #28
0
/**
 * @brief Thread to handle WebService requests
 * @return never returns until shutdown
 *
 * Receives requests over a web socket and acts on them.
 */
void *WebServiceThread( void *arg )
{
    char               *port;
    char               *logdir;
    char                buf[1024];
    char              **options;
    struct mg_context  *ctx;

    pthread_mutex_lock( startupMutex );

    port = pb_get_setting( "webServicePort" );
    if( !port || !atoi(port) ) {
        LogPrintNoArg( LOG_CRIT, "No WebService Port defined.  Aborting!" );
        return;
    }

    logdir = pb_get_setting( "webServiceLogDir" );
    if( !logdir ) {
        logdir = memstrlink( "/tmp" );
    }

    LogPrint( LOG_DEBUG, "Web Service listening on port %s", port );
    LogPrint( LOG_DEBUG, "Web Logs in %s", logdir );

    options = CREATEN(char *, 7);
    options[0] = memstrlink("ports");
    options[1] = memstrdup(port);
    options[2] = memstrlink("access_log");
    sprintf( buf, "%s/access.log", logdir );
    options[3] = memstrdup(buf);
    options[4] = memstrlink("error_log");
    sprintf( buf, "%s/error.log", logdir );
    options[5] = memstrdup(buf);
    options[6] = NULL;

    memfree( port );
    memfree( logdir );

    mg_set_allocs( &webServiceAllocs );

    /*
     * Initialize mongoose context.
     * Start listening on port specified.
     */
    ctx = mg_start(webServiceCallback, NULL, (const char **)options);

    while( !GlobalAbort ) {
        sleep(1);
    }
    
    mg_stop(ctx);

    LogPrintNoArg(LOG_INFO, "Ending WebServiceThread");
    return( NULL );
}
Exemple #29
0
void HttpServer::Run(std::string indexDirectory)
{
    //Some options ( Last option must be NULL )
    const char *options[] = {"listening_ports", "2828", "document_root", indexDirectory.c_str(), NULL};

    //Setup callbacks, i.e. nothing to do :)
    struct mg_callbacks callbacks;
    memset(&callbacks, 0, sizeof(callbacks));

    ctx = mg_start(&callbacks, NULL, options);
}
int
mongoosed_main(int argc, char *argv[])
{
   char dflt_port[5] = "80";
#if !defined(NO_AUTH)
   if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'A') {
      if (argc != 6)
         show_usage_and_exit(argv[0]);
      exit(mg_edit_passwords(argv[2], argv[3], argv[4],argv[5]));
   }
#endif /* NO_AUTH */

   if (argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")))
      show_usage_and_exit(argv[0]);

#if defined(_WIN32)
   (void) sprintf(service_name, "Mongoose %s", mg_version());
   try_to_run_as_nt_service();
#endif /* _WIN32 */

#ifndef _WIN32
   (void) signal(SIGCHLD, signal_handler);
#endif /* _WIN32 */

   (void) signal(SIGTERM, signal_handler);
   (void) signal(SIGINT, signal_handler);

   if ((ctx = mg_start()) == NULL) {
      (void) printf("%s\n", "Cannot initialize Mongoose context");
      exit(EXIT_FAILURE);
   }

   process_command_line_arguments(ctx, argv);
   if (mg_get_option(ctx, "ports") == NULL &&
       mg_set_option(ctx, "ports", dflt_port /*"8080"*/) != 1)
      exit(EXIT_FAILURE);

   printf("Mongoose %s started on port(s) [%s], serving directory [%s]\n",
          mg_version(),
          mg_get_option(ctx, "ports"),
          mg_get_option(ctx, "root"));
   fflush(stdout);
   while (exit_flag == 0)
      sleep(1);

   (void) printf("Exiting on signal %d, "
                 "waiting for all threads to finish...", exit_flag);
   fflush(stdout);
   mg_stop(ctx);
   (void) printf("%s", " done.\n");

   return (EXIT_SUCCESS);
}