static ngx_int_t ngx_tcp_cmd_tran_handler(ngx_tcp_ctx_t *ctx, const u_char *pkg, int pkg_len) { ngx_tcp_cmd_pkghead_t *pkghead; ngx_tcp_cmd_pkgtran_t *pkgtran; uint32_t pkg_size; ngx_tcp_cmd_session_t *s; ngx_connection_t *c; ngx_tcp_cmd_session_t *dest_s; ngx_tcp_core_main_conf_t *cmcf; socketfd_info_t *socketfd_info; s = ctx->ngx_tcp_session; c = s->parent.connection; if (ngx_rstrncmp((u_char *)"unix:", c->addr_text.data, sizeof("unix:") - 1) != 0) { ngx_log_error(NGX_LOG_ERR, c->log, 0, "ngx_tcp_cmd_tran_handler|cli=%V\n", &c->addr_text); return NGX_OK; } cmcf = ngx_tcp_get_module_main_conf(((ngx_tcp_session_t *)s), ngx_tcp_core_module); pkghead = (ngx_tcp_cmd_pkghead_t *)(pkg); pkgtran = (ngx_tcp_cmd_pkgtran_t *)(pkghead + 1); pkg_size = pkgtran->data_size; socketfd_info = cmcf->socketfd_shm->info->socketfd_info + pkgtran->dest_fd; dest_s = (ngx_tcp_cmd_session_t *)(socketfd_info->tag); if (dest_s == NULL) { ngx_log_error(NGX_LOG_ERR, s->parent.connection->log, 0, "ngx_tcp_cmd_tran_handler|dest_s=NULL|dest_fd=%d|dest_pid=%d\n", pkgtran->dest_fd, pkgtran->dest_pid); return NGX_OK; } if (dest_s->parent.connection == NULL || pkgtran->dest_fd <= 2) { ngx_log_error(NGX_LOG_ERR, s->parent.connection->log, 0, "ngx_tcp_cmd_tran_handler|dest_c=%p|dest_fd=%d\n", dest_s->parent.connection, pkgtran->dest_fd); return NGX_OK; } if (ngx_pid != pkgtran->dest_pid || ngx_process_slot != socketfd_info->listening_unix_info_i || pkgtran->dest_fd != dest_s->parent.connection->fd) { ngx_log_error(NGX_LOG_ERR, s->parent.connection->log, 0, "ngx_tcp_cmd_tran_handler|conn fd=%d|dest_fd=%d" "|ngx_process_slot=%d|listening_unix_info_i=%d" "|dest_pid=%d|ngx_pid=%d\n", dest_s->parent.connection->fd, pkgtran->dest_fd, ngx_process_slot, socketfd_info->listening_unix_info_i, pkgtran->dest_pid, ngx_pid); return NGX_OK; } ngx_tcp_send_data(&dest_s->parent.tcp_ctx, pkgtran->data, pkg_size); return NGX_OK; }
ngx_http_cache_t *ngx_http_cache_get(ngx_http_cache_hash_t *hash, ngx_http_cleanup_t *cleanup, ngx_str_t *key, uint32_t *crc) { ngx_uint_t i; ngx_http_cache_t *c; *crc = ngx_crc(key->data, key->len); c = hash->elts + *crc % hash->hash * hash->nelts; if (ngx_mutex_lock(&hash->mutex) == NGX_ERROR) { return (void *) NGX_ERROR; } for (i = 0; i < hash->nelts; i++) { if (c[i].crc == *crc && c[i].key.len == key->len && ngx_rstrncmp(c[i].key.data, key->data, key->len) == 0) { #if 0 if (c[i].expired) { ngx_mutex_unlock(&hash->mutex); return (void *) NGX_AGAIN; } #endif c[i].refs++; if ((!(c[i].notify && (ngx_event_flags & NGX_USE_KQUEUE_EVENT))) && (ngx_cached_time - c[i].updated >= hash->update)) { c[i].expired = 1; } ngx_mutex_unlock(&hash->mutex); if (cleanup) { cleanup->data.cache.hash = hash; cleanup->data.cache.cache = &c[i]; cleanup->valid = 1; cleanup->cache = 1; } return &c[i]; } } ngx_mutex_unlock(&hash->mutex); return NULL; }
//get the index static ngx_http_dclass_kvdata_str *ngx_http_dclass_index(ngx_http_request_t *r) { ngx_uint_t i; u_char *hfield=NULL; ngx_uint_t key; ngx_str_t str; ngx_http_variable_value_t *val; const dclass_keyvalue *kvd; ngx_list_part_t *part; ngx_table_elt_t *header; ngx_http_dclass_conf_t *cf; ngx_http_dclass_kvdata_str *kvs; cf = ngx_http_get_module_loc_conf(r,ngx_http_dclass_module); if(!cf->enable || !cf->head[0]) return NULL; ngx_str_set(&str,"dclass_ptr"); key=ngx_hash_key(str.data,str.len); val=ngx_http_get_variable(r, &str, key); if(val && val->valid && val->data && !ngx_rstrncmp((u_char*)"ptr",val->data,3)) { kvs=(ngx_http_dclass_kvdata_str*)val->data; ngx_log_error(NGX_HTTP_DCLASS_LOGLEVEL,r->connection->log,0,"dClass: classify cache: '%s'",kvs->kvd[0]->id); return kvs; } if(!*cf->hfield.data) { if(r->headers_in.user_agent) hfield = r->headers_in.user_agent->value.data; } else { part=&r->headers_in.headers.part; header=part->elts; for (i=0;;i++) { if(i>=part->nelts) { if(part->next==NULL) break; part=part->next; header=part->elts; i=0; } if(!ngx_strcasecmp(cf->hfield.data,header[i].key.data)) { hfield=header[i].value.data; break; } } } if(hfield==NULL) return NULL; kvs=(ngx_http_dclass_kvdata_str*)ngx_pcalloc(r->pool,sizeof(ngx_http_dclass_kvdata_str)); if(kvs==NULL) return NULL; for(i=0;i<NGX_HTTP_DCLASS_INDEXES && cf->head[i];i++) { kvd=dclass_classify(cf->head[i],(char*)hfield); kvs->kvd[i]=kvd; ngx_cpystrn(kvs->data,(u_char*)"ptr",4); ngx_log_error(NGX_HTTP_DCLASS_LOGLEVEL,r->connection->log,0,"dClass: classify %d: '%s' => '%s'",i,hfield,kvd->id); } return kvs; }