Ejemplo n.º 1
0
static nxweb_result subreq_on_request(nxweb_http_server_connection* conn, nxweb_http_request* req, nxweb_http_response* resp) {
  nxweb_set_response_content_type(resp, "text/html");

  nxweb_composite_stream* cs=nxweb_composite_stream_init(conn, req);
  nxweb_composite_stream_append_bytes(cs, "[test1]", sizeof("[test1]")-1);
  int fd=open("www/root/index.htm", O_RDONLY|O_NONBLOCK);
  nxweb_composite_stream_append_fd(cs, fd, 0, 15); // fd will be auto-closed
  nxweb_composite_stream_append_subrequest(cs, 0, "/8777/");
  nxweb_composite_stream_append_bytes(cs, "[test2]", sizeof("[test2]")-1);
  nxweb_composite_stream_close(cs);

  nxweb_composite_stream_start(cs, resp);

  return NXWEB_OK;
}
Ejemplo n.º 2
0
static int parse_directive(ssi_buffer* ssib, char* str, int len) {
  assert(!str[len]); // zero-terminated
  char* p=str;
  char* pe=str+len;
  char* attr_name[SSI_MAX_ATTRS];
  char* attr_value[SSI_MAX_ATTRS];
  int num_attr=0;
  while ((unsigned char)*p<=SPACE && p<pe) p++;
  if (p>=pe) return -1;
  char* cmd=p;
  while ((unsigned char)*p>SPACE) p++;
  *p++='\0';
  while (num_attr<SSI_MAX_ATTRS) {
    attr_name[num_attr]=p;
    p=strchr(p, '=');
    if (!p) break;
    *p++='\0';
    attr_name[num_attr]=nxweb_trunc_space(attr_name[num_attr]);
    while ((unsigned char)*p<=SPACE && p<pe) p++;
    if (p>=pe) return -1;
    char q=*p++;
    if (q!='\"' && q!='\'') return -1;
    attr_value[num_attr]=p;
    p=strchr(p, q);
    if (!p) return -1;
    *p++='\0';
    num_attr++;
  }

  if (!strcmp(cmd, "include")) {
    int i;
    for (i=0; i<num_attr; i++) {
      if (!strcmp(attr_name[i], "virtual")) {
        const char* expanded=expand_vars(ssib, attr_value[i]);
        if (!expanded) {
          nxweb_log_warning("ssi variables expansion failure: %s @ %s", attr_value[i], ssib->req->uri);
          return -1;
        }
        // nxweb_log_error("ssi variables expanded: %s -> %s", attr_value[i], expanded);
        nxweb_composite_stream_append_subrequest(ssib->cs, ssib->cs->req->host, expanded);
        return 0;
      }
    }
  }
  else if (!strcmp(cmd, "set")) {
    int i;
    const char* var_name=0;
    const char* var_value=0;
    nx_simple_map_entry* param;
    for (i=0; i<num_attr; i++) {
      if (!strcmp(attr_name[i], "var")) {
        var_name=attr_value[i];
      }
      else if (!strcmp(attr_name[i], "value")) {
        var_value=expand_vars(ssib, attr_value[i]);
        if (!var_value) {
          nxweb_log_warning("ssi set variable expansion failure: %s @ %s", attr_value[i], ssib->req->uri);
          return -1;
        }
        // nxweb_log_error("ssi variables expanded: %s -> %s", attr_value[i], var_value);
      }
    }
    if (var_name && var_value) {
      param=nx_simple_map_find(ssib->var_map, var_name);
      if (!param) {
        param=nxb_calloc_obj(ssib->nxb, sizeof(nx_simple_map_entry));
        ssib->var_map=nx_simple_map_add(ssib->var_map, param);
        param->name=var_name;
      }
      param->value=var_value;
      return 0;
    }
  }
  else if (!strcmp(cmd, "echo")) {
    int i;
    for (i=0; i<num_attr; i++) {
      if (!strcmp(attr_name[i], "var")) {
        const char* var_name=attr_value[i];
        char expanded[SSI_MAX_EXPR_LEN];
        char* end=expand_var(ssib, var_name, strlen(var_name), expanded, SSI_MAX_EXPR_LEN);
        if (!end) {
          // nxweb_log_warning("ssi echo variable expansion failure: %s @ %s", var_name, ssib->req->uri);
          return -1;
        }
        int len=end-expanded;
        char* buf=nxb_copy_obj(ssib->nxb, expanded, len);
        nxweb_composite_stream_append_bytes(ssib->cs, buf, len);
        return 0;
      }
    }
  }
  return -1;
}