Browse Source

Removed is_writable() from DataSink (Resolve #1478, too) (#1483)

yhirose 2 years ago
parent
commit
d663588491
3 changed files with 24 additions and 31 deletions
  1. 1 1
      example/ssesvr.cc
  2. 23 21
      httplib.h
  3. 0 9
      test/test.cc

+ 1 - 1
example/ssesvr.cc

@@ -19,7 +19,7 @@ public:
     unique_lock<mutex> lk(m_);
     unique_lock<mutex> lk(m_);
     int id = id_;
     int id = id_;
     cv_.wait(lk, [&] { return cid_ == id; });
     cv_.wait(lk, [&] { return cid_ == id; });
-    if (sink->is_writable()) { sink->write(message_.data(), message_.size()); }
+    sink->write(message_.data(), message_.size());
   }
   }
 
 
   void send_event(const string &message) {
   void send_event(const string &message) {

+ 23 - 21
httplib.h

@@ -340,7 +340,6 @@ public:
 
 
   std::function<bool(const char *data, size_t data_len)> write;
   std::function<bool(const char *data, size_t data_len)> write;
   std::function<void()> done;
   std::function<void()> done;
-  std::function<bool()> is_writable;
   std::ostream os;
   std::ostream os;
 
 
 private:
 private:
@@ -3632,7 +3631,7 @@ inline bool write_content(Stream &strm, const ContentProvider &content_provider,
 
 
   data_sink.write = [&](const char *d, size_t l) -> bool {
   data_sink.write = [&](const char *d, size_t l) -> bool {
     if (ok) {
     if (ok) {
-      if (write_data(strm, d, l)) {
+      if (strm.is_writable() && write_data(strm, d, l)) {
         offset += l;
         offset += l;
       } else {
       } else {
         ok = false;
         ok = false;
@@ -3641,14 +3640,14 @@ inline bool write_content(Stream &strm, const ContentProvider &content_provider,
     return ok;
     return ok;
   };
   };
 
 
-  data_sink.is_writable = [&](void) { return ok && strm.is_writable(); };
-
   while (offset < end_offset && !is_shutting_down()) {
   while (offset < end_offset && !is_shutting_down()) {
-    if (!content_provider(offset, end_offset - offset, data_sink)) {
+    if (!strm.is_writable()) {
+      error = Error::Write;
+      return false;
+    } else if (!content_provider(offset, end_offset - offset, data_sink)) {
       error = Error::Canceled;
       error = Error::Canceled;
       return false;
       return false;
-    }
-    if (!ok) {
+    } else if (!ok) {
       error = Error::Write;
       error = Error::Write;
       return false;
       return false;
     }
     }
@@ -3680,18 +3679,21 @@ write_content_without_length(Stream &strm,
   data_sink.write = [&](const char *d, size_t l) -> bool {
   data_sink.write = [&](const char *d, size_t l) -> bool {
     if (ok) {
     if (ok) {
       offset += l;
       offset += l;
-      if (!write_data(strm, d, l)) { ok = false; }
+      if (!strm.is_writable() || !write_data(strm, d, l)) { ok = false; }
     }
     }
     return ok;
     return ok;
   };
   };
 
 
   data_sink.done = [&](void) { data_available = false; };
   data_sink.done = [&](void) { data_available = false; };
 
 
-  data_sink.is_writable = [&](void) { return ok && strm.is_writable(); };
-
   while (data_available && !is_shutting_down()) {
   while (data_available && !is_shutting_down()) {
-    if (!content_provider(offset, 0, data_sink)) { return false; }
-    if (!ok) { return false; }
+    if (!strm.is_writable()) {
+      return false;
+    } else if (!content_provider(offset, 0, data_sink)) {
+      return false;
+    } else if (!ok) {
+      return false;
+    }
   }
   }
   return true;
   return true;
 }
 }
@@ -3720,7 +3722,10 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
           // Emit chunked response header and footer for each chunk
           // Emit chunked response header and footer for each chunk
           auto chunk =
           auto chunk =
               from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n";
               from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n";
-          if (!write_data(strm, chunk.data(), chunk.size())) { ok = false; }
+          if (!strm.is_writable() ||
+              !write_data(strm, chunk.data(), chunk.size())) {
+            ok = false;
+          }
         }
         }
       } else {
       } else {
         ok = false;
         ok = false;
@@ -3759,14 +3764,14 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
     }
     }
   };
   };
 
 
-  data_sink.is_writable = [&](void) { return ok && strm.is_writable(); };
-
   while (data_available && !is_shutting_down()) {
   while (data_available && !is_shutting_down()) {
-    if (!content_provider(offset, 0, data_sink)) {
+    if (!strm.is_writable()) {
+      error = Error::Write;
+      return false;
+    } else if (!content_provider(offset, 0, data_sink)) {
       error = Error::Canceled;
       error = Error::Canceled;
       return false;
       return false;
-    }
-    if (!ok) {
+    } else if (!ok) {
       error = Error::Write;
       error = Error::Write;
       return false;
       return false;
     }
     }
@@ -6544,8 +6549,6 @@ inline std::unique_ptr<Response> ClientImpl::send_with_content_provider(
         return ok;
         return ok;
       };
       };
 
 
-      data_sink.is_writable = [&](void) { return ok && true; };
-
       while (ok && offset < content_length) {
       while (ok && offset < content_length) {
         if (!content_provider(offset, content_length - offset, data_sink)) {
         if (!content_provider(offset, content_length - offset, data_sink)) {
           error = Error::Canceled;
           error = Error::Canceled;
@@ -6717,7 +6720,6 @@ inline ContentProviderWithoutLength ClientImpl::get_multipart_content_provider(
       bool has_data = true;
       bool has_data = true;
       cur_sink.write = sink.write;
       cur_sink.write = sink.write;
       cur_sink.done = [&]() { has_data = false; };
       cur_sink.done = [&]() { has_data = false; };
-      cur_sink.is_writable = sink.is_writable;
 
 
       if (!provider_items[cur_item].provider(offset - cur_start, cur_sink))
       if (!provider_items[cur_item].provider(offset - cur_start, cur_sink))
         return false;
         return false;

+ 0 - 9
test/test.cc

@@ -1650,7 +1650,6 @@ protected:
              [&](const Request & /*req*/, Response &res) {
              [&](const Request & /*req*/, Response &res) {
                res.set_chunked_content_provider(
                res.set_chunked_content_provider(
                    "text/plain", [](size_t /*offset*/, DataSink &sink) {
                    "text/plain", [](size_t /*offset*/, DataSink &sink) {
-                     EXPECT_TRUE(sink.is_writable());
                      sink.os << "123";
                      sink.os << "123";
                      sink.os << "456";
                      sink.os << "456";
                      sink.os << "789";
                      sink.os << "789";
@@ -1664,7 +1663,6 @@ protected:
                res.set_chunked_content_provider(
                res.set_chunked_content_provider(
                    "text/plain",
                    "text/plain",
                    [i](size_t /*offset*/, DataSink &sink) {
                    [i](size_t /*offset*/, DataSink &sink) {
-                     EXPECT_TRUE(sink.is_writable());
                      switch (*i) {
                      switch (*i) {
                      case 0: sink.os << "123"; break;
                      case 0: sink.os << "123"; break;
                      case 1: sink.os << "456"; break;
                      case 1: sink.os << "456"; break;
@@ -1694,7 +1692,6 @@ protected:
                res.set_content_provider(
                res.set_content_provider(
                    data->size(), "text/plain",
                    data->size(), "text/plain",
                    [data](size_t offset, size_t length, DataSink &sink) {
                    [data](size_t offset, size_t length, DataSink &sink) {
-                     EXPECT_TRUE(sink.is_writable());
                      size_t DATA_CHUNK_SIZE = 4;
                      size_t DATA_CHUNK_SIZE = 4;
                      const auto &d = *data;
                      const auto &d = *data;
                      auto out_len =
                      auto out_len =
@@ -1714,8 +1711,6 @@ protected:
                res.set_content_provider(
                res.set_content_provider(
                    size_t(-1), "text/plain",
                    size_t(-1), "text/plain",
                    [](size_t /*offset*/, size_t /*length*/, DataSink &sink) {
                    [](size_t /*offset*/, size_t /*length*/, DataSink &sink) {
-                     if (!sink.is_writable()) return false;
-
                      sink.os << "data_chunk";
                      sink.os << "data_chunk";
                      return true;
                      return true;
                    });
                    });
@@ -2952,7 +2947,6 @@ TEST_F(ServerTest, PutWithContentProvider) {
   auto res = cli_.Put(
   auto res = cli_.Put(
       "/put", 3,
       "/put", 3,
       [](size_t /*offset*/, size_t /*length*/, DataSink &sink) {
       [](size_t /*offset*/, size_t /*length*/, DataSink &sink) {
-        EXPECT_TRUE(sink.is_writable());
         sink.os << "PUT";
         sink.os << "PUT";
         return true;
         return true;
       },
       },
@@ -2979,7 +2973,6 @@ TEST_F(ServerTest, PutWithContentProviderWithoutLength) {
   auto res = cli_.Put(
   auto res = cli_.Put(
       "/put",
       "/put",
       [](size_t /*offset*/, DataSink &sink) {
       [](size_t /*offset*/, DataSink &sink) {
-        EXPECT_TRUE(sink.is_writable());
         sink.os << "PUT";
         sink.os << "PUT";
         sink.done();
         sink.done();
         return true;
         return true;
@@ -3006,7 +2999,6 @@ TEST_F(ServerTest, PutWithContentProviderWithGzip) {
   auto res = cli_.Put(
   auto res = cli_.Put(
       "/put", 3,
       "/put", 3,
       [](size_t /*offset*/, size_t /*length*/, DataSink &sink) {
       [](size_t /*offset*/, size_t /*length*/, DataSink &sink) {
-        EXPECT_TRUE(sink.is_writable());
         sink.os << "PUT";
         sink.os << "PUT";
         return true;
         return true;
       },
       },
@@ -3035,7 +3027,6 @@ TEST_F(ServerTest, PutWithContentProviderWithoutLengthWithGzip) {
   auto res = cli_.Put(
   auto res = cli_.Put(
       "/put",
       "/put",
       [](size_t /*offset*/, DataSink &sink) {
       [](size_t /*offset*/, DataSink &sink) {
-        EXPECT_TRUE(sink.is_writable());
         sink.os << "PUT";
         sink.os << "PUT";
         sink.done();
         sink.done();
         return true;
         return true;