Skip to content

Commit

Permalink
savepoint
Browse files Browse the repository at this point in the history
  • Loading branch information
devnode committed Oct 18, 2022
1 parent 188b9f8 commit c8a1d07
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 18 deletions.
17 changes: 16 additions & 1 deletion cmd/rc/rc.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"errors"
"fmt"
"io/ioutil"
"net"
"net/http"
"os"
"strings"
Expand All @@ -25,6 +26,7 @@ import (
var (
noOutput = false
url = "http://localhost:5572/"
unix = ""
jsonInput = ""
authUser = ""
authPass = ""
Expand All @@ -38,6 +40,7 @@ func init() {
cmdFlags := commandDefinition.Flags()
flags.BoolVarP(cmdFlags, &noOutput, "no-output", "", noOutput, "If set, don't output the JSON result")
flags.StringVarP(cmdFlags, &url, "url", "", url, "URL to connect to rclone remote control")
flags.StringVarP(cmdFlags, &unix, "unix", "", unix, "path to unix socket")
flags.StringVarP(cmdFlags, &jsonInput, "json", "", jsonInput, "Input JSON - use instead of key=value args")
flags.StringVarP(cmdFlags, &authUser, "user", "", "", "Username to use to rclone remote control")
flags.StringVarP(cmdFlags, &authPass, "pass", "", "", "Password to use to connect to rclone remote control")
Expand Down Expand Up @@ -180,7 +183,19 @@ func doCall(ctx context.Context, path string, in rc.Params) (out rc.Params, err

// Do HTTP request
client := fshttp.NewClient(ctx)
url += path

if len(unix) > 0 {
client.Transport = &http.Transport{
DialContext: func(_ context.Context, _, _ string) (net.Conn, error) {
return net.Dial("unix", unix)
},
}
url = "http://localhost/" + path

} else {
url += path
}

data, err := json.Marshal(in)
if err != nil {
return nil, fmt.Errorf("failed to encode JSON: %w", err)
Expand Down
3 changes: 2 additions & 1 deletion cmd/serve/httplib/httpflags/httpflags.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ var (
// AddFlagsPrefix adds flags for the httplib
func AddFlagsPrefix(flagSet *pflag.FlagSet, prefix string, Opt *httplib.Options) {
rc.AddOption(prefix+"http", &Opt)
flags.StringVarP(flagSet, &Opt.ListenAddr, prefix+"addr", "", Opt.ListenAddr, "IPaddress:Port or :Port to bind server to")
flags.StringVarP(flagSet, &Opt.Network, prefix+"net", "", Opt.Network, "Network to listen on: tcp (default) or unix")
flags.StringVarP(flagSet, &Opt.ListenAddr, prefix+"addr", "", Opt.ListenAddr, "Listen address: IPaddress:Port, :Port or /path/to/unix.socket")
flags.DurationVarP(flagSet, &Opt.ServerReadTimeout, prefix+"server-read-timeout", "", Opt.ServerReadTimeout, "Timeout for server reading data")
flags.DurationVarP(flagSet, &Opt.ServerWriteTimeout, prefix+"server-write-timeout", "", Opt.ServerWriteTimeout, "Timeout for server writing data")
flags.IntVarP(flagSet, &Opt.MaxHeaderBytes, prefix+"max-header-bytes", "", Opt.MaxHeaderBytes, "Maximum size of request header")
Expand Down
21 changes: 20 additions & 1 deletion cmd/serve/httplib/httplib.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"log"
"net"
"net/http"
"os"
"strings"
"time"

Expand Down Expand Up @@ -112,6 +113,7 @@ certificate authority certificate.

// Options contains options for the http Server
type Options struct {
Network string // Listener network - tcp/unix
ListenAddr string // Port to listen on
BaseURL string // prefix to strip from URLs
ServerReadTimeout time.Duration // Timeout for server reading data
Expand All @@ -136,6 +138,7 @@ type AuthFn func(user, pass string) (value interface{}, err error)

// DefaultOpt is the default values used for Options
var DefaultOpt = Options{
Network: "tcp",
ListenAddr: "localhost:8080",
Realm: "rclone",
ServerReadTimeout: 1 * time.Hour,
Expand Down Expand Up @@ -319,13 +322,25 @@ func NewServer(handler http.Handler, opt *Options) *Server {
// the listener was not started; does not block, so
// use s.Wait() to block on the listener indefinitely.
func (s *Server) Serve() error {
ln, err := net.Listen("tcp", s.httpServer.Addr)
ln, err := net.Listen(s.Opt.Network, s.Opt.ListenAddr)
if err != nil {
return fmt.Errorf("start server failed: %w", err)
}
s.listener = ln
s.waitChan = make(chan struct{})
go func() {
defer func() {
fmt.Println("HELLO?", s.Opt.Network)

This comment has been minimized.

Copy link
@devnode

devnode Oct 20, 2022

Author Owner

trying to figure out what gets called on SIGINT, currently not executing

This comment has been minimized.

Copy link
@ncw

ncw Oct 20, 2022

You want to use the lib/atexit module if you want to be reasonably sure something runs on exit.

if s.Opt.Network != "unix" {
return
}

err := os.Remove(s.Opt.ListenAddr)
if err != nil {
log.Printf("Error on closing HTTP server: %v", err)
return
}
}()
var err error
if s.useSSL {
// hacky hack to get this to work with old Go versions, which
Expand Down Expand Up @@ -375,6 +390,10 @@ func (s *Server) Close() {

// URL returns the serving address of this server
func (s *Server) URL() string {
if s.Opt.Network == "unix" {
return fmt.Sprintf("unix:%s", s.Opt.ListenAddr)
}

proto := "http"
if s.useSSL {
proto = "https"
Expand Down
32 changes: 17 additions & 15 deletions fs/rc/rcserver/rcserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,22 +191,24 @@ func (s *Server) handler(w http.ResponseWriter, r *http.Request) {
}
path := strings.TrimLeft(urlPath, "/")

allowOrigin := rcflags.Opt.AccessControlAllowOrigin
if allowOrigin != "" {
onlyOnceWarningAllowOrigin.Do(func() {
if allowOrigin == "*" {
fs.Logf(nil, "Warning: Allow origin set to *. This can cause serious security problems.")
}
})
w.Header().Add("Access-Control-Allow-Origin", allowOrigin)
} else {
w.Header().Add("Access-Control-Allow-Origin", s.URL())
}
if s.Opt.Network == "tcp" {
allowOrigin := rcflags.Opt.AccessControlAllowOrigin
if allowOrigin != "" {
onlyOnceWarningAllowOrigin.Do(func() {
if allowOrigin == "*" {
fs.Logf(nil, "Warning: Allow origin set to *. This can cause serious security problems.")
}
})
w.Header().Add("Access-Control-Allow-Origin", allowOrigin)
} else {
w.Header().Add("Access-Control-Allow-Origin", s.URL())
}

// echo back access control headers client needs
//reqAccessHeaders := r.Header.Get("Access-Control-Request-Headers")
w.Header().Add("Access-Control-Request-Method", "POST, OPTIONS, GET, HEAD")
w.Header().Add("Access-Control-Allow-Headers", "authorization, Content-Type")
// echo back access control headers client needs
//reqAccessHeaders := r.Header.Get("Access-Control-Request-Headers")
w.Header().Add("Access-Control-Request-Method", "POST, OPTIONS, GET, HEAD")
w.Header().Add("Access-Control-Allow-Headers", "authorization, Content-Type")
}

switch r.Method {
case "POST":
Expand Down

0 comments on commit c8a1d07

Please sign in to comment.