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; }
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; }