mirror of
https://github.com/adnanh/webhook.git
synced 2025-05-13 09:04:44 +00:00
feat: add new hook option keep-file-environment
This commit is contained in:
parent
f187592147
commit
fe539f46b5
3 changed files with 49 additions and 0 deletions
|
@ -23,6 +23,7 @@ Hooks are defined as objects in the JSON or YAML hooks configuration file. Pleas
|
||||||
* `trigger-rule` - specifies the rule that will be evaluated in order to determine should the hook be triggered. Check [Hook rules page](Hook-Rules.md) to see the list of valid rules and their usage
|
* `trigger-rule` - specifies the rule that will be evaluated in order to determine should the hook be triggered. Check [Hook rules page](Hook-Rules.md) to see the list of valid rules and their usage
|
||||||
* `trigger-rule-mismatch-http-response-code` - specifies the HTTP status code to be returned when the trigger rule is not satisfied
|
* `trigger-rule-mismatch-http-response-code` - specifies the HTTP status code to be returned when the trigger rule is not satisfied
|
||||||
* `trigger-signature-soft-failures` - allow signature validation failures within Or rules; by default, signature failures are treated as errors.
|
* `trigger-signature-soft-failures` - allow signature validation failures within Or rules; by default, signature failures are treated as errors.
|
||||||
|
* `keep-file-environment` - Keep all submitted files. Sending `curl -d 'pkg=@res.tar.gz'` will retrieve the environment variable `HOOK_FILE_PKG`, which contains the file path, and `HOOK_FILENAME_PKG`, which contains the file name as `res.tar.gz`. If `keep-file-environment` is true, the file will be preserved after the hook is executed. By default, the corresponding file will be removed after the webhook exits.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
Check out [Hook examples page](Hook-Examples.md) for more complex examples of hooks.
|
Check out [Hook examples page](Hook-Examples.md) for more complex examples of hooks.
|
||||||
|
|
|
@ -581,6 +581,7 @@ type Hook struct {
|
||||||
IncomingPayloadContentType string `json:"incoming-payload-content-type,omitempty"`
|
IncomingPayloadContentType string `json:"incoming-payload-content-type,omitempty"`
|
||||||
SuccessHttpResponseCode int `json:"success-http-response-code,omitempty"`
|
SuccessHttpResponseCode int `json:"success-http-response-code,omitempty"`
|
||||||
HTTPMethods []string `json:"http-methods"`
|
HTTPMethods []string `json:"http-methods"`
|
||||||
|
KeepFileEnvironment bool `json:"keep-file-environment,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParseJSONParameters decodes specified arguments to JSON objects and replaces the
|
// ParseJSONParameters decodes specified arguments to JSON objects and replaces the
|
||||||
|
|
47
webhook.go
47
webhook.go
|
@ -5,6 +5,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
@ -615,6 +616,52 @@ func handleHook(h *hook.Hook, r *hook.Request) (string, error) {
|
||||||
envs = append(envs, files[i].EnvName+"="+tmpfile.Name())
|
envs = append(envs, files[i].EnvName+"="+tmpfile.Name())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if h.KeepFileEnvironment && r.RawRequest != nil && r.RawRequest.MultipartForm != nil {
|
||||||
|
for k, v := range r.RawRequest.MultipartForm.File {
|
||||||
|
env_name := hook.EnvNamespace + "FILE_" + strings.ToUpper(k)
|
||||||
|
f, err := v[0].Open()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("[%s] error open form %s file [%s]", r.ID, k, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if f1, ok := f.(*os.File); ok {
|
||||||
|
log.Printf("[%s] temporary file %s", r.ID, f1.Name())
|
||||||
|
_ = f1.Close()
|
||||||
|
files = append(files, hook.FileParameter{File: f1, EnvName: env_name})
|
||||||
|
envs = append(envs,
|
||||||
|
env_name+"="+f1.Name(),
|
||||||
|
hook.EnvNamespace+"FILENAME_"+strings.ToUpper(k)+"="+v[0].Filename,
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
tmpfile, err := os.CreateTemp("", ".hook-"+r.ID+"-"+k+"-*")
|
||||||
|
if err != nil {
|
||||||
|
_ = f.Close()
|
||||||
|
log.Printf("[%s] error creating temp file [%s]", r.ID, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
log.Printf("[%s] writing env %s file %s", r.ID, env_name, tmpfile.Name())
|
||||||
|
if _, err = io.Copy(tmpfile, f); err != nil {
|
||||||
|
log.Printf("[%s] error writing file %s [%s]", r.ID, tmpfile.Name(), err)
|
||||||
|
_ = f.Close()
|
||||||
|
_ = tmpfile.Close()
|
||||||
|
_ = os.Remove(tmpfile.Name())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err := tmpfile.Close(); err != nil {
|
||||||
|
log.Printf("[%s] error closing file %s [%s]", r.ID, tmpfile.Name(), err)
|
||||||
|
_ = os.Remove(tmpfile.Name())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
_ = f.Close()
|
||||||
|
files = append(files, hook.FileParameter{File: tmpfile, EnvName: env_name})
|
||||||
|
envs = append(envs,
|
||||||
|
env_name+"="+tmpfile.Name(),
|
||||||
|
hook.EnvNamespace+"FILENAME_"+strings.ToUpper(k)+"="+v[0].Filename,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cmd.Env = append(os.Environ(), envs...)
|
cmd.Env = append(os.Environ(), envs...)
|
||||||
|
|
||||||
log.Printf("[%s] executing %s (%s) with arguments %q and environment %s using %s as cwd\n", r.ID, h.ExecuteCommand, cmd.Path, cmd.Args, envs, cmd.Dir)
|
log.Printf("[%s] executing %s (%s) with arguments %q and environment %s using %s as cwd\n", r.ID, h.ExecuteCommand, cmd.Path, cmd.Args, envs, cmd.Dir)
|
||||||
|
|
Loading…
Add table
Reference in a new issue