reuse compiled DTD hash in different locations, add DTD cleanup
diff --git a/src/http/modules/ngx_http_xslt_filter_module.c b/src/http/modules/ngx_http_xslt_filter_module.c
index ce24e63..df7aa88 100644
--- a/src/http/modules/ngx_http_xslt_filter_module.c
+++ b/src/http/modules/ngx_http_xslt_filter_module.c
@@ -23,12 +23,13 @@
typedef struct {
u_char *name;
- xsltStylesheetPtr stylesheet;
-} ngx_http_xslt_sheet_file_t;
+ void *data;
+} ngx_http_xslt_file_t;
typedef struct {
- ngx_array_t sheet_files; /* ngx_http_xslt_sheet_file_t */
+ ngx_array_t dtd_files; /* ngx_http_xslt_file_t */
+ ngx_array_t sheet_files; /* ngx_http_xslt_file_t */
} ngx_http_xslt_filter_main_conf_t;
@@ -128,6 +129,7 @@
void *conf);
static char *ngx_http_xslt_stylesheet(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
+static void ngx_http_xslt_cleanup_dtd(void *data);
static void ngx_http_xslt_cleanup_stylesheet(void *data);
static void *ngx_http_xslt_filter_create_main_conf(ngx_conf_t *cf);
static void *ngx_http_xslt_filter_create_conf(ngx_conf_t *cf);
@@ -994,7 +996,11 @@
{
ngx_http_xslt_filter_loc_conf_t *xlcf = conf;
- ngx_str_t *value;
+ ngx_str_t *value;
+ ngx_uint_t i;
+ ngx_pool_cleanup_t *cln;
+ ngx_http_xslt_file_t *file;
+ ngx_http_xslt_filter_main_conf_t *xmcf;
if (xlcf->dtd) {
return "is duplicate";
@@ -1002,6 +1008,21 @@
value = cf->args->elts;
+ xmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_xslt_filter_module);
+
+ file = xmcf->dtd_files.elts;
+ for (i = 0; i < xmcf->dtd_files.nelts; i++) {
+ if (ngx_strcmp(file[i].name, &value[1].data) == 0) {
+ xlcf->dtd = file[i].data;
+ return NGX_CONF_OK;
+ }
+ }
+
+ cln = ngx_pool_cleanup_add(cf->pool, 0);
+ if (cln == NULL) {
+ return NGX_CONF_ERROR;
+ }
+
xlcf->dtd = xmlParseDTD(NULL, (xmlChar *) value[1].data);
if (xlcf->dtd == NULL) {
@@ -1009,6 +1030,17 @@
return NGX_CONF_ERROR;
}
+ cln->handler = ngx_http_xslt_cleanup_dtd;
+ cln->data = xlcf->dtd;
+
+ file = ngx_array_push(&xmcf->dtd_files);
+ if (file == NULL) {
+ return NGX_CONF_ERROR;
+ }
+
+ file->name = value[1].data;
+ file->data = xlcf->dtd;
+
return NGX_CONF_OK;
}
@@ -1022,10 +1054,10 @@
ngx_str_t *value;
ngx_uint_t i, n;
ngx_pool_cleanup_t *cln;
+ ngx_http_xslt_file_t *file;
ngx_http_xslt_sheet_t *sheet;
ngx_http_xslt_param_t *param;
ngx_http_script_compile_t sc;
- ngx_http_xslt_sheet_file_t *file;
ngx_http_xslt_filter_main_conf_t *xmcf;
value = cf->args->elts;
@@ -1055,7 +1087,7 @@
file = xmcf->sheet_files.elts;
for (i = 0; i < xmcf->sheet_files.nelts; i++) {
if (ngx_strcmp(file[i].name, &value[1].data) == 0) {
- sheet->stylesheet = file[i].stylesheet;
+ sheet->stylesheet = file[i].data;
goto found;
}
}
@@ -1082,7 +1114,7 @@
}
file->name = value[1].data;
- file->stylesheet = sheet->stylesheet;
+ file->data = sheet->stylesheet;
found:
@@ -1129,11 +1161,16 @@
static void
+ngx_http_xslt_cleanup_dtd(void *data)
+{
+ xmlFreeDtd(data);
+}
+
+
+static void
ngx_http_xslt_cleanup_stylesheet(void *data)
{
- xsltStylesheetPtr stylesheet = data;
-
- xsltFreeStylesheet(stylesheet);
+ xsltFreeStylesheet(data);
}
@@ -1147,8 +1184,15 @@
return NGX_CONF_ERROR;
}
+ if (ngx_array_init(&conf->dtd_files, cf->pool, 1,
+ sizeof(ngx_http_xslt_file_t))
+ != NGX_OK)
+ {
+ return NULL;
+ }
+
if (ngx_array_init(&conf->sheet_files, cf->pool, 1,
- sizeof(ngx_http_xslt_sheet_file_t))
+ sizeof(ngx_http_xslt_file_t))
!= NGX_OK)
{
return NULL;