in openwhisk/initHandler.go [53:146]
func (ap *ActionProxy) initHandler(w http.ResponseWriter, r *http.Request) {
// you can do multiple initializations when debugging
if ap.initialized && !Debugging {
msg := "Cannot initialize the action more than once."
sendError(w, http.StatusForbidden, msg)
log.Println(msg)
return
}
// read body of the request
if ap.compiler != "" {
Debug("compiler: " + ap.compiler)
}
body, err := ioutil.ReadAll(r.Body)
defer r.Body.Close()
if err != nil {
sendError(w, http.StatusBadRequest, fmt.Sprintf("%v", err))
return
}
// decode request parameters
if len(body) < 1000 {
Debug("init: decoding %s\n", string(body))
}
var request initRequest
err = json.Unmarshal(body, &request)
if err != nil {
sendError(w, http.StatusBadRequest, fmt.Sprintf("Error unmarshaling request: %v", err))
return
}
// request with empty code - stop any executor but return ok
if request.Value.Code == "" {
sendError(w, http.StatusForbidden, "Missing main/no code to execute.")
return
}
// passing the env to the action proxy
ap.SetEnv(request.Value.Env)
// setting main
main := request.Value.Main
if main == "" {
main = "main"
}
// extract code eventually decoding it
var buf []byte
if request.Value.Binary {
Debug("it is binary code")
buf, err = base64.StdEncoding.DecodeString(request.Value.Code)
if err != nil {
sendError(w, http.StatusBadRequest, "cannot decode the request: "+err.Error())
return
}
} else {
Debug("it is source code")
buf = []byte(request.Value.Code)
}
// if a compiler is defined try to compile
_, err = ap.ExtractAndCompile(&buf, main)
if err != nil {
if os.Getenv("OW_LOG_INIT_ERROR") == "" {
sendError(w, http.StatusBadGateway, err.Error())
} else {
ap.errFile.Write([]byte(err.Error() + "\n"))
ap.outFile.Write([]byte(OutputGuard))
ap.errFile.Write([]byte(OutputGuard))
sendError(w, http.StatusBadGateway, "The action failed to generate or locate a binary. See logs for details.")
}
return
}
// start an action
err = ap.StartLatestAction()
if err != nil {
if os.Getenv("OW_LOG_INIT_ERROR") == "" {
sendError(w, http.StatusBadGateway, "cannot start action: "+err.Error())
} else {
ap.errFile.Write([]byte(err.Error() + "\n"))
ap.outFile.Write([]byte(OutputGuard))
ap.errFile.Write([]byte(OutputGuard))
sendError(w, http.StatusBadGateway, "Cannot start action. Check logs for details.")
}
return
}
ap.initialized = true
sendOK(w)
}