int main (int argc, char **argv) { GMainLoop *loop; GIOChannel *sock; /* Initialize signal handlers */ signal(SIGPIPE, SIG_IGN); signal(SIGINT, handle_sigint); /* read nocat.conf */ read_conf_file( NC_CONF_PATH "/nocat.conf" ); initialize_driver(); /* initialize the firewall */ fw_init( nocat_conf ); /* initialize the peer table */ peer_tab = g_hash_new(); /* initialize the listen socket */ sock = http_bind_socket( CONF("GatewayAddr"), CONFd("GatewayPort"), CONFd("ListenQueue") ); /* initialize the main loop and handlers */ loop = g_main_new(FALSE); g_io_add_watch( sock, G_IO_IN, (GIOFunc) handle_accept, NULL ); g_timeout_add( 30000, (GSourceFunc) check_peers, NULL ); g_timeout_add( 1000, (GSourceFunc) check_sigint, loop ); /* Go! */ g_message("starting main loop"); g_main_run( loop ); g_message("exiting main loop"); return 0; }
GHashTable *http_parse_header (http_request *h, gchar *req) { GHashTable *head = g_hash_new(); gchar **lines, **items, *key, *val, *p, prefix[50]; guint i; h->method = NULL; h->uri = NULL; h->header = head; if (req == NULL) return head; lines = g_strsplit( req, "\r\n", 0 ); if (lines == NULL || lines[0] == NULL) return head; items = g_strsplit( lines[0], " ", 3 ); h->method = g_strdup( items[0] ); h->uri = g_strdup( items[1] ); // if (CONFd("Verbosity") >= 8) g_message( "http_parse_header: method_len: %d, uri_len: %d", strlen(h->method), strlen(h->uri)); if (CONFd("Verbosity") >= 8) g_message( "http_parse_header: Method: %s", h->method ); if (CONFd("Verbosity") >= 8) g_message( "http_parse_header: URI: %s", url_decode(h->uri) ); g_strfreev( items ); for (i = 1; lines[i] != NULL && lines[i][0] != '\0'; i++ ) { key = lines[i]; val = strchr(key, ':'); if (val != NULL) { /* Separate the key from the value */ *val = '\0'; /* Normalize key -- lowercase every after 1st char */ for (p = key + 1; *p != '\0'; p++) *p = tolower(*p); /* Strip ": " plus leading and trailing space from val */ g_strchomp( val += 2 ); // ": " //if ( strcmp(key, "Referer" )== 0) { // if (CONFd("Verbosity") >= 8) g_message("http_parse_header: Referer: %s", url_decode(val) ); //} //else { if (CONFd("Verbosity") >= 8) { g_snprintf(prefix, 50, "http_parse_header: %s: ", key); syslog_message(prefix, url_decode(val), strlen(url_decode(val)) ); } g_hash_set( head, key, val ); //} } } g_strfreev( lines ); h->header = head; return head; }
int main (int argc, char **argv) { GMainLoop *loop; GIOChannel *sock; /* read nocat.conf */ read_conf_file( NC_CONF_PATH "/nocat.conf" ); if (argc < 2 || strncmp(argv[1], "-D", 2) != 0) daemonize(); /* initalize the log */ initialize_log(); /* set network parameters */ set_network_defaults( nocat_conf ); /* initialize the gateway type driver */ initialize_driver(); /* initialize the firewall */ fw_init( nocat_conf ); /* initialize the peer table */ peer_tab = g_hash_new(); /* initialize the listen socket */ sock = http_bind_socket( CONF("GatewayAddr"), CONFd("GatewayPort"), CONFd("ListenQueue") ); /* initialize the main loop and handlers */ loop = g_main_new(FALSE); g_io_add_watch( sock, G_IO_IN, (GIOFunc) handle_accept, NULL ); g_timeout_add( 30000, (GSourceFunc) check_peers, NULL ); g_timeout_add( 1000, (GSourceFunc) check_exit_signal, loop ); /* Go! */ g_message("starting main loop"); g_main_run( loop ); g_message("exiting main loop"); return 0; }
GHashTable *parse_query_string( gchar *query ) { GHashTable *data = g_hash_new(); gchar **items, *key, *val, prefix[50]; guint i; if (!query) return data; items = g_strsplit( query, "&", 0 ); for ( i = 0; items[i] != NULL; i++ ) { key = items[i]; if (key == NULL) break; val = strchr( key, '=' ); if (val != NULL) *(val++) = '\0'; else val = "1"; key = url_decode( key ); val = url_decode( val ); /* Irving - fix from Yurgi - check to see if the key is already in the hash table. This deals with keys that are set twice by web sites */ if(g_hash_table_lookup_extended( data, key, NULL, NULL ) == FALSE ) { g_hash_set( data, key, val ); if(CONFd("Verbosity") >= 8) { g_snprintf(prefix, 50, "parse_query_string: %s=", key); syslog_message(prefix, val, strlen(val)); } } else if(CONFd("Verbosity") >= 8) g_message("parse_query_string: DUPLICATE key %s=%s, discarded.", key, val); g_free( key ); g_free( val ); } g_strfreev(items); return data; }
void http_add_header ( http_request *h, const gchar *key, gchar *val ) { if ( h->response == NULL ) h->response = g_hash_new(); g_hash_set( h->response, key, val ); }