⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mod_caucho.c

📁 resinweb服务器源文件
💻 C
📖 第 1 页 / 共 3 页
字号:
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 + -