diff --git a/src/ftp_server.cpp b/src/ftp_server.cpp
index c850057d5c84ece65f36629f36f636ce8fcab813..29eb628888bbbaf5c47c324afa0a12893d8877eb 100644
--- a/src/ftp_server.cpp
+++ b/src/ftp_server.cpp
@@ -70,6 +70,8 @@ FtpServer::startNewFile()
     if (!out_) {
         RING_DBG() << "[FTP] transfer aborted by client";
         closed_ = true; // send NOK msg at next read()
+    } else {
+        go_ = true;
     }
     return bool(out_);
 }
@@ -96,11 +98,12 @@ FtpServer::read(std::vector<uint8_t>& buffer) const
         } else {
             buffer.resize(0);
         }
-        return true;
+    } else if (go_) {
+        go_ = false;
+        buffer.resize(3);
+        buffer[0] = 'G'; buffer[1] = 'O'; buffer[2] = '\n';
+        RING_DBG() << "[FTP] sending GO order";
     }
-    buffer.resize(3);
-    buffer[0] = 'G'; buffer[1] = 'O'; buffer[2] = '\n';
-    RING_DBG() << "[FTP] sending GO order";
     return true;
 }
 
diff --git a/src/ftp_server.h b/src/ftp_server.h
index 081bdacfd0940d2e84f1351e53119d66ffbffcb7..deaf1e8baad766a9adf0ed3100744447ae36cfa2 100644
--- a/src/ftp_server.h
+++ b/src/ftp_server.h
@@ -60,6 +60,7 @@ private:
     std::string displayName_;
     std::array<char, 1000> line_;
     mutable bool closed_ {false};
+    mutable bool go_ {false};
     FtpState state_ {FtpState::PARSE_HEADERS};
 };