Changeset 20500 for trunk


Ignore:
Timestamp:
2010-03-27T01:00:33+01:00 (6 years ago)
Author:
jow
Message:

[package] uhttpd:

  • make script timeout configurable
  • catch SIGCHLD to properly interrupt select()
  • flag listen and client sockets as close-on-exec
Location:
trunk/package/uhttpd
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/uhttpd/Makefile

    r20428 r20500  
    99 
    1010PKG_NAME:=uhttpd 
    11 PKG_RELEASE:=1 
     11PKG_RELEASE:=2 
    1212 
    1313PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) 
  • trunk/package/uhttpd/files/uhttpd.config

    r20428 r20500  
    11# Server configuration 
    22config uhttpd main 
     3 
     4        # HTTP listen addresses, multiple allowed 
     5        list listen_http        0.0.0.0:80 
     6#       list listen_http        [::]:80 
     7 
     8        # HTTPS listen addresses, multiple allowed 
     9        list listen_https       0.0.0.0:443 
     10#       list listen_https       [::]:443 
    311 
    412        # Server document root 
     
    2028#       option lua_handler      /usr/lib/lua/luci/sgi/uhttpd.lua 
    2129 
    22         # HTTP listen addresses, multiple allowed 
    23         list listen_http        0.0.0.0:80 
    24 #       list listen_http        [::]:80 
    25  
    26         # HTTPS listen addresses, multiple allowed 
    27         list listen_https       0.0.0.0:443 
    28 #       list listen_https       [::]:443 
     30        # CGI/Lua timeout, if the called script does not 
     31        # write data within the given amount of seconds, 
     32        # the server will temrinate the request with 
     33        # 504 Gateway Timeout response. 
     34        option script_timeout   60 
    2935 
    3036        # Basic auth realm, defaults to local hostname 
  • trunk/package/uhttpd/files/uhttpd.init

    r20428 r20500  
    6666        append_arg "$cfg" lua_prefix "-l" 
    6767        append_arg "$cfg" lua_handler "-L" 
     68        append_arg "$cfg" script_timeout "-t" 
    6869 
    6970        config_list_foreach "$cfg" listen_http \ 
  • trunk/package/uhttpd/src/uhttpd-cgi.c

    r20428 r20500  
    373373                                FD_SET(wfd[1], &writer); 
    374374 
    375                                 timeout.tv_sec = 15; 
     375                                timeout.tv_sec = cl->server->conf->script_timeout; 
    376376                                timeout.tv_usec = 0; 
    377377 
     
    539539                                } 
    540540 
    541                                 /* no activity for 15 seconds... looks dead */ 
     541                                /* timeout exceeded or interrupted by SIGCHLD */ 
    542542                                else 
    543543                                { 
    544                                         ensure(uh_http_sendhf(cl, 504, "Gateway Timeout", 
    545                                                 "The CGI script took too long to produce a response")); 
     544                                        if( (errno != EINTR) && ! header_sent ) 
     545                                        { 
     546                                                ensure(uh_http_sendhf(cl, 504, "Gateway Timeout", 
     547                                                        "The CGI script took too long to produce " 
     548                                                        "a response")); 
     549                                        } 
     550 
     551                                        /* send final chunk if we're in chunked transfer mode */ 
     552                                        ensure(uh_http_send(cl, req, "", 0)); 
    546553 
    547554                                        break; 
  • trunk/package/uhttpd/src/uhttpd-lua.c

    r20428 r20500  
    449449                                FD_SET(wfd[1], &writer); 
    450450 
    451                                 timeout.tv_sec = 15; 
     451                                timeout.tv_sec = cl->server->conf->script_timeout; 
    452452                                timeout.tv_usec = 0; 
    453453 
     
    513513                                } 
    514514 
    515                                 /* no activity for 15 seconds... looks dead */ 
     515                                /* timeout exceeded or interrupted by SIGCHLD */ 
    516516                                else 
    517517                                { 
    518                                         ensure(uh_http_sendhf(cl, 504, "Gateway Timeout", 
    519                                                 "The Lua handler took too long to produce a response")); 
     518                                        if( (errno != EINTR) && ! data_sent ) 
     519                                        { 
     520                                                ensure(uh_http_sendhf(cl, 504, "Gateway Timeout", 
     521                                                        "The Lua script took too long to produce " 
     522                                                        "a response")); 
     523                                        } 
    520524 
    521525                                        break; 
  • trunk/package/uhttpd/src/uhttpd-utils.h

    r20428 r20500  
    3333#define foreach_header(i, h) \ 
    3434        for( i = 0; (i + 1) < (sizeof(h) / sizeof(h[0])) && h[i]; i += 2 ) 
     35 
     36#define fd_cloexec(fd) \ 
     37        fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC) 
    3538 
    3639struct path_info { 
  • trunk/package/uhttpd/src/uhttpd.c

    r20428 r20500  
    4343} 
    4444 
     45static void uh_sigchld(int sig) 
     46{ 
     47        while( waitpid(-1, NULL, WNOHANG) > 0 ) { } 
     48} 
     49 
    4550static void uh_config_parse(const char *path) 
    4651{ 
     
    156161                /* add socket to server fd set */ 
    157162                FD_SET(sock, serv_fds); 
     163                fd_cloexec(sock); 
    158164                *max_fd = max(*max_fd, sock); 
    159165 
     
    433439        sa.sa_handler = SIG_IGN; 
    434440        sigaction(SIGPIPE, &sa, NULL); 
     441 
     442        sa.sa_handler = uh_sigchld; 
    435443        sigaction(SIGCHLD, &sa, NULL); 
    436444 
     
    486494#endif 
    487495 
    488         while( (opt = getopt(argc, argv, "fC:K:p:s:h:c:l:L:d:r:m:x:")) > 0 ) 
     496        while( (opt = getopt(argc, argv, "fC:K:p:s:h:c:l:L:d:r:m:x:t:")) > 0 ) 
    489497        { 
    490498                switch(opt) 
     
    591599                        case 'L': 
    592600                                conf.lua_handler = optarg; 
     601                                break; 
     602#endif 
     603 
     604#if defined(HAVE_CGI) || defined(HAVE_LUA) 
     605                        /* script timeout */ 
     606                        case 't': 
     607                                conf.script_timeout = atoi(optarg); 
    593608                                break; 
    594609#endif 
     
    646661                                        "       -x string       URL prefix for CGI handler, default is '/cgi-bin'\n" 
    647662#endif 
     663#if defined(HAVE_CGI) || defined(HAVE_LUA) 
     664                                        "       -t seconds      CGI and Lua script timeout in seconds, default is 60\n" 
     665#endif 
    648666                                        "       -d string       URL decode given string\n" 
    649667                                        "       -r string       Specify basic auth realm\n" 
     
    684702        /* config file */ 
    685703        uh_config_parse(conf.file); 
     704 
     705#if defined(HAVE_CGI) || defined(HAVE_LUA) 
     706        /* default script timeout */ 
     707        if( conf.script_timeout <= 0 ) 
     708                conf.script_timeout = 60; 
     709#endif 
    686710 
    687711#ifdef HAVE_CGI 
     
    795819                                                        /* add client socket to global fdset */ 
    796820                                                        FD_SET(new_fd, &used_fds); 
     821                                                        fd_cloexec(new_fd); 
    797822                                                        max_fd = max(max_fd, new_fd); 
    798823                                                } 
  • trunk/package/uhttpd/src/uhttpd.h

    r20428 r20500  
    2727#include <sys/socket.h> 
    2828#include <sys/select.h> 
     29#include <sys/wait.h> 
    2930#include <netinet/in.h> 
    3031#include <arpa/inet.h> 
     
    7374        void (*lua_close) (lua_State *L); 
    7475        void (*lua_request) (struct client *cl, struct http_request *req, lua_State *L); 
     76#endif 
     77#if defined(HAVE_CGI) || defined(HAVE_LUA) 
     78        int script_timeout; 
    7579#endif 
    7680#ifdef HAVE_TLS 
Note: See TracChangeset for help on using the changeset viewer.