From 281222987d800e76049d4667a7bdd6b4a8f20660 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Fri, 15 Aug 2014 21:52:14 +0530 Subject: server: Add the ability to treat conflicting connections as restarts Also make stream timeouts configurable --- src/main.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index e3b4ad0..a97ec4d 100644 --- a/src/main.c +++ b/src/main.c @@ -48,13 +48,16 @@ static int port = 8000; static int client_timeout = 10; static int server_timeout = 5; static char *token_server_addrmask = NULL; +static gboolean conflict_is_restart = FALSE; static GInetAddressMask *stp_inet_addrmask = NULL; static GOptionEntry entries[] = { { "port", 'p', 0, G_OPTION_ARG_INT, &port, "Port to listen on (default: 8000)", "PORT" }, - { "timeout", 't', 0, G_OPTION_ARG_INT, &client_timeout, "Client connection timeout (default: 10s)", "SECONDS" }, + { "client-timeout", 0, 0, G_OPTION_ARG_INT, &client_timeout, "Outgoing client connection timeout (default: 10s)", "SECONDS" }, + { "stream-timeout", 0, 0, G_OPTION_ARG_INT, &server_timeout, "Incoming stream connection timeout (default: 5s)", "SECONDS" }, { "token-server", 's', 0, G_OPTION_ARG_STRING, &token_server_addrmask, "Subnet (or IP addr) for the token server (default: disabled)", "ADDR/PREFIX" }, + { "conflict-is-restart", 0, 0, G_OPTION_ARG_NONE, &conflict_is_restart, "If a new PUT stream is received at the same path as an existing one, treat it as a restart instead of reporting a 409/CONFLICT (default: no)", NULL }, { NULL } }; @@ -700,7 +703,14 @@ PUT: { * and just pass the data to the pipeline. */ if (connection_exists && !content_range) { /* A connection already exists, and this one isn't a continuation - * of the previous one, so it's a conflict */ + * of the previous one, so it's a conflict... unless the + * '--conflict-is-restart' option has been specified. */ + if (conflict_is_restart) { + ctx = get_server_ctx_from_msg (msg, tables->ctxs); + stream_finished_cb (ctx->msg, ctx); + invoke_g_hash_table_remove (ctx); + goto new_conn; + } g_critical ("Recv Content-Length PUT on '%s' without Content-Range", path); soup_message_set_status (msg, SOUP_STATUS_CONFLICT); goto PUT_out; @@ -744,6 +754,7 @@ PUT: { goto PUT_out; } +new_conn: /* This is a new connection; treat it as such */ ctx = g_new0 (STPServerCtx, 1); ctx->stream_type = token->stream_type; -- cgit v0.11.2-2-gd1dd