]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5099] Implemented asyncSend variant without the 2-byte count.
authorMarcin Siodelski <marcin@isc.org>
Wed, 11 Jan 2017 11:15:01 +0000 (12:15 +0100)
committerMarcin Siodelski <marcin@isc.org>
Wed, 11 Jan 2017 11:15:01 +0000 (12:15 +0100)
src/lib/asiolink/tcp_socket.h
src/lib/http/connection.cc

index e47e2223184a5cb492eb9af96b00c78207f9badb..a97739ddef20cea3f34a179c59b7b838ff2f74e8 100644 (file)
@@ -113,6 +113,19 @@ public:
     virtual void asyncSend(const void* data, size_t length,
                            const IOEndpoint* endpoint, C& callback);
 
+    /// \brief Send Asynchronously without count.
+    ///
+    /// This variant of the method sends data over the TCP socket without
+    /// preceding the data with a data count. Eventually, we should migrate
+    /// the virtual method to not insert the count but there are existing
+    /// classes using the count. Once this migration is done, the existing
+    /// virtual method should be replaced by this method.
+    ///
+    /// \param data Data to send
+    /// \param length Length of data to send
+    /// \param callback Callback object.
+    void asyncSend(const void* data, size_t length, C& callback);
+
     /// \brief Receive Asynchronously
     ///
     /// Calls the underlying socket's async_receive() method to read a packet
@@ -248,6 +261,30 @@ TCPSocket<C>::open(const IOEndpoint* endpoint, C& callback) {
 // Send a message.  Should never do this if the socket is not open, so throw
 // an exception if this is the case.
 
+template <typename C> void
+TCPSocket<C>::asyncSend(const void* data, size_t length, C& callback)
+{
+    if (socket_.is_open()) {
+
+        try {
+            send_buffer_.reset(new isc::util::OutputBuffer(length));
+            send_buffer_->writeData(data, length);
+
+            // Send the data.
+            socket_.async_send(boost::asio::buffer(send_buffer_->getData(),
+                                                   send_buffer_->getLength()),
+                               callback);
+        } catch (boost::numeric::bad_numeric_cast&) {
+            isc_throw(BufferTooLarge,
+                      "attempt to send buffer larger than 64kB");
+        }
+
+    } else {
+        isc_throw(SocketNotOpen,
+            "attempt to send on a TCP socket that is not open");
+    }
+}
+
 template <typename C> void
 TCPSocket<C>::asyncSend(const void* data, size_t length,
     const IOEndpoint*, C& callback)
@@ -262,7 +299,8 @@ TCPSocket<C>::asyncSend(const void* data, size_t length,
             uint16_t count = boost::numeric_cast<uint16_t>(length);
 
             // Copy data into a buffer preceded by the count field.
-            send_buffer_.reset(new isc::util::OutputBuffer(length));
+            send_buffer_.reset(new isc::util::OutputBuffer(length + 2));
+            send_buffer_->writeUint16(count);
             send_buffer_->writeData(data, length);
 
             // ... and send it
index 3fca6d9954c528bbea9457335523a0f5755719fe..7aebb1de3bb1e6aec288f68776273ee2fa401225 100644 (file)
@@ -67,9 +67,8 @@ HttpConnection::doRead() {
 void
 HttpConnection::doWrite() {
     if (!output_buf_.empty()) {
-        TCPEndpoint endpoint;
         socket_.asyncSend(output_buf_.data(),
-                          output_buf_.length(), &endpoint,
+                          output_buf_.length(),
                           socket_write_callback_);
     }
 }