Changeset ce0c8f24f23924ae8bccfbb84992fa8d8d534245

Show
Ignore:
Timestamp:
01/14/10 18:33:01 (9 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1263493981 +0000
git-parent:

[c35ae3a734c66c3de2052ccd0b30da5672a446d1]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1263493981 +0000
Message:

simple static handler, closes #235

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/noit_http.c

    rd9050a4 rce0c8f2  
    666666      return mask | maybe_write_mask; 
    667667    } 
     668    noitL(noit_debug, "HTTP start request (%s)\n", ctx->req.uri_str); 
    668669  } 
    669670 
     
    10301031noit_boolean 
    10311032noit_http_response_end(noit_http_session_ctx *ctx) { 
     1033  if(ctx->res.output) 
     1034    noitL(noit_debug, "HTTP finished request (%s)\n", ctx->req.uri_str); 
    10321035  if(!noit_http_response_flush(ctx, noit_true)) return noit_false; 
    10331036  return noit_true; 
  • src/noit_http.h

    rd9050a4 rce0c8f2  
    166166#define noit_http_response_not_found(ctx, type) \ 
    167167  noit_http_response_standard(ctx, 404, "NOT FOUND", type) 
     168#define noit_http_response_denied(ctx, type) \ 
     169  noit_http_response_standard(ctx, 403, "DENIED", type) 
    168170 
    169171#define noit_http_response_standard(ctx, code, name, type) do { \ 
  • src/noit_rest.c

    rfc257c3 rce0c8f2  
    3737 
    3838#include <pcre.h> 
     39#include <unistd.h> 
     40#include <fcntl.h> 
     41#include <sys/mman.h> 
    3942#include <errno.h> 
    4043 
     
    345348  return rxc->indoc; 
    346349} 
     350int 
     351noit_rest_simple_file_handler(noit_http_rest_closure_t *restc, 
     352                              int npats, char **pats) { 
     353  int drlen = 0; 
     354  const char *document_root = NULL; 
     355  const char *index_file = NULL; 
     356  noit_http_session_ctx *ctx = restc->http_ctx; 
     357  char file[PATH_MAX], rfile[PATH_MAX]; 
     358  struct stat st; 
     359  int fd; 
     360  void *contents; 
     361 
     362  if(npats != 1 || 
     363     !noit_hash_retr_str(restc->ac->config, 
     364                         "document_root", strlen("document_root"), 
     365                         &document_root)) { 
     366    goto not_found; 
     367  } 
     368  if(!noit_hash_retr_str(restc->ac->config, 
     369                         "index_file", strlen("index_file"), 
     370                         &index_file)) { 
     371    index_file = "index.html"; 
     372  } 
     373  drlen = strlen(document_root); 
     374  snprintf(file, sizeof(file), "%s/%s", document_root, pats[0]); 
     375  if(file[strlen(file) - 1] == '/') { 
     376    snprintf(file + strlen(file), sizeof(file) - strlen(file), 
     377             "%s", index_file); 
     378  } 
     379  /* resolve */ 
     380  if(realpath(file, rfile) == NULL) goto not_found; 
     381  /* restrict */ 
     382  if(strncmp(rfile, document_root, drlen)) goto denied; 
     383  if(rfile[drlen] != '/' && rfile[drlen + 1] != '/') goto denied; 
     384  /* stat */ 
     385  if(stat(rfile, &st) != 0) { 
     386    switch (errno) { 
     387      case EACCES: goto denied; 
     388      default: goto not_found; 
     389    } 
     390  } 
     391  /* open */ 
     392  fd = open(rfile, O_RDONLY); 
     393  if(fd < 0) goto not_found; 
     394  contents = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); 
     395  close(fd); 
     396  if(contents == (void *)-1) goto not_found; 
     397  noit_http_response_ok(ctx, "text/html"); 
     398  noit_http_response_append(ctx, contents, st.st_size); 
     399  munmap(contents, st.st_size); 
     400  noit_http_response_end(ctx); 
     401  return 0; 
     402 
     403 denied: 
     404  noit_http_response_denied(ctx, "text/html"); 
     405  noit_http_response_end(ctx); 
     406  return 0; 
     407 not_found: 
     408  noit_http_response_not_found(ctx, "text/html"); 
     409  noit_http_response_end(ctx); 
     410  return 0; 
     411} 
     412 
    347413void noit_http_rest_init() { 
    348414  eventer_name_callback("noit_wire_rest_api/1.0", noit_http_rest_handler); 
  • src/noit_rest.h

    rfc257c3 rce0c8f2  
    8484  noit_http_rest_closure_free(noit_http_rest_closure_t *restc); 
    8585 
     86API_EXPORT(int) 
     87  noit_rest_simple_file_handler(noit_http_rest_closure_t *restc, 
     88                                int npats, char **pats); 
     89 
    8690#endif 
  • src/stratcon_realtime_http.c

    r12ef579 rce0c8f2  
    515515    rest_stream_data 
    516516  ) == 0); 
    517 
     517  assert(noit_http_rest_register( 
     518    "GET", "/", "^(.*)$", noit_rest_simple_file_handler 
     519  ) == 0); 
     520