[ARVADOS] updated: 1.1.0-172-g95ec747

Git user git at public.curoverse.com
Mon Nov 27 13:17:18 EST 2017


Summary of changes:
 build/run-tests.sh                |  1 +
 sdk/go/arvados/error.go           |  8 ++++----
 services/keep-web/cadaver_test.go | 11 +++++++++++
 services/keep-web/handler.go      | 16 ++++++++++------
 services/keep-web/webdav.go       | 23 ++++++++++++++++++++---
 5 files changed, 46 insertions(+), 13 deletions(-)

       via  95ec747218f048e5bbfb986ff4eaeba2d3d2f80b (commit)
       via  31f796ae50a95b7e5799095e4eaebc66968847df (commit)
       via  b1280706e42852ad3f7cac4dd4c64896837ead38 (commit)
      from  2fcbfc106c807aa17d2f73ce40fe2a64ed4c5b13 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit 95ec747218f048e5bbfb986ff4eaeba2d3d2f80b
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Mon Nov 27 13:12:53 2017 -0500

    12483: Error 405 if writing to PDH, 403 if lacking write permission.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/services/keep-web/cadaver_test.go b/services/keep-web/cadaver_test.go
index 02bdf7e..52d30b0 100644
--- a/services/keep-web/cadaver_test.go
+++ b/services/keep-web/cadaver_test.go
@@ -11,6 +11,7 @@ import (
 	"net/url"
 	"os"
 	"os/exec"
+	"strings"
 
 	"git.curoverse.com/arvados.git/sdk/go/arvados"
 	"git.curoverse.com/arvados.git/sdk/go/arvadostest"
@@ -156,6 +157,16 @@ func (s *IntegrationSuite) TestWebdavWithCadaver(c *check.C) {
 			cmd:   "get newdir2/testfile2 '" + checkfile.Name() + "'\n",
 			match: `(?ms).*Downloading .* failed.*`,
 		},
+		{
+			path:  "/c=" + arvadostest.UserAgreementCollection + "/t=" + arv.AuthToken + "/",
+			cmd:   "put '" + localfile.Name() + "' foo\n",
+			match: `(?ms).*Uploading .* failed:.*403 Forbidden.*`,
+		},
+		{
+			path:  "/c=" + strings.Replace(arvadostest.FooAndBarFilesInDirPDH, "+", "-", -1) + "/t=" + arv.AuthToken + "/",
+			cmd:   "put '" + localfile.Name() + "' foo\n",
+			match: `(?ms).*Uploading .* failed:.*405 Method Not Allowed.*`,
+		},
 	} {
 		c.Logf("%s %+v", "http://"+s.testServer.Addr, trial)
 
diff --git a/services/keep-web/handler.go b/services/keep-web/handler.go
index 576ecdb..c9148a5 100644
--- a/services/keep-web/handler.go
+++ b/services/keep-web/handler.go
@@ -10,6 +10,7 @@ import (
 	"html"
 	"html/template"
 	"io"
+	"log"
 	"net/http"
 	"net/url"
 	"os"
@@ -123,7 +124,12 @@ func (uos *updateOnSuccess) WriteHeader(code int) {
 		uos.sentHeader = true
 		if code >= 200 && code < 400 {
 			if uos.err = uos.update(); uos.err != nil {
-				http.Error(uos.ResponseWriter, uos.err.Error(), http.StatusInternalServerError)
+				code := http.StatusInternalServerError
+				if err, ok := uos.err.(*arvados.TransactionError); ok {
+					code = err.StatusCode
+				}
+				log.Printf("update() changes response to HTTP %d: %T %q", code, uos.err, uos.err)
+				http.Error(uos.ResponseWriter, uos.err.Error(), code)
 				return
 			}
 		}
@@ -414,7 +420,7 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
 		if writing {
 			// Save the collection only if/when all
 			// webdav->filesystem operations succeed --
-			// and send a 500 error the modified
+			// and send a 500 error if the modified
 			// collection can't be saved.
 			w = &updateOnSuccess{
 				ResponseWriter: w,
@@ -430,10 +436,8 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
 			},
 			LockSystem: h.webdavLS,
 			Logger: func(_ *http.Request, err error) {
-				if os.IsNotExist(err) {
-					statusCode, statusText = http.StatusNotFound, err.Error()
-				} else if err != nil {
-					statusCode, statusText = http.StatusInternalServerError, err.Error()
+				if err != nil {
+					log.Printf("error from webdav handler: %q", err)
 				}
 			},
 		}
diff --git a/services/keep-web/webdav.go b/services/keep-web/webdav.go
index 3e12f27..3ceb0ed 100644
--- a/services/keep-web/webdav.go
+++ b/services/keep-web/webdav.go
@@ -61,12 +61,16 @@ func (fs *webdavFS) Mkdir(ctx context.Context, name string, perm os.FileMode) er
 func (fs *webdavFS) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (f webdav.File, err error) {
 	writing := flag&(os.O_WRONLY|os.O_RDWR) != 0
 	if writing {
-		if !fs.writing {
-			return nil, errReadOnly
-		}
 		fs.makeparents(name)
 	}
 	f, err = fs.collfs.OpenFile(name, flag, perm)
+	if !fs.writing {
+		// webdav module returns 404 on all OpenFile errors,
+		// but returns 405 Method Not Allowed if OpenFile()
+		// succeeds but Write() or Close() fails. We'd rather
+		// have 405.
+		f = writeFailer{File: f, err: errReadOnly}
+	}
 	return
 }
 
@@ -89,6 +93,19 @@ func (fs *webdavFS) Stat(ctx context.Context, name string) (os.FileInfo, error)
 	return fs.collfs.Stat(name)
 }
 
+type writeFailer struct {
+	webdav.File
+	err error
+}
+
+func (wf writeFailer) Write([]byte) (int, error) {
+	return 0, wf.err
+}
+
+func (wf writeFailer) Close() error {
+	return wf.err
+}
+
 // noLockSystem implements webdav.LockSystem by returning success for
 // every possible locking operation, even though it has no side
 // effects such as actually locking anything. This works for a

commit 31f796ae50a95b7e5799095e4eaebc66968847df
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Mon Nov 27 13:10:51 2017 -0500

    12483: Fix loading error details from API error response.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/sdk/go/arvados/error.go b/sdk/go/arvados/error.go
index 773a2e6..9a04855 100644
--- a/sdk/go/arvados/error.go
+++ b/sdk/go/arvados/error.go
@@ -17,7 +17,7 @@ type TransactionError struct {
 	URL        url.URL
 	StatusCode int
 	Status     string
-	errors     []string
+	Errors     []string
 }
 
 func (e TransactionError) Error() (s string) {
@@ -25,8 +25,8 @@ func (e TransactionError) Error() (s string) {
 	if e.Status != "" {
 		s = s + ": " + e.Status
 	}
-	if len(e.errors) > 0 {
-		s = s + ": " + strings.Join(e.errors, "; ")
+	if len(e.Errors) > 0 {
+		s = s + ": " + strings.Join(e.Errors, "; ")
 	}
 	return
 }
@@ -35,7 +35,7 @@ func newTransactionError(req *http.Request, resp *http.Response, buf []byte) *Tr
 	var e TransactionError
 	if json.Unmarshal(buf, &e) != nil {
 		// No JSON-formatted error response
-		e.errors = nil
+		e.Errors = nil
 	}
 	e.Method = req.Method
 	e.URL = *req.URL

commit b1280706e42852ad3f7cac4dd4c64896837ead38
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Mon Nov 27 13:08:28 2017 -0500

    12483: Recover from errant empty dirs where GOPATH symlink goes.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/build/run-tests.sh b/build/run-tests.sh
index e1e83ed..43e601e 100755
--- a/build/run-tests.sh
+++ b/build/run-tests.sh
@@ -457,6 +457,7 @@ export PERLLIB="$PERLINSTALLBASE/lib/perl5:${PERLLIB:+$PERLLIB}"
 
 export GOPATH
 mkdir -p "$GOPATH/src/git.curoverse.com"
+rmdir --parents "$GOPATH/src/git.curoverse.com/arvados.git/tmp/GOPATH"
 ln -sfT "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
     || fatal "symlink failed"
 go get -v github.com/kardianos/govendor \

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list