📄 mod_caucho.c
字号:
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; if (config == NULL) return DECLINED; cse_update_config(config, r->request_time); if (! config->disable_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)) { 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; 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 (config->alt_session_prefix) { if (! r->request_config) return 0; else { char *uri = ap_get_module_config(r->request_config, &caucho_module); if (uri) return cse_session_from_string(uri, config->alt_session_prefix, backup); else return -1; } } else return cse_session_from_string(r->uri, config->session_url_prefix, backup);}static intconnection_error(config_t *config, srun_t *srun, request_rec *r){ char *error_page = config->error_page; if (! error_page && g_error_page) error_page = g_error_page; if (error_page && cse_match_request(config, "", 0, error_page, 0)) error_page = 0; if (error_page && ! strcmp(r->method, "GET")) { /* need to use ap_internal_redirect to get the headers */ r->status = 503; ap_internal_redirect(error_page, r); return OK; } r->content_type = "text/html"; if (error_page) { r->status = 302; ap_table_set(r->headers_out, "Location", ap_pstrdup(r->pool, error_page)); } else r->status = 503; ap_send_http_header(r); ap_rputs("<html><body bgcolor='white'>", r); ap_rprintf(r, "<h1>Can't contact servlet runner at %s:%d</h1>", (srun && srun->hostname) ? srun->hostname : "localhost", srun ? srun->port : 0); ap_rputs("</body></html>", r); ap_rputs("\n\n\n\n", r); ap_rputs("<!--\n", r); ap_rputs(" - Unfortunately, Microsoft has added a clever new\n", r); ap_rputs(" - \"feature\" to Internet Explorer. If the text in\n", r); ap_rputs(" - an error's message is \"too small\", specifically\n", r); ap_rputs(" - less than 512 bytes, Internet Explorer returns\n", r); ap_rputs(" - its own error message. Yes, you can turn that\n", r); ap_rputs(" - off, but *surprise* it's pretty tricky to find\n", r); ap_rputs(" - buried as a switch called \"smart error\n", r); ap_rputs(" - messages\" That means, of course, that many of\n", r); ap_rputs(" - Resin's error messages are censored by default.\n", r); ap_rputs(" - And, of course, you'll be shocked to learn that\n", r); ap_rputs(" - IIS always returns error messages that are long\n", r); ap_rputs(" - enough to make Internet Explorer happy. The\n", r); ap_rputs(" - workaround is pretty simple: pad the error\n", r); ap_rputs(" - message with a big comment to push it over the\n", r); ap_rputs(" - five hundred and twelve byte minimum. Of course,\n", r); ap_rputs(" - that's exactly what you're reading right now.\n", r); ap_rputs(" -->\n", r); /* ap_kill_timeout(r); */ return OK;}/** * 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; char *uri = r->uri; cse_write_string(s, CSE_PROTOCOL, r->protocol); cse_write_string(s, CSE_METHOD, r->method); if (s->config->alt_session_prefix && r->request_config) { char *suburi = ap_get_module_config(r->request_config, &caucho_module); if (suburi) uri = suburi; } 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, CSE_URI, buf); 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, CSE_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); cse_write_string(s, CSE_SESSION_GROUP, ap_psprintf(r->pool, "%d", s->srun->session));}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, CSE_HEADER, vars[i]); cse_write_string(s, CSE_VALUE, 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, CSE_HEADER, key); cse_write_string(s, CSE_VALUE, 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, CSE_HEADER, key); cse_write_string(s, CSE_VALUE, value); } if (has_ssl) write_ssl_env(s, r); if (r->prev) { if (r->prev->args) { cse_write_string(s, CSE_HEADER, "REDIRECT_QUERY_STRING"); cse_write_string(s, CSE_VALUE, r->prev->args); } if (r->prev->uri) { cse_write_string(s, CSE_HEADER, "REDIRECT_URL"); cse_write_string(s, CSE_VALUE, 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_offset >= s->read_length && 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 = CSE_END; char buf[8193]; char key[8193]; char value[8193]; int i; /* ap_reset_timeout(r); */ if (cse_fill_buffer(s) < 0) return -1; do { int l1, l2, l3; int len; /* ap_reset_timeout(r); */ code = cse_read_byte(s); l1 = cse_read_byte(s) & 0xff; l2 = cse_read_byte(s) & 0xff; l3 = cse_read_byte(s); len = (l1 << 16) + (l2 << 8) + (l3 & 0xff); if (s->socket < 0) return -1; switch (code) { case CSE_STATUS: cse_read_limit(s, buf, sizeof(buf), len); for (i = 0; buf[i] && buf[i] != ' '; i++) { } i++; r->status = atoi(buf + i); r->status_line = ap_pstrdup(r->pool, buf + i); break; case CSE_HEADER: 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 if (! strcasecmp(key, "set-cookie") || ! strcasecmp(key, "set-cookie2")) ap_table_add(r->headers_out, key, value); else ap_table_set(r->headers_out, key, value); break; case CSE_DATA: if (cse_write_response(s, len, r) < 0) return -1; break; case CSE_FLUSH: ap_rflush(r); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -