@@ -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 ) {
@@ -1113,22 +1139,15 @@ int main(int argc, const char **argv)
11131139 old = optarg ;
11141140 break ;
11151141 case 'D' :
1116- optargcpy = apr_pstrdup (ctx .pool ,optarg );
1117- keyidx = 0 ;
1118- for (key = apr_strtok (optargcpy , "=" , & last ); key != NULL ;
1119- key = apr_strtok (NULL , "=" , & last )) {
1120- if (keyidx == 0 ) {
1121- dimkey = key ;
1122- } else {
1123- dimvalue = key ;
1124- }
1125- keyidx ++ ;
1142+ if (parseKeyValuePairs (ctx , argdimensions , optarg ) < 0 ) {
1143+ return usage (argv [0 ], "failed to parse dimension, expecting DIMNAME=DIMVALUE" );
11261144 }
1127- if (keyidx != 2 || !dimkey || !dimvalue || !* dimkey || !* dimvalue ) {
1128- return usage (argv [0 ], "failed to parse dimension, expecting DIMNAME=DIMVALUE" );
1129- }
1130- apr_table_set (argdimensions ,dimkey ,dimvalue );
11311145 break ;
1146+ case 'H' :
1147+ if (parseKeyValuePairs (ctx , argheaders , optarg ) < 0 ) {
1148+ return usage (argv [0 ], "failed to parse headers, expecting HEADERNAME=VALUE" );
1149+ }
1150+ break ;
11321151 case SEEDER_OPT_THREAD_DELAY :
11331152 thread_delay = strtod (optarg , NULL );
11341153 if (thread_delay < 0.0 )
0 commit comments