native/common/jk_uri_worker_map.h (105 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/***************************************************************************
* Description: URI to worker mapper header file *
* Author: Gal Shachor <shachor@il.ibm.com> *
***************************************************************************/
#ifndef JK_URI_WORKER_MAP_H
#define JK_URI_WORKER_MAP_H
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
#include "jk_global.h"
#include "jk_map.h"
#include "jk_logger.h"
#include "jk_mt.h"
#define MATCH_TYPE_EXACT 0x0001
/* deprecated
#define MATCH_TYPE_CONTEXT 0x0002
*/
/* match all context path URIs with a path component suffix */
/* deprecated
#define MATCH_TYPE_CONTEXT_PATH 0x0004
*/
/* deprecated
#define MATCH_TYPE_SUFFIX 0x0010
*/
/* match all URIs of the form *ext */
/* deprecated
#define MATCH_TYPE_GENERAL_SUFFIX 0x0020
*/
/* match multiple wild characters (*) and (?) */
#define MATCH_TYPE_WILDCHAR_PATH 0x0040
#define MATCH_TYPE_NO_MATCH 0x1000
#define MATCH_TYPE_DISABLED 0x2000
/* deprecated
#define MATCH_TYPE_STOPPED 0x4000
*/
#define SOURCE_TYPE_WORKERDEF 0x0001
#define SOURCE_TYPE_JKMOUNT 0x0002
#define SOURCE_TYPE_URIMAP 0x0003
#define SOURCE_TYPE_DISCOVER 0x0004
#define SOURCE_TYPE_TEXT_WORKERDEF ("worker definition")
#define SOURCE_TYPE_TEXT_JKMOUNT ("JkMount")
#define SOURCE_TYPE_TEXT_URIMAP ("uriworkermap")
#define SOURCE_TYPE_TEXT_DISCOVER ("ajp14")
#define JK_MAX_URI_LEN 4095
struct rule_extension
{
/* reply_timeout overwrite */
int reply_timeout;
/* Whether to ignore session routing info */
int sticky_ignore;
/* Whether the request is stateless and should not
* influence session load balancing */
int stateless;
/* activation state overwrites for load balancers */
/* Number of elements in the array activations. */
int activation_size;
/* Dynamically allocated array with one entry per lb member. */
int *activation;
/* Temporary storage for the original extension strings. */
char *active;
char *disabled;
char *stopped;
/* fail_on_status overwrites */
/* Number of elements in the array fail_on_status. */
int fail_on_status_size;
/* Dynamically allocated array with one entry per status. */
int *fail_on_status;
/* Temporary storage for the original extension strings. */
char *fail_on_status_str;
/* Use server error pages for responses >= 400. */
int use_server_error_pages;
/* session_cookie overwrite */
char *session_cookie;
/* session_path overwrite */
char *session_path;
int set_session_cookie;
char *session_cookie_path;
};
typedef struct rule_extension rule_extension_t;
struct uri_worker_record
{
/* Original uri for logging */
char *uri;
/* Name of worker mapped */
const char *worker_name;
/* Base context */
const char *context;
/* Match type */
unsigned int match_type;
/* Definition source type */
unsigned int source_type;
/* char length of the context */
size_t context_len;
/* extended mapping properties */
rule_extension_t extensions;
};
typedef struct uri_worker_record uri_worker_record_t;
struct jk_uri_worker_map
{
/* Memory Pool */
jk_pool_t p;
jk_pool_atom_t buf[BIG_POOL_SIZE];
/* Index 0 or 1, which map instance do we use */
/* Needed to make map reload more atomically */
int index;
/* map Id.
* Unique value which gets incremented each time we
* call uri_worker_map_alloc
*/
int id;
/* Memory Pool - cleared when doing reload */
/* Use this pool to allocate objects, that are deleted */
/* when the map gets dynamically reloaded from uriworkermap.properties. */
jk_pool_t p_dyn[2];
jk_pool_atom_t buf_dyn[2][BIG_POOL_SIZE];
/* map URI->WORKER */
uri_worker_record_t **maps[2];
/* Map Number */
unsigned int size[2];
/* Map Capacity */
unsigned int capacity[2];
/* NoMap Number */
unsigned int nosize[2];
/* Dynamic config support */
JK_CRIT_SEC cs;
/* should we forward potentially unsafe URLs */
int reject_unsafe;
/* uriworkermap filename */
const char *fname;
/* uriworkermap reload check interval */
int reload;
/* Last modified time */
time_t modified;
/* Last checked time */
time_t checked;
};
typedef struct jk_uri_worker_map jk_uri_worker_map_t;
void extension_fix(jk_pool_t *p, const char *name,
rule_extension_t *extensions, jk_log_context_t *log_ctx);
void parse_rule_extensions(char *rule, rule_extension_t *extensions,
jk_log_context_t *log_ctx);
const char *uri_worker_map_get_source(uri_worker_record_t *uwr);
char *uri_worker_map_get_match(uri_worker_record_t *uwr, char *buf);
int uri_worker_map_alloc(jk_uri_worker_map_t **uw_map,
jk_map_t *init_data, jk_log_context_t *log_ctx);
int uri_worker_map_free(jk_uri_worker_map_t **uw_map, jk_log_context_t *log_ctx);
int uri_worker_map_open(jk_uri_worker_map_t *uw_map,
jk_map_t *init_data, jk_log_context_t *log_ctx);
void uri_worker_map_switch(jk_uri_worker_map_t *uw_map, jk_log_context_t *log_ctx);
void uri_worker_map_ext(jk_uri_worker_map_t *uw_map, jk_log_context_t *log_ctx);
int uri_worker_map_add(jk_uri_worker_map_t *uw_map,
const char *puri, const char *worker,
unsigned int source_type, jk_log_context_t *log_ctx);
const char *map_uri_to_worker_ext(jk_uri_worker_map_t *uw_map,
const char *uri, const char *vhost,
rule_extension_t **extensions,
int *index,
jk_log_context_t *log_ctx);
rule_extension_t *get_uri_to_worker_ext(jk_uri_worker_map_t *uw_map,
int index);
int uri_worker_map_load(jk_uri_worker_map_t *uw_map,
jk_log_context_t *log_ctx);
int uri_worker_map_update(jk_uri_worker_map_t *uw_map,
int force, jk_log_context_t *log_ctx);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* JK_URI_WORKER_MAP_H */