@@ -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+ }
946971static 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