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

📄 mod_caucho.c

📁 RESIN 3.2 最新源码
💻 C
📖 第 1 页 / 共 3 页
字号:
                             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 + -