buidlet, gomote: implement put single file

Change-Id: I2b1decc2907edde7a52a4eb3584c327a7a233fa7
Reviewed-on: https://go-review.googlesource.com/4360
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/buildlet/buildletclient.go b/buildlet/buildletclient.go
index adcb475..1f88078 100644
--- a/buildlet/buildletclient.go
+++ b/buildlet/buildletclient.go
@@ -15,6 +15,7 @@
 	"net"
 	"net/http"
 	"net/url"
+	"os"
 	"strings"
 	"time"
 
@@ -117,6 +118,19 @@
 	return c.doOK(req)
 }
 
+// Put writes the provided file to path (relative to workdir) and sets mode.
+func (c *Client) Put(r io.Reader, path string, mode os.FileMode) error {
+	param := url.Values{
+		"path": {path},
+		"mode": {fmt.Sprint(int64(mode))},
+	}
+	req, err := http.NewRequest("PUT", c.URL()+"/write?"+param.Encode(), r)
+	if err != nil {
+		return err
+	}
+	return c.doOK(req)
+}
+
 // GetTar returns a .tar.gz stream of the given directory, relative to the buildlet's work dir.
 // The provided dir may be empty to get everything.
 func (c *Client) GetTar(dir string) (tgz io.ReadCloser, err error) {