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

📄 mod_caucho.c

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