Merge pull request #216 from pkg/issue214/empty-file

respect create flag in open packet
diff --git a/request-server.go b/request-server.go
index 7a9f608..67d57f8 100644
--- a/request-server.go
+++ b/request-server.go
@@ -152,7 +152,12 @@
 		case *sshFxpRealpathPacket:
 			rpkt = cleanPacketPath(pkt)
 		case isOpener:
-			handle := rs.nextRequest(requestFromPacket(pkt))
+			request := requestFromPacket(pkt)
+			handle := rs.nextRequest(request)
+			p, ok := pkt.(*sshFxpOpenPacket)
+			if ok && p.hasPflags(ssh_FXF_CREAT) {
+				request.call(rs.Handlers, pkt)
+			}
 			rpkt = sshFxpHandlePacket{pkt.id(), handle}
 		case *sshFxpFstatPacket:
 			handle := pkt.getHandle()
diff --git a/request-server_test.go b/request-server_test.go
index 225dcf8..074e3f4 100644
--- a/request-server_test.go
+++ b/request-server_test.go
@@ -127,6 +127,20 @@
 	assert.Equal(t, f.content, []byte("hello"))
 }
 
+func TestRequestWriteEmpty(t *testing.T) {
+	p := clientRequestServerPair(t)
+	defer p.Close()
+	n, err := putTestFile(p.cli, "/foo", "")
+	assert.Nil(t, err)
+	assert.Equal(t, 0, n)
+	r := p.testHandler()
+	f, err := r.fetch("/foo")
+	if assert.Nil(t, err) {
+		assert.False(t, f.isdir)
+		assert.Equal(t, f.content, []byte(""))
+	}
+}
+
 // needs fail check
 func TestRequestFilename(t *testing.T) {
 	p := clientRequestServerPair(t)
diff --git a/request.go b/request.go
index 57b50ec..13f5382 100644
--- a/request.go
+++ b/request.go
@@ -135,7 +135,7 @@
 	switch r.Method {
 	case "Get":
 		return fileget(handlers.FileGet, r, pd)
-	case "Put": // add "Append" to this to handle append only file writes
+	case "Put", "Open": // add "Append" to handle append only file writes
 		return fileput(handlers.FilePut, r, pd)
 	case "Setstat", "Rename", "Rmdir", "Mkdir", "Symlink", "Remove":
 		return filecmd(handlers.FileCmd, r, pd)