@@ -90,7 +90,6 @@ func (f FrankenPHPApp) CaddyModule() caddy.ModuleInfo {
9090// Provision sets up the module.
9191func (f * FrankenPHPApp ) Provision (ctx caddy.Context ) error {
9292 f .logger = ctx .Logger ()
93- f .logger .Info ("FrankenPHPApp provisioning 🐘" )
9493
9594 if httpApp , err := ctx .AppIfConfigured ("http" ); err == nil {
9695 if httpApp .(* caddyhttp.App ).Metrics != nil {
@@ -431,7 +430,6 @@ func (f *FrankenPHPModule) Provision(ctx caddy.Context) error {
431430 }
432431
433432 if len (f .Workers ) > 0 {
434- // Tag workers with a unique module ID based on the module's memory address
435433 for i := range f .Workers {
436434 f .Workers [i ].ModuleID = uintptr (unsafe .Pointer (f ))
437435 }
@@ -489,11 +487,67 @@ func (f *FrankenPHPModule) ServeHTTP(w http.ResponseWriter, r *http.Request, _ c
489487
490488// UnmarshalCaddyfile implements caddyfile.Unmarshaler.
491489func (f * FrankenPHPModule ) UnmarshalCaddyfile (d * caddyfile.Dispenser ) error {
492- // when adding a new directive, also update the allowedDirectives error message
490+ // First pass: Parse all directives except "worker"
493491 for d .Next () {
494492 for d .NextBlock (0 ) {
495493 switch d .Val () {
494+ case "root" :
495+ if ! d .NextArg () {
496+ return d .ArgErr ()
497+ }
498+ f .Root = d .Val ()
499+
500+ case "split" :
501+ f .SplitPath = d .RemainingArgs ()
502+ if len (f .SplitPath ) == 0 {
503+ return d .ArgErr ()
504+ }
505+
506+ case "env" :
507+ args := d .RemainingArgs ()
508+ if len (args ) != 2 {
509+ return d .ArgErr ()
510+ }
511+ if f .Env == nil {
512+ f .Env = make (map [string ]string )
513+ f .preparedEnv = make (frankenphp.PreparedEnv )
514+ }
515+ f .Env [args [0 ]] = args [1 ]
516+ f .preparedEnv [args [0 ]+ "\x00 " ] = args [1 ]
517+
518+ case "resolve_root_symlink" :
519+ if ! d .NextArg () {
520+ continue
521+ }
522+ v , err := strconv .ParseBool (d .Val ())
523+ if err != nil {
524+ return err
525+ }
526+ if d .NextArg () {
527+ return d .ArgErr ()
528+ }
529+ f .ResolveRootSymlink = & v
530+
496531 case "worker" :
532+ for d .NextBlock (1 ) {
533+ }
534+ for d .NextArg () {
535+ }
536+ // Skip "worker" blocks in the first pass
537+ continue
538+
539+ default :
540+ allowedDirectives := "root, split, env, resolve_root_symlink, worker"
541+ return wrongSubDirectiveError ("php or php_server" , allowedDirectives , d .Val ())
542+ }
543+ }
544+ }
545+
546+ // Second pass: Parse only "worker" blocks
547+ d .Reset ()
548+ for d .Next () {
549+ for d .NextBlock (0 ) {
550+ if d .Val () == "worker" {
497551 wc := workerConfig {}
498552 if d .NextArg () {
499553 wc .FileName = d .Val ()
@@ -552,48 +606,24 @@ func (f *FrankenPHPModule) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
552606 return errors .New (`the "file" argument must be specified` )
553607 }
554608
555- f .Workers = append (f .Workers , wc )
556- case "root" :
557- if ! d .NextArg () {
558- return d .ArgErr ()
559- }
560- f .Root = d .Val ()
561-
562- case "split" :
563- f .SplitPath = d .RemainingArgs ()
564- if len (f .SplitPath ) == 0 {
565- return d .ArgErr ()
566- }
567-
568- case "env" :
569- args := d .RemainingArgs ()
570- if len (args ) != 2 {
571- return d .ArgErr ()
572- }
573- if f .Env == nil {
574- f .Env = make (map [string ]string )
575- f .preparedEnv = make (frankenphp.PreparedEnv )
576- }
577- f .Env [args [0 ]] = args [1 ]
578- f .preparedEnv [args [0 ]+ "\x00 " ] = args [1 ]
579-
580- case "resolve_root_symlink" :
581- if ! d .NextArg () {
582- continue
609+ // Inherit environment variables from the parent php_server directive
610+ if ! filepath .IsAbs (wc .FileName ) && f .Root != "" {
611+ wc .FileName = filepath .Join (f .Root , wc .FileName )
583612 }
584613
585- v , err := strconv .ParseBool (d .Val ())
586- if err != nil {
587- return err
588- }
589- if d .NextArg () {
590- return d .ArgErr ()
614+ if f .Env != nil {
615+ if wc .Env == nil {
616+ wc .Env = make (map [string ]string )
617+ }
618+ for k , v := range f .Env {
619+ // Only set if not already defined in the worker
620+ if _ , exists := wc .Env [k ]; ! exists {
621+ wc .Env [k ] = v
622+ }
623+ }
591624 }
592625
593- f .ResolveRootSymlink = & v
594- default :
595- allowedDirectives := "root, split, env, resolve_root_symlink, worker"
596- return wrongSubDirectiveError ("php or php_server" , allowedDirectives , d .Val ())
626+ f .Workers = append (f .Workers , wc )
597627 }
598628 }
599629 }
0 commit comments