mirror of
https://github.com/rclone/rclone.git
synced 2024-11-22 20:20:16 +08:00
librclone: catch panics at the language change boundary #4891
This commit is contained in:
parent
ba09ee18bb
commit
665eceaec3
|
@ -12,6 +12,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"runtime/debug"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -77,8 +78,17 @@ func writeError(path string, in rc.Params, err error, status int) (string, int)
|
||||||
// operations/uploadfile and core/command are not supported as they need request or response object
|
// operations/uploadfile and core/command are not supported as they need request or response object
|
||||||
// modified from handlePost in rcserver.go
|
// modified from handlePost in rcserver.go
|
||||||
func RPC(method string, input string) (output string, status int) {
|
func RPC(method string, input string) (output string, status int) {
|
||||||
// create a buffer to capture the output
|
|
||||||
in := make(rc.Params)
|
in := make(rc.Params)
|
||||||
|
|
||||||
|
// Catch panics
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
output, status = writeError(method, in, fmt.Errorf("panic: %v\n%s", r, debug.Stack()), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// create a buffer to capture the output
|
||||||
err := json.NewDecoder(strings.NewReader(input)).Decode(&in)
|
err := json.NewDecoder(strings.NewReader(input)).Decode(&in)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return writeError(method, in, errors.Wrap(err, "failed to read input JSON"), http.StatusBadRequest)
|
return writeError(method, in, errors.Wrap(err, "failed to read input JSON"), http.StatusBadRequest)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user