Commit 3c034056 authored by Mathieu Stefani's avatar Mathieu Stefani Committed by GitHub

Merge pull request #79 from jeffvandyke/master

Fixed the inability to serve static files greater than 140 KB
parents 00d065c3 3bc36c0a
......@@ -143,10 +143,11 @@ struct Buffer {
if (fromIndex > len)
throw std::invalid_argument("Invalid index (> len)");
char *newData = new char[len - fromIndex];
std::copy(data + fromIndex, data + len - fromIndex, newData);
size_t retainedLen = len - fromIndex;
char *newData = new char[retainedLen];
std::copy(data + fromIndex, data + len, newData);
return Buffer(newData, len, true);
return Buffer(newData, retainedLen, true);
}
const char* const data;
......
......@@ -87,23 +87,26 @@ private:
struct BufferHolder {
enum Type { Raw, File };
explicit BufferHolder(const Buffer& buffer)
explicit BufferHolder(const Buffer& buffer, off_t offset = 0)
: type(Raw)
, u(buffer)
{
offset_ = offset;
size_ = buffer.len;
}
explicit BufferHolder(const FileBuffer& buffer)
explicit BufferHolder(const FileBuffer& buffer, off_t offset = 0)
: type(File)
, u(buffer.fd())
{
offset_ = offset;
size_ = buffer.size();
}
bool isFile() const { return type == File; }
bool isRaw() const { return type == Raw; }
size_t size() const { return size_; }
size_t offset() const { return offset_; }
Fd fd() const {
if (!isFile())
......@@ -122,19 +125,20 @@ private:
BufferHolder detach(size_t offset = 0) const {
if (!isRaw())
return BufferHolder(u.fd, size_);
return BufferHolder(u.fd, size_, offset);
if (u.raw.isOwned)
return BufferHolder(u.raw);
return BufferHolder(u.raw, offset);
auto detached = u.raw.detach(offset);
return BufferHolder(detached);
}
private:
BufferHolder(Fd fd, size_t size)
BufferHolder(Fd fd, size_t size, off_t offset = 0)
: u(fd)
, size_(size)
, offset_(offset)
, type(File)
{ }
......@@ -145,7 +149,8 @@ private:
U(Buffer buffer) : raw(buffer) { }
U(Fd fd) : fd(fd) { }
} u;
size_t size_;
size_t size_= 0;
off_t offset_ = 0;
Type type;
};
......
......@@ -2,7 +2,7 @@
Mathieu Stefani, 02 July 2017
TCP transport handling
*/
#include <sys/sendfile.h>
......@@ -193,7 +193,7 @@ Transport::asyncWriteImpl(
toWrite.erase(fd);
};
ssize_t totalWritten = 0;
ssize_t totalWritten = buffer.offset();
for (;;) {
ssize_t bytesWritten = 0;
auto len = buffer.size() - totalWritten;
......@@ -208,12 +208,15 @@ Transport::asyncWriteImpl(
}
if (bytesWritten < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
if (status == FirstTry) {
toWrite.insert(
std::make_pair(fd,
WriteEntry(std::move(deferred), buffer.detach(totalWritten), flags)));
// save for a future retry with the totalWritten offset.
if (status == Retry) {
toWrite.erase(fd);
}
toWrite.insert(
std::make_pair(fd,
WriteEntry(std::move(deferred), buffer.detach(totalWritten), flags)));
reactor()->modifyFd(key(), fd, NotifyOn::Read | NotifyOn::Write, Polling::Mode::Edge);
}
else {
......@@ -224,7 +227,7 @@ Transport::asyncWriteImpl(
}
else {
totalWritten += bytesWritten;
if (totalWritten == len) {
if (totalWritten >= buffer.size()) {
cleanUp();
deferred.resolve(totalWritten);
break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment