📄 mod_caucho.c
字号:
return 0;}/** * Set the default session cookie used by mod_caucho. */static const char *resin_session_sticky_command(cmd_parms *cmd, void *pconfig, const char *cookie_arg){ config_t *config = pconfig; /* = cse_get_server_config(cmd->server); */ if (! config) return 0; config->has_config = 1; if (! strcmp(cookie_arg, "false")) { config->disable_sticky_sessions = 1; } return 0;}/** * Set the default session url used by mod_caucho. */static const char *resin_session_url_prefix_command(cmd_parms *cmd, void *pconfig, const char *cookie_arg){ config_t *config = pconfig; /* = cse_get_server_config(cmd->server); */ if (! config) return 0; config->has_config = 1; strcpy(config->session_url_prefix, cookie_arg); return 0;}/** * 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){ const apr_array_header_t *header = apr_table_elts(r->headers_in); const apr_table_entry_t *headers = (const apr_table_entry_t *) header->elts; int i; int session; for (i = 0; i < header->nelts; ++i) { if (! headers[i].key || ! headers[i].val) continue; if (strcasecmp(headers[i].key, "Cookie")) continue; session = cse_session_from_string(headers[i].val, config->session_cookie, backup); if (session >= 0) return session; } 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 buf[4096]; int ch; int i, j; conn_rec *c = r->connection; const char *host; const char *uri; int port; int is_sub_request = 1; /* for mod_rewrite */ /* * 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; else uri = r->unparsed_uri; /* #937 */ j = 0; for (i = 0; (ch = uri[i]) && ch != '?' && j + 2 < sizeof(buf); i++) { if (ch == '%') { /* #1661 */ buf[j++] = '%'; buf[j++] = '2'; buf[j++] = '5'; } else buf[j++] = ch; } buf[j] = 0; cse_write_string(s, HMUX_URL, buf); cse_write_string(s, HMUX_METHOD, r->method); 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); sprintf(buf, "%u", port); cse_write_string(s, CSE_SERVER_PORT, buf); if (c->remote_host) cse_write_string(s, CSE_REMOTE_HOST, c->remote_host); else cse_write_string(s, CSE_REMOTE_HOST, c->remote_ip); cse_write_string(s, CSE_REMOTE_ADDR, c->remote_ip); sprintf(buf, "%u", ntohs(c->remote_addr->port)); cse_write_string(s, CSE_REMOTE_PORT, buf); if (r->user) cse_write_string(s, CSE_REMOTE_USER, r->user); if (r->ap_auth_type) cse_write_string(s, CSE_AUTH_TYPE, r->ap_auth_type); /* 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); } 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){ const apr_array_header_t *header = apr_table_elts(r->headers_in); apr_table_entry_t *headers = (apr_table_entry_t *) header->elts; int i; for (i = 0; i < header->nelts; ++i) { if (! headers[i].key || ! headers[i].val) continue; /* * Content-type and Content-Length are special cased for a little * added efficiency. */ if (! strcasecmp(headers[i].key, "Content-type")) cse_write_string(s, CSE_CONTENT_TYPE, headers[i].val); else if (! strcasecmp(headers[i].key, "Content-length")) cse_write_string(s, CSE_CONTENT_LENGTH, headers[i].val); else if (! strcasecmp(headers[i].key, "Expect")) { /* expect=continue-100 shouldn't be passed to backend */ } else { cse_write_string(s, HMUX_HEADER, headers[i].key); cse_write_string(s, HMUX_STRING, headers[i].val); } }}static voidwrite_added_headers(stream_t *s, request_rec *r){ const apr_array_header_t *header = apr_table_elts(r->subprocess_env); apr_table_entry_t *headers = (apr_table_entry_t *) header->elts; int i; for (i = 0; i < header->nelts; ++i) { if (! headers[i].key || ! headers[i].val) continue; if (! strcmp(headers[i].key, "HTTPS") && ! strcmp(headers[i].val, "on")) { cse_write_string(s, CSE_IS_SECURE, ""); } else if (! r->user && ! strcmp(headers[i].key, "SSL_CLIENT_DN")) cse_write_string(s, CSE_REMOTE_USER, headers[i].val); cse_write_string(s, HMUX_HEADER, headers[i].key); cse_write_string(s, HMUX_STRING, headers[i].val); } 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 sublen; int writelen; int sentlen; if (s->read_length <= s->read_offset && cse_fill_buffer(s) < 0) return -1; sublen = s->read_length - s->read_offset; if (len < sublen) sublen = len; writelen = sublen; while (writelen > 0) { sentlen = ap_rwrite(s->read_buf + s->read_offset, writelen, r); /* * RSN-420. If the client fails, should still read data from the * server and complete that side of the socket. */ /* if (sentlen < 0) { cse_close(s, "write"); return -1; } */ writelen -= sublen; } s->read_offset += sublen; len -= sublen; } return 1;}/** * Copy data from the JVM to the browser. */static intsend_data(stream_t *s, request_rec *r){ int code = -1; char buf[8193]; char key[8193]; char value[8193]; int i; int channel; if (cse_fill_buffer(s) < 0) { return -1; } while (1) { int len; code = cse_read_byte(s); LOG(("%s:%d:send_data(): code %c\n", __FILE__, __LINE__, code)); switch (code) { case HMUX_CHANNEL: channel = hmux_read_len(s); LOG(("%s:%d:send_data(): channel %d\n", __FILE__, __LINE__, channel)); break; case HMUX_ACK: channel = hmux_read_len(s); LOG(("%s:%d:send_data(): ack %d\n", __FILE__, __LINE__, channel)); return code; case HMUX_STATUS: len = hmux_read_len(s); cse_read_limit(s, buf, sizeof(buf), len); for (i = 0; buf[i] && buf[i] != ' '; i++) { } i++; r->status = atoi(buf); r->status_line = apr_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 = apr_pstrdup(r->pool, value); apr_table_set(r->headers_out, key, value); } else apr_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 HMUX_EXIT; break; case HMUX_FLUSH: len = hmux_read_len(s); ap_rflush(r); break; case CSE_SEND_HEADER: len = hmux_read_len(s); break; case HMUX_QUIT: case HMUX_EXIT: return code; default: if (code < 0) { return code; } len = hmux_read_len(s); cse_skip(s, len); break; } }}/** * handles a client request */static intwrite_request(stream_t *s, request_rec *r, config_t *config, int session_index, int backup_index){ int len; int code = -1; hmux_start_channel(s, 1); write_env(s, r); write_headers(s, r); write_added_headers(s, r); /* read post data */ if (ap_should_client_block(r)) { char buf[BUF_LENGTH]; int ack_size = s->cluster_srun->srun->send_buffer_size; int send_length = 0; while ((len = ap_get_client_block(r, buf, BUF_LENGTH)) > 0) { cse_write_packet(s, HMUX_DATA, buf, len); send_length += len; if (ack_size <= send_length) { send_length = 0; cse_write_byte(s, HMUX_YIELD); code = send_data(s, r); if (code != HMUX_ACK) break; } } } cse_write_byte(s, HMUX_QUIT); code = send_data(s, r); LOG(("%s:%d:write_request(): return code %c\n", __FILE__, __LINE__, code)); return code;}/** * Handle a request. */static intcaucho_request(request_rec *r, config_t *config, resin_host_t *host, unsigned int now){ stream_t s; int retval; int code = -1; int session_index; int backup_index = 0; char *ip; srun_t *srun; if ((retval = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK))) return retval; session_index = get_session_index(config, r, &backup_index); ip = r->connection->remote_ip; if (host) { } else if (config->manual_host) { host = config->manual_host; } else { host = cse_match_host(config, ap_get_server_name(r),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -