diff --git a/httplib.h b/httplib.h
index 9199afd..fdcbed1 100644
--- a/httplib.h
+++ b/httplib.h
@@ -2842,7 +2842,6 @@ public:
         if (pattern.size() > buf_.size()) { return true; }
         auto pos = buf_.find(pattern);
         if (pos != 0) {
-          is_done_ = true;
           return false;
         }
         buf_.erase(0, pattern.size());
@@ -2862,7 +2861,6 @@ public:
           if (pos == 0) {
             if (!header_callback(file_)) {
               is_valid_ = false;
-              is_done_ = false;
               return false;
             }
             buf_.erase(0, crlf_.size());
@@ -2886,7 +2884,7 @@ public:
           off_ += pos + crlf_.size();
           pos = buf_.find(crlf_);
         }
-        break;
+        if (state_ != 3) { return true; }
       }
       case 3: { // Body
         {
@@ -2894,10 +2892,17 @@ public:
           if (pattern.size() > buf_.size()) { return true; }
 
           auto pos = buf_.find(pattern);
-          if (pos == std::string::npos) { pos = buf_.size(); }
+          if (pos == std::string::npos) {
+            pos = buf_.size();
+            while (pos > 0) {
+              auto c = buf_[pos - 1];
+              if (c != '\r' && c != '\n' && c != '-') { break; }
+              pos--;
+            }
+          }
+
           if (!content_callback(buf_.data(), pos)) {
             is_valid_ = false;
-            is_done_ = false;
             return false;
           }
 
@@ -2913,7 +2918,6 @@ public:
           if (pos != std::string::npos) {
             if (!content_callback(buf_.data(), pos)) {
               is_valid_ = false;
-              is_done_ = false;
               return false;
             }
 
@@ -2923,7 +2927,6 @@ public:
           } else {
             if (!content_callback(buf_.data(), pattern.size())) {
               is_valid_ = false;
-              is_done_ = false;
               return false;
             }
 
@@ -2948,7 +2951,6 @@ public:
             is_valid_ = true;
             state_ = 5;
           } else {
-            is_done_ = true;
             return true;
           }
         }
@@ -2976,7 +2978,6 @@ private:
   std::string buf_;
   size_t state_ = 0;
   bool is_valid_ = false;
-  bool is_done_ = false;
   size_t off_ = 0;
   MultipartFormData file_;
 };
@@ -3978,6 +3979,17 @@ inline bool Server::read_content_core(Stream &strm, Request &req, Response &res,
 
     multipart_form_data_parser.set_boundary(std::move(boundary));
     out = [&](const char *buf, size_t n) {
+      /* For debug
+      size_t pos = 0;
+      while (pos < n) {
+        auto read_size = std::min<size_t>(1, n - pos);
+        auto ret = multipart_form_data_parser.parse(
+            buf + pos, read_size, multipart_receiver, mulitpart_header);
+        if (!ret) { return false; }
+        pos += read_size;
+      }
+      return true;
+      */
       return multipart_form_data_parser.parse(buf, n, multipart_receiver,
                                               mulitpart_header);
     };