1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package httpd
- import (
- "context"
- "errors"
- "net/http"
- "os"
- "strconv"
- "github.com/go-chi/render"
- "github.com/drakkan/sftpgo/common"
- "github.com/drakkan/sftpgo/dataprovider"
- )
- func sendAPIResponse(w http.ResponseWriter, r *http.Request, err error, message string, code int) {
- var errorString string
- if err != nil {
- errorString = err.Error()
- }
- resp := apiResponse{
- Error: errorString,
- Message: message,
- }
- ctx := context.WithValue(r.Context(), render.StatusCtxKey, code)
- render.JSON(w, r.WithContext(ctx), resp)
- }
- func getRespStatus(err error) int {
- if _, ok := err.(*dataprovider.ValidationError); ok {
- return http.StatusBadRequest
- }
- if _, ok := err.(*dataprovider.MethodDisabledError); ok {
- return http.StatusForbidden
- }
- if _, ok := err.(*dataprovider.RecordNotFoundError); ok {
- return http.StatusNotFound
- }
- if os.IsNotExist(err) {
- return http.StatusBadRequest
- }
- return http.StatusInternalServerError
- }
- func handleCloseConnection(w http.ResponseWriter, r *http.Request) {
- connectionID := getURLParam(r, "connectionID")
- if connectionID == "" {
- sendAPIResponse(w, r, nil, "connectionID is mandatory", http.StatusBadRequest)
- return
- }
- if common.Connections.Close(connectionID) {
- sendAPIResponse(w, r, nil, "Connection closed", http.StatusOK)
- } else {
- sendAPIResponse(w, r, nil, "Not Found", http.StatusNotFound)
- }
- }
- func getSearchFilters(w http.ResponseWriter, r *http.Request) (int, int, string, error) {
- var err error
- limit := 100
- offset := 0
- order := dataprovider.OrderASC
- if _, ok := r.URL.Query()["limit"]; ok {
- limit, err = strconv.Atoi(r.URL.Query().Get("limit"))
- if err != nil {
- err = errors.New("invalid limit")
- sendAPIResponse(w, r, err, "", http.StatusBadRequest)
- return limit, offset, order, err
- }
- if limit > 500 {
- limit = 500
- }
- }
- if _, ok := r.URL.Query()["offset"]; ok {
- offset, err = strconv.Atoi(r.URL.Query().Get("offset"))
- if err != nil {
- err = errors.New("invalid offset")
- sendAPIResponse(w, r, err, "", http.StatusBadRequest)
- return limit, offset, order, err
- }
- }
- if _, ok := r.URL.Query()["order"]; ok {
- order = r.URL.Query().Get("order")
- if order != dataprovider.OrderASC && order != dataprovider.OrderDESC {
- err = errors.New("invalid order")
- sendAPIResponse(w, r, err, "", http.StatusBadRequest)
- return limit, offset, order, err
- }
- }
- return limit, offset, order, err
- }
|