Skip to content

Commit ee833ac

Browse files
authored
Merge pull request #262 from geographika/seeder-headers
Allow headers to be passed to the seeder application
2 parents 716942c + 947b531 commit ee833ac

File tree

1 file changed

+35
-16
lines changed

1 file changed

+35
-16
lines changed

util/mapcache_seed.c

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ static const apr_getopt_option_t seed_options[] = {
244244
{ "ogr-datasource", 'd', TRUE, "ogr datasource to get features from"},
245245
#endif
246246
{ "dimension", 'D', TRUE, "set the value of a dimension (format DIMENSIONNAME=VALUE). Can be used multiple times for multiple dimensions" },
247+
{ "header", 'H', TRUE, "set the value of a header to forward to back-end servers (format HEADERNAME=VALUE). Can be used multiple times for multiple headers" },
247248
{ "extent", 'e', TRUE, "extent to seed, format: minx,miny,maxx,maxy" },
248249
{ "force", 'f', FALSE, "force tile recreation even if it already exists" },
249250
{ "grid", 'g', TRUE, "grid to seed" },
@@ -943,6 +944,30 @@ int usage(const char *progname, char *msg, ...)
943944
return 1;
944945
}
945946

947+
static int parseKeyValuePairs(mapcache_context ctx, apr_table_t* argtable, const char* optarg)
948+
{
949+
char* argkey = NULL, * argvalue = NULL, * key, * last, * optargcpy = NULL;
950+
int keyidx;
951+
952+
optargcpy = apr_pstrdup(ctx.pool, optarg);
953+
keyidx = 0;
954+
for (key = apr_strtok(optargcpy, "=", &last); key != NULL;
955+
key = apr_strtok(NULL, "=", &last)) {
956+
if (keyidx == 0) {
957+
argkey = key;
958+
}
959+
else {
960+
argvalue = key;
961+
}
962+
keyidx++;
963+
}
964+
if (keyidx != 2 || !argkey || !argvalue || !*argkey || !*argvalue) {
965+
return -1;
966+
} else {
967+
apr_table_set(argtable, argkey, argvalue);
968+
return 0;
969+
}
970+
}
946971
static int isPowerOfTwo(int x)
947972
{
948973
return (x & (x - 1)) == 0;
@@ -966,8 +991,7 @@ int main(int argc, const char **argv)
966991
const char *old = NULL;
967992
const char *optarg;
968993
apr_table_t *argdimensions;
969-
char *dimkey=NULL, *dimvalue=NULL,*key, *last, *optargcpy=NULL;
970-
int keyidx;
994+
apr_table_t* argheaders;
971995
int *metasizes = NULL;//[2];
972996
int metax=-1,metay=-1;
973997
double *extent_array = NULL;
@@ -993,7 +1017,9 @@ int main(int argc, const char **argv)
9931017

9941018
mapcache_gettimeofday(&starttime,NULL);
9951019
argdimensions = apr_table_make(ctx.pool,3);
1020+
argheaders = apr_table_make(ctx.pool, 3);
9961021

1022+
ctx.headers_in = argheaders;
9971023

9981024
/* parse the all options based on opt_option[] */
9991025
while ((rv = apr_getopt_long(opt, seed_options, &optch, &optarg)) == APR_SUCCESS) {
@@ -1114,22 +1140,15 @@ int main(int argc, const char **argv)
11141140
old = optarg;
11151141
break;
11161142
case 'D':
1117-
optargcpy = apr_pstrdup(ctx.pool,optarg);
1118-
keyidx = 0;
1119-
for (key = apr_strtok(optargcpy, "=", &last); key != NULL;
1120-
key = apr_strtok(NULL, "=", &last)) {
1121-
if(keyidx == 0) {
1122-
dimkey = key;
1123-
} else {
1124-
dimvalue = key;
1125-
}
1126-
keyidx++;
1143+
if(parseKeyValuePairs(ctx, argdimensions, optarg) < 0) {
1144+
return usage(argv[0], "failed to parse dimension, expecting DIMNAME=DIMVALUE");
11271145
}
1128-
if(keyidx!=2 || !dimkey || !dimvalue || !*dimkey || !*dimvalue) {
1129-
return usage(argv[0], "failed to parse dimension, expecting DIMNAME=DIMVALUE");
1130-
}
1131-
apr_table_set(argdimensions,dimkey,dimvalue);
11321146
break;
1147+
case 'H':
1148+
if (parseKeyValuePairs(ctx, argheaders, optarg) < 0) {
1149+
return usage(argv[0], "failed to parse headers, expecting HEADERNAME=VALUE");
1150+
}
1151+
break;
11331152
case SEEDER_OPT_THREAD_DELAY:
11341153
thread_delay = strtod(optarg, NULL);
11351154
if(thread_delay < 0.0 )

0 commit comments

Comments
 (0)