summaryrefslogtreecommitdiff
path: root/test/serf_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/serf_server.c')
-rw-r--r--test/serf_server.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/test/serf_server.c b/test/serf_server.c
new file mode 100644
index 0000000..4d8a0c6
--- /dev/null
+++ b/test/serf_server.c
@@ -0,0 +1,147 @@
+/* Copyright 2002-2004 Justin Erenkrantz and Greg Stein
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+
+#include <apr.h>
+#include <apr_uri.h>
+#include <apr_strings.h>
+#include <apr_atomic.h>
+#include <apr_base64.h>
+#include <apr_getopt.h>
+#include <apr_version.h>
+
+#include "serf.h"
+
+typedef struct {
+ int foo;
+} app_baton_t;
+
+
+static apr_status_t incoming_request(serf_context_t *ctx,
+ serf_incoming_request_t *req,
+ void *request_baton,
+ apr_pool_t *pool)
+{
+ printf("INCOMING REQUEST\n");
+ return APR_SUCCESS;
+}
+
+
+static apr_status_t accept_fn(serf_context_t *ctx,
+ serf_listener_t *l,
+ void *baton,
+ apr_socket_t *insock,
+ apr_pool_t *pool)
+{
+ serf_incoming_t *client = NULL;
+ printf("new connection from \n");
+ return serf_incoming_create(&client, ctx, insock, baton, incoming_request, pool);
+}
+
+static void print_usage(apr_pool_t *pool)
+{
+ puts("serf_server [options] listen_address:listen_port");
+ puts("-h\tDisplay this help");
+ puts("-v\tDisplay version");
+}
+
+int main(int argc, const char **argv)
+{
+ apr_status_t rv;
+ apr_pool_t *pool;
+ serf_context_t *context;
+ serf_listener_t *listener;
+ app_baton_t app_ctx;
+ const char *listen_spec;
+ char *addr = NULL;
+ char *scope_id = NULL;
+ apr_port_t port;
+ apr_getopt_t *opt;
+ char opt_c;
+ const char *opt_arg;
+
+ apr_initialize();
+ atexit(apr_terminate);
+
+ apr_pool_create(&pool, NULL);
+
+ apr_getopt_init(&opt, pool, argc, argv);
+
+ while ((rv = apr_getopt(opt, "hv", &opt_c, &opt_arg)) ==
+ APR_SUCCESS) {
+ switch (opt_c) {
+ case 'h':
+ print_usage(pool);
+ exit(0);
+ break;
+ case 'v':
+ puts("Serf version: " SERF_VERSION_STRING);
+ exit(0);
+ default:
+ break;
+ }
+ }
+
+ if (opt->ind != opt->argc - 1) {
+ print_usage(pool);
+ exit(-1);
+ }
+
+ listen_spec = argv[opt->ind];
+
+
+ rv = apr_parse_addr_port(&addr, &scope_id, &port, listen_spec, pool);
+ if (rv) {
+ printf("Error parsing listen address: %d\n", rv);
+ exit(1);
+ }
+
+ if (!addr) {
+ addr = "0.0.0.0";
+ }
+
+ if (port == 0) {
+ port = 8080;
+ }
+
+ context = serf_context_create(pool);
+
+ /* TODO.... stuff */
+ app_ctx.foo = 1;
+ rv = serf_listener_create(&listener, context, addr, port,
+ &app_ctx, accept_fn, pool);
+ if (rv) {
+ printf("Error parsing listener: %d\n", rv);
+ exit(1);
+ }
+
+ while (1) {
+ rv = serf_context_run(context, SERF_DURATION_FOREVER, pool);
+ if (APR_STATUS_IS_TIMEUP(rv))
+ continue;
+ if (rv) {
+ char buf[200];
+
+ printf("Error running context: (%d) %s\n", rv,
+ apr_strerror(rv, buf, sizeof(buf)));
+ apr_pool_destroy(pool);
+ exit(1);
+ }
+ }
+
+ apr_pool_destroy(pool);
+ return 0;
+}