📄 mod_caucho.c
字号:
new_uri); } *new_uri = 0; /* Strip session encoding from static files. */ if (r->filename) { char *url_rewrite = strstr(r->filename, config->session_url_prefix); if (url_rewrite) { *url_rewrite = 0; if (stat(r->filename, &r->finfo) < 0) { r->finfo.st_mode = 0; } } } } } return DECLINED;}/** * Look at the request to see if Caucho should handle it. */static intcse_dispatch(request_rec *r){ config_t *config = cse_get_module_config(r); const char *host = ap_get_server_name(r); const char *uri = r->uri; unsigned int now = r->request_time; LOG(("CONF: %p\n", config)); if (config == NULL) return DECLINED; /* cse_update_config(config, r->request_time); */ if (config->enable_caucho_status && strstr(uri, "/caucho-status")) { r->handler = "caucho-status"; return OK; } /* Check for exact virtual host match */ if (cse_match_request(config, host, ap_get_server_port(r), uri, 0, now) || r->handler && ! strcmp(r->handler, "caucho-request")) { r->handler = "caucho-request"; LOG(("[%d] match %s:%s\n", getpid(), host ? host : "null", uri)); return OK; } LOG(("[%d] mismatch %s:%s\n", getpid(), host ? host : "null", uri)); return DECLINED;}/** * Gets the session index from the request * * Cookies have priority over the query * * @return -1 if no session */static intget_session_index(config_t *config, request_rec *r, int *backup){ array_header *hdrs_arr = ap_table_elts(r->headers_in); table_entry *hdrs = (table_entry *) hdrs_arr->elts; int i; int session; char *uri; for (i = 0; i < hdrs_arr->nelts; ++i) { if (! hdrs[i].key || ! hdrs[i].val) continue; if (strcasecmp(hdrs[i].key, "Cookie")) continue; session = cse_session_from_string(hdrs[i].val, config->session_cookie, backup); if (session >= 0) return session; } if (r->request_config) uri = ap_get_module_config(r->request_config, &caucho_module); if (uri) { if (*config->alt_session_url_prefix) return cse_session_from_string(uri, config->alt_session_url_prefix, backup); else return cse_session_from_string(uri + strlen(config->session_url_prefix), "", backup); } if (*config->alt_session_url_prefix) { return cse_session_from_string(r->uri, config->alt_session_url_prefix, backup); } else return cse_session_from_string(r->uri, config->session_url_prefix, backup);}/** * Writes request parameters to srun. */static voidwrite_env(stream_t *s, request_rec *r, char *session_id){ char buf[4096]; int ch; int i; conn_rec *c = r->connection; const char *host; int port; int is_sub_request = 1; char *uri; /* * is_sub_request is always true, since we can't detect mod_rewrite * and mod_rewrite doesn't change the unparsed_uri. */ if (is_sub_request) uri = r->uri; /* for mod_rewrite */ else uri = r->unparsed_uri; /* #937 */ for (i = 0; (ch = uri[i]) && ch != '?' && i + 1 < sizeof(buf); i++) buf[i] = ch; if (session_id) { buf[i++] = *s->config->session_url_prefix; for (session_id++; *session_id && i + 1 < sizeof(buf); i++) buf[i] = *session_id++; } buf[i] = 0; cse_write_string(s, HMUX_URL, buf); cse_write_string(s, HMUX_METHOD, r->method); if (*s->config->alt_session_url_prefix && r->request_config) { char *suburi = ap_get_module_config(r->request_config, &caucho_module); if (suburi) uri = suburi; } cse_write_string(s, CSE_PROTOCOL, r->protocol); if (r->args) cse_write_string(s, CSE_QUERY_STRING, r->args); /* Gets the server name */ host = ap_get_server_name(r); port = ap_get_server_port(r); cse_write_string(s, HMUX_SERVER_NAME, host); cse_write_string(s, CSE_SERVER_PORT, ap_psprintf(r->pool, "%u", port)); host = ap_get_remote_host(c, r->per_dir_config, REMOTE_HOST); if (host) cse_write_string(s, CSE_REMOTE_HOST, host); else cse_write_string(s, CSE_REMOTE_HOST, c->remote_ip); cse_write_string(s, CSE_REMOTE_ADDR, c->remote_ip); cse_write_string(s, CSE_REMOTE_PORT, ap_psprintf(r->pool, "%d", ntohs(c->remote_addr.sin_port))); if (c->user) cse_write_string(s, CSE_REMOTE_USER, c->user); if (c->ap_auth_type) cse_write_string(s, CSE_AUTH_TYPE, c->ap_auth_type);}static voidwrite_ssl_env(stream_t *s, request_rec *r){ /* mod_ssl */#ifdef EAPI { static char *vars[] = { "SSL_CLIENT_S_DN", "SSL_CIPHER", "SSL_CIPHER_EXPORT", "SSL_PROTOCOL", "SSL_CIPHER_USEKEYSIZE", "SSL_CIPHER_ALGKEYSIZE", 0}; char *var; int i; int v; if ((v = ap_hook_call("ap::mod_ssl::var_lookup", &var, r->pool, r->server, r->connection, r, "SSL_CLIENT_CERT"))) { cse_write_string(s, CSE_CLIENT_CERT, var); } else if ((v = ap_hook_call("ap::mod_ssl::var_lookup", &var, r->pool, r->server, r->connection, r, "SSL_CLIENT_CERTIFICATE"))) { cse_write_string(s, CSE_CLIENT_CERT, var); } for (i = 0; vars[i]; i++) { if ((v = ap_hook_call("ap::mod_ssl::var_lookup", &var, r->pool, r->server, r->connection, r, vars[i]))) { cse_write_string(s, HMUX_HEADER, vars[i]); cse_write_string(s, HMUX_STRING, var); } } }#endif }/** * Writes headers to srun. */static voidwrite_headers(stream_t *s, request_rec *r){ array_header *hdrs_arr = ap_table_elts(r->headers_in); table_entry *hdrs = (table_entry *) hdrs_arr->elts; int i; for (i = 0; i < hdrs_arr->nelts; ++i) { char *key = hdrs[i].key; char *value = hdrs[i].val; if (! key) continue; /* * Content-type and Content-Length are special cased for a little * added efficiency. */ if (! strcasecmp(key, "Content-type")) cse_write_string(s, CSE_CONTENT_TYPE, value); else if (! strcasecmp(key, "Content-length")) cse_write_string(s, CSE_CONTENT_LENGTH, value); else { cse_write_string(s, HMUX_HEADER, key); cse_write_string(s, HMUX_STRING, value); } }}static voidwrite_added_headers(stream_t *s, request_rec *r){ array_header *hdrs_arr = ap_table_elts(r->subprocess_env); table_entry *hdrs = (table_entry *) hdrs_arr->elts; int i; int has_ssl = 0; for (i = 0; i < hdrs_arr->nelts; ++i) { char *key = hdrs[i].key; char *value = hdrs[i].val; if (! key) continue; /* skip leading whitespace */ for (; isspace(*value); value++) { } if (! strcmp(key, "HTTPS") && ! strcasecmp(value, "on")) { has_ssl = 1; cse_write_string(s, CSE_IS_SECURE, ""); } else if (*key == 'S' && ! r->connection->user && ! strcmp(key, "SSL_CLIENT_DN")) cse_write_string(s, CSE_REMOTE_USER, value); cse_write_string(s, HMUX_HEADER, key); cse_write_string(s, HMUX_STRING, value); } if (has_ssl) write_ssl_env(s, r); if (r->prev) { if (r->prev->args) { cse_write_string(s, HMUX_HEADER, "REDIRECT_QUERY_STRING"); cse_write_string(s, HMUX_STRING, r->prev->args); } if (r->prev->uri) { cse_write_string(s, HMUX_HEADER, "REDIRECT_URL"); cse_write_string(s, HMUX_STRING, r->prev->uri); } }}/** * Writes a response from srun to the client */static intcse_write_response(stream_t *s, int len, request_rec *r){ while (len > 0) { int writelen; int sentlen; if (s->read_length <= s->read_offset && cse_fill_buffer(s) < 0) return -1; writelen = s->read_length - s->read_offset; if (len < writelen) writelen = len; while (writelen > 0) { sentlen = ap_rwrite(s->read_buf + s->read_offset, writelen, r); if (sentlen < 0) { cse_close(s, "write"); return -1; } writelen -= sentlen; s->read_offset += sentlen; len -= sentlen; } } return 1;}/** * Copy data from the JVM to the browser. */static intsend_data(stream_t *s, request_rec *r, int ack, int *keepalive){ int code = HMUX_QUIT; char buf[8193]; char key[8193]; char value[8193]; int channel; int i; /* ap_reset_timeout(r); */ if (cse_fill_buffer(s) < 0) return -1; /* code = cse_read_byte(s); if (code != HMUX_CHANNEL) { r->status = 500; r->status_line = "Protocol error"; cse_close(s, "bad protocol"); return -1; } channel = hmux_read_len(s); */ do { int len; /* ap_reset_timeout(r); */ code = cse_read_byte(s); if (s->socket < 0) return -1; switch (code) { case HMUX_CHANNEL: channel = hmux_read_len(s); LOG(("channel %d\n", channel)); break; case HMUX_ACK: channel = hmux_read_len(s); LOG(("ack %d\n", channel)); break; case HMUX_STATUS: len = hmux_read_len(s); cse_read_limit(s, buf, sizeof(buf), len); for (i = 0; buf[i] && buf[i] != ' '; i++) { } buf[i] = 0; r->status = atoi(buf); buf[i] = ' '; i++; r->status_line = ap_pstrdup(r->pool, buf); break; case HMUX_HEADER: len = hmux_read_len(s); cse_read_limit(s, key, sizeof(key), len); cse_read_string(s, value, sizeof(value)); if (! strcasecmp(key, "content-type")) r->content_type = ap_pstrdup(r->pool, value); else ap_table_add(r->headers_out, key, value); break; case HMUX_META_HEADER: len = hmux_read_len(s); cse_read_limit(s, key, sizeof(key), len); cse_read_string(s, value, sizeof(value)); break; case HMUX_DATA: len = hmux_read_len(s); if (cse_write_response(s, len, r) < 0) return -1; break; case HMUX_FLUSH: len = hmux_read_len(s); ap_rflush(r); break; case CSE_KEEPALIVE: len = hmux_read_len(s); *keepalive = 1; break; case CSE_SEND_HEADER: len = hmux_read_len(s); ap_send_http_header(r); break; case -1: break; case HMUX_QUIT:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -