/*
 * include/haproxy/fcgi-app-t.h
 * This file defines everything related to FCGI applications.
 *
 * Copyright (C) 2019 HAProxy Technologies, Christopher Faulet <cfaulet@haproxy.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation, version 2.1
 * exclusively.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

#ifndef _HAPROXY_HTTP_FCGI_T_H
#define _HAPROXY_HTTP_FCGI_T_H

#include <import/ebpttree.h>
#include <import/ist.h>

#include <haproxy/acl-t.h>
#include <haproxy/api-t.h>
#include <haproxy/arg-t.h>
#include <haproxy/fcgi.h>
#include <haproxy/filters-t.h>
#include <haproxy/regex-t.h>

#define FCGI_APP_FL_KEEP_CONN     0x00000001 /* Keep the connection alive */
#define FCGI_APP_FL_GET_VALUES    0x00000002 /* Retrieve FCGI variables on connection establishment */
#define FCGI_APP_FL_MPXS_CONNS    0x00000004 /* FCGI APP supports connection multiplexing */


enum fcgi_rule_type {
	FCGI_RULE_SET_PARAM = 0,
	FCGI_RULE_UNSET_PARAM,
	FCGI_RULE_PASS_HDR,
	FCGI_RULE_HIDE_HDR,
};

/* Used during configuration parsing only and converted into fcgi_rule when
 * filter is created.
 */
struct fcgi_rule_conf {
	enum fcgi_rule_type type;
	char *name;
	char *value;
	struct acl_cond *cond; /* acl condition to set/unset the param */
	struct list list;
};

/* parameter rule evaluated during request analyzis */
struct fcgi_rule {
	enum fcgi_rule_type type;
	struct ist name;       /* name of the parameter/header */
	struct list value;     /* log-format compatible expression, may be empty */
	struct acl_cond *cond; /* acl condition to set the param */
	struct list list;
};

/* parameter rule to set/unset a param at the end of the analyzis */
struct fcgi_param_rule {
	struct ist name;
	struct list *value; /* if empty , unset the parameter */
	struct ebpt_node node;
};

/* header rule to pass/hide a header at the end of the analyzis */
struct fcgi_hdr_rule {
	struct ist name;
	int pass; /* 1 to pass the header, 0 Otherwise */
	struct ebpt_node node;
};

struct fcgi_app {
	char              *name;          /* name to identify this set of params */
	struct ist         docroot;       /* FCGI docroot */
	struct ist         index;         /* filename to append to URI ending by a '/' */
	struct my_regex   *pathinfo_re;   /* Regex to use to split scriptname and path-info */
	unsigned int       flags;         /* FCGI_APP_FL_* */
	struct list        logsrvs;       /* log servers */
	unsigned int       maxreqs;       /* maximum number of concurrent requests */

	struct list acls;                 /* list of acls declared for this application */

	struct {
		char *file;               /* file where the section appears */
		int   line;               /* line where the section appears */
		struct list rules;        /* list of rules used during config parsing */
		struct arg_list args;     /* sample arg list that need to be resolved */
	} conf;                           /* config information */
	struct fcgi_app *next;            /* used to chain fcgi-app */
};

/* FCGI config attached to backend proxies */
struct fcgi_flt_conf {
	char *name;                  /* fcgi-app name used during config parsing */
	struct fcgi_app *app;        /* configuration of the fcgi application */

	struct list param_rules;     /* list of set/unset rules */
	struct list hdr_rules;       /* list of pass/add rules  */
};

/* FCGI context attached to streames */
struct fcgi_flt_ctx {
	struct filter *filter;
	struct fcgi_app *app;
};

#endif /* _HAPROXY_HTTP_FCGI_T_H */

/*
 * Local variables:
 *  c-indent-level: 8
 *  c-basic-offset: 8
 * End:
 */
