h2_response *h2_response_clone(apr_pool_t *pool, h2_response *from) { h2_response *to = apr_pcalloc(pool, sizeof(h2_response)); to->stream_id = from->stream_id; to->http_status = from->http_status; to->content_length = from->content_length; if (from->headers) { to->headers = apr_table_clone(pool, from->headers); } if (from->trailers) { to->trailers = apr_table_clone(pool, from->trailers); } return to; }
void _mapcache_source_wms_query(mapcache_context *ctx, mapcache_feature_info *fi) { mapcache_map *map = (mapcache_map*)fi; mapcache_source_wms *wms = (mapcache_source_wms*)map->tileset->source; apr_table_t *params = apr_table_clone(ctx->pool,wms->wms_default_params); apr_table_overlap(params,wms->getmap_params,0); apr_table_setn(params,"BBOX",apr_psprintf(ctx->pool,"%f,%f,%f,%f", map->extent.minx,map->extent.miny,map->extent.maxx,map->extent.maxy)); apr_table_setn(params,"REQUEST","GetFeatureInfo"); apr_table_setn(params,"WIDTH",apr_psprintf(ctx->pool,"%d",map->width)); apr_table_setn(params,"HEIGHT",apr_psprintf(ctx->pool,"%d",map->height)); apr_table_setn(params,"SRS",map->grid_link->grid->srs); apr_table_setn(params,"X",apr_psprintf(ctx->pool,"%d",fi->i)); apr_table_setn(params,"Y",apr_psprintf(ctx->pool,"%d",fi->j)); apr_table_setn(params,"INFO_FORMAT",fi->format); apr_table_overlap(params,wms->getfeatureinfo_params,0); if(map->dimensions && !apr_is_empty_table(map->dimensions)) { const apr_array_header_t *elts = apr_table_elts(map->dimensions); int i; for(i=0; i<elts->nelts; i++) { apr_table_entry_t entry = APR_ARRAY_IDX(elts,i,apr_table_entry_t); apr_table_setn(params,entry.key,entry.val); } } fi->data = mapcache_buffer_create(30000,ctx->pool); mapcache_http_do_request_with_params(ctx,wms->http,params,fi->data,NULL,NULL); GC_CHECK_ERROR(ctx); }
mapcache_http* mapcache_http_clone(mapcache_context *ctx, mapcache_http *orig) { mapcache_http *ret = apr_pcalloc(ctx->pool, sizeof(mapcache_http)); ret->headers = apr_table_clone(ctx->pool,orig->headers); ret->url = apr_pstrdup(ctx->pool, orig->url); ret->connection_timeout = orig->connection_timeout; ret->timeout = orig->timeout; return ret; }
void h2_request_copy(apr_pool_t *p, h2_request *dst, const h2_request *src) { /* keep the dst id */ dst->method = OPT_COPY(p, src->method); dst->scheme = OPT_COPY(p, src->scheme); dst->authority = OPT_COPY(p, src->authority); dst->path = OPT_COPY(p, src->path); dst->headers = apr_table_clone(p, src->headers); dst->content_length = src->content_length; dst->chunked = src->chunked; dst->eoh = src->eoh; }
/** * \private \memberof mapcache_source_wms * \sa mapcache_source::render_map() */ void _mapcache_source_wms_render_map(mapcache_context *ctx, mapcache_map *map) { mapcache_source_wms *wms = (mapcache_source_wms*)map->tileset->source; mapcache_http *http; apr_table_t *params = apr_table_clone(ctx->pool,wms->wms_default_params); apr_table_setn(params,"BBOX",apr_psprintf(ctx->pool,"%f,%f,%f,%f", map->extent.minx,map->extent.miny,map->extent.maxx,map->extent.maxy)); apr_table_setn(params,"WIDTH",apr_psprintf(ctx->pool,"%d",map->width)); apr_table_setn(params,"HEIGHT",apr_psprintf(ctx->pool,"%d",map->height)); apr_table_setn(params,"FORMAT","image/png"); apr_table_setn(params,"SRS",map->grid_link->grid->srs); apr_table_overlap(params,wms->getmap_params,APR_OVERLAP_TABLES_SET); if(map->dimensions && !apr_is_empty_table(map->dimensions)) { const apr_array_header_t *elts = apr_table_elts(map->dimensions); int i; for(i=0; i<elts->nelts; i++) { apr_table_entry_t entry = APR_ARRAY_IDX(elts,i,apr_table_entry_t); /* set both DIM_key=val and key=val KVP params */ apr_table_setn(params,entry.key,entry.val); if(strcasecmp(entry.key,"TIME") && strcasecmp(entry.key,"ELEVATION")) { char *dim_name = apr_pstrcat(ctx->pool,"DIM_",entry.key,NULL); apr_table_setn(params,dim_name,entry.val); } } } /* if the source has no LAYERS parameter defined, then use the tileset name * as the LAYERS to request. When using mirror-mode, the source has no layers * defined, it is added based on the incoming request */ if(!apr_table_get(params,"layers")) { apr_table_set(params,"LAYERS",map->tileset->name); } map->encoded_data = mapcache_buffer_create(30000,ctx->pool); http = mapcache_http_clone(ctx, wms->http); http->url = mapcache_http_build_url(ctx,http->url,params); mapcache_http_do_request(ctx,http,map->encoded_data,NULL,NULL); GC_CHECK_ERROR(ctx); if(!mapcache_imageio_is_valid_format(ctx,map->encoded_data)) { char *returned_data = apr_pstrndup(ctx->pool,(char*)map->encoded_data->buf,map->encoded_data->size); ctx->set_error(ctx, 502, "wms request for tileset %s returned an unsupported format:\n%s", map->tileset->name, returned_data); } }
apr_status_t h2_task_do(h2_task *task, h2_worker *worker) { apr_status_t status = APR_SUCCESS; h2_config *cfg = h2_config_get(task->mplx->c); h2_task_env env; AP_DEBUG_ASSERT(task); memset(&env, 0, sizeof(env)); env.id = task->id; env.stream_id = task->stream_id; env.mplx = task->mplx; task->mplx = NULL; env.input_eos = task->input_eos; env.serialize_headers = !!h2_config_geti(cfg, H2_CONF_SER_HEADERS); /* Create a subpool from the worker one to be used for all things * with life-time of this task_env execution. */ apr_pool_create(&env.pool, h2_worker_get_pool(worker)); /* Link the env to the worker which provides useful things such * as mutex, a socket etc. */ env.io = h2_worker_get_cond(worker); /* Clone fields, so that lifetimes become (more) independent. */ env.method = apr_pstrdup(env.pool, task->method); env.path = apr_pstrdup(env.pool, task->path); env.authority = apr_pstrdup(env.pool, task->authority); env.headers = apr_table_clone(env.pool, task->headers); /* Setup the pseudo connection to use our own pool and bucket_alloc */ if (task->c) { env.c = *task->c; task->c = NULL; status = h2_conn_setup(&env, worker); } else { status = h2_conn_init(&env, worker); } /* save in connection that this one is a pseudo connection, prevents * other hooks from messing with it. */ h2_ctx_create_for(&env.c, &env); if (status == APR_SUCCESS) { env.input = h2_task_input_create(&env, env.pool, env.c.bucket_alloc); env.output = h2_task_output_create(&env, env.pool, env.c.bucket_alloc); status = h2_conn_process(&env.c, h2_worker_get_socket(worker)); ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, &env.c, "h2_task(%s): processing done", env.id); } else { ap_log_cerror(APLOG_MARK, APLOG_WARNING, status, &env.c, "h2_task(%s): error setting up h2_task_env", env.id); } if (env.input) { h2_task_input_destroy(env.input); env.input = NULL; } if (env.output) { h2_task_output_close(env.output); h2_task_output_destroy(env.output); env.output = NULL; } h2_task_set_finished(task); if (env.io) { apr_thread_cond_signal(env.io); } if (env.pool) { apr_pool_destroy(env.pool); env.pool = NULL; } if (env.c.id) { h2_conn_post(&env.c, worker); } h2_mplx_task_done(env.mplx, env.stream_id); return status; }