Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions src/core/cowbytearray.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ class CowByteArray {
CowByteArray(const char *data, ssize_t size = -1) : inner_(data, size) {}
CowByteArray(ssize_t size, char ch) : inner_(size, ch) {}
CowByteArray(const QByteArray &other) : inner_(other) {}

CowByteArray &operator=(const CowByteArray &other) {
inner_ = other.inner_;
return *this;
Expand All @@ -93,7 +94,9 @@ class CowByteArray {
ssize_t length() const { return size(); }
const char *data() const { return inner_.data(); }
char *data() { return inner_.data(); }
const char *constData() const { return inner_.constData(); }

bool contains(char ch) const { return inner_.contains(ch); }
ssize_t indexOf(char ch, ssize_t from = 0) const { return inner_.indexOf(ch, from); }
CowByteArray mid(ssize_t pos, ssize_t len = -1) const { return inner_.mid(pos, len); }
CowByteArray trimmed() const { return inner_.trimmed(); }
Expand All @@ -103,19 +106,27 @@ class CowByteArray {

char operator[](ssize_t i) const { return inner_[(qsizetype)i]; }
char &operator[](ssize_t i) { return inner_[(qsizetype)i]; }

CowByteArray &operator+=(const CowByteArray &other) {
inner_ += other.inner_;
return *this;
}

CowByteArray &operator+=(char ch) {
inner_ += ch;
return *this;
}

CowByteArray &operator+=(const char *str) {
inner_ += str;
return *this;
}

CowByteArray &operator+=(const QByteArray &other) {
inner_ += other;
return *this;
}

const QByteArray &asQByteArray() const { return inner_; }

friend CowByteArray operator+(const CowByteArray &lhs, const CowByteArray &rhs);
Expand All @@ -141,26 +152,32 @@ class CowByteArray {
inline CowByteArray operator+(const CowByteArray &lhs, const CowByteArray &rhs) {
return lhs.inner_ + rhs.inner_;
}

inline CowByteArray operator+(const CowByteArray &lhs, const char *rhs) { return lhs.inner_ + rhs; }
inline CowByteArray operator+(const char *lhs, const CowByteArray &rhs) { return lhs + rhs.inner_; }
inline CowByteArray operator+(const CowByteArray &lhs, char rhs) { return lhs.inner_ + rhs; }
inline CowByteArray operator+(char lhs, const CowByteArray &rhs) { return lhs + rhs.inner_; }

inline CowByteArray operator+(const CowByteArray &lhs, const QByteArray &rhs) {
return lhs.inner_ + rhs;
}

inline CowByteArray operator+(const QByteArray &lhs, const CowByteArray &rhs) {
return lhs + rhs.inner_;
}

inline bool operator==(const CowByteArray &lhs, const CowByteArray &rhs) {
return lhs.inner_ == rhs.inner_;
}

inline bool operator==(const CowByteArray &lhs, const char *const &rhs) {
return lhs.inner_ == rhs;
}

inline bool operator==(const char *const &lhs, const CowByteArray &rhs) {
return lhs == rhs.inner_;
}

inline bool operator==(const CowByteArray &lhs, const QByteArray &rhs) { return lhs.inner_ == rhs; }
inline bool operator==(const QByteArray &lhs, const CowByteArray &rhs) { return lhs == rhs.inner_; }
inline bool operator!=(const CowByteArray &lhs, const CowByteArray &rhs) { return !(lhs == rhs); }
Expand All @@ -181,6 +198,7 @@ inline CowByteArrayRef &CowByteArrayRef::operator=(const CowByteArray &other) {
inner_ = other.inner_;
return *this;
}

inline CowByteArray CowByteArrayRef::mid(ssize_t pos, ssize_t len) const {
return inner_.mid(pos, len);
}
Expand All @@ -206,6 +224,7 @@ class CowByteArrayList {
inline bool operator==(const iterator &other) const noexcept {
return inner_ == other.inner_;
}

inline bool operator!=(const iterator &other) const noexcept {
return !(inner_ == other.inner_);
}
Expand Down Expand Up @@ -234,6 +253,7 @@ class CowByteArrayList {
inline bool operator==(const const_iterator &other) const noexcept {
return inner_ == other.inner_;
}

inline bool operator!=(const const_iterator &other) const noexcept {
return !(inner_ == other.inner_);
}
Expand Down Expand Up @@ -263,14 +283,17 @@ class CowByteArrayList {
inner_ += other.asQByteArrayList();
return *this;
}

CowByteArrayList &operator+=(const CowByteArray &a) {
inner_ += a.asQByteArray();
return *this;
}

CowByteArrayList &operator+=(const QByteArray &a) {
inner_ += a;
return *this;
}

CowByteArrayList &operator+=(const char *str) {
inner_ += str;
return *this;
Expand All @@ -279,6 +302,7 @@ class CowByteArrayList {
CowByteArrayConstRef operator[](ssize_t index) const {
return CowByteArrayConstRef(inner_[index]);
}

CowByteArrayRef operator[](ssize_t index) { return CowByteArrayRef(inner_[index]); }

const QList<QByteArray> &asQByteArrayList() const { return inner_; }
Expand Down
6 changes: 3 additions & 3 deletions src/core/readwrite.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#ifndef READWRITE_H
#define READWRITE_H

#include <QByteArray>
#include "cowbytearray.h"
#include <boost/signals2.hpp>

class ReadWrite {
Expand All @@ -26,10 +26,10 @@ class ReadWrite {

// Size < 0 means default read size returns buffer of bytes read. Null buffer means error. Empty
// means end
virtual QByteArray read(int size = -1) = 0;
virtual CowByteArray read(int size = -1) = 0;

// Returns amount accepted, or -1 for error
virtual int write(const QByteArray &buf) = 0;
virtual int write(const CowByteArray &buf) = 0;

// Returns errno of latest operation
virtual int errorCondition() const = 0;
Expand Down
34 changes: 17 additions & 17 deletions src/core/simplehttpserver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,13 @@ class SimpleHttpRequest::Private {
SimpleHttpRequest *q;
std::unique_ptr<ReadWrite> stream;
State state;
QByteArray inBuf;
CowByteArray inBuf;
QByteArray outBuf;
bool version1dot0;
QString method;
QByteArray uri;
CowByteArray uri;
HttpHeaders reqHeaders;
QByteArray reqBody;
CowByteArray reqBody;
int contentLength;
int headersSizeMax;
int bodySizeMax;
Expand Down Expand Up @@ -131,11 +131,11 @@ class SimpleHttpRequest::Private {

void respondLengthRequired(const QString &body) { respondError(411, "Length Required", body); }

bool processHeaderData(const QByteArray &headerData) {
QList<QByteArray> lines;
bool processHeaderData(const CowByteArray &headerData) {
QList<CowByteArray> lines;
int at = 0;
while (at < headerData.size()) {
int end = headerData.indexOf("\n", at);
int end = headerData.indexOf('\n', at);
assert(end != -1);

if (end > at && headerData[end - 1] == '\r')
Expand All @@ -148,13 +148,13 @@ class SimpleHttpRequest::Private {
if (lines.isEmpty())
return false;

QByteArray requestLine = lines[0];
CowByteArray requestLine = lines[0];

at = requestLine.indexOf(' ');
if (at == -1)
return false;

method = QString::fromLatin1(requestLine.mid(0, at));
method = QString::fromLatin1(requestLine.mid(0, at).asQByteArray());
if (method.isEmpty())
return false;

Expand All @@ -165,12 +165,12 @@ class SimpleHttpRequest::Private {

uri = requestLine.mid(at, end - at);

QByteArray versionStr = requestLine.mid(end + 1);
CowByteArray versionStr = requestLine.mid(end + 1);
if (versionStr == "HTTP/1.0")
version1dot0 = true;

for (int n = 1; n < lines.count(); ++n) {
const QByteArray &line = lines[n];
const CowByteArray &line = lines[n];
end = line.indexOf(':');
if (end == -1)
continue;
Expand All @@ -180,8 +180,8 @@ class SimpleHttpRequest::Private {
if (at < line.length() && line[at] == ' ')
++at;

QByteArray name = line.mid(0, end);
QByteArray val = line.mid(at);
CowByteArray name = line.mid(0, end);
CowByteArray val = line.mid(at);

reqHeaders += HttpHeader(name, val);
}
Expand All @@ -205,7 +205,7 @@ class SimpleHttpRequest::Private {
// Return false if more I/O needed to make progress
bool step() {
if (state == ReadHeader) {
QByteArray buf = stream->read(headersSizeMax - inBuf.size());
CowByteArray buf = stream->read(headersSizeMax - inBuf.size());

if (buf.isNull()) {
int e = stream->errorCondition();
Expand Down Expand Up @@ -239,7 +239,7 @@ class SimpleHttpRequest::Private {
}

if (at != -1) {
QByteArray headerData = inBuf.mid(0, at);
CowByteArray headerData = inBuf.mid(0, at);
reqBody = inBuf.mid(next);
inBuf.clear();

Expand Down Expand Up @@ -310,7 +310,7 @@ class SimpleHttpRequest::Private {
}

if (reqBody.size() < contentLength) {
QByteArray buf = stream->read(bodySizeMax - reqBody.size() + 1);
CowByteArray buf = stream->read(bodySizeMax - reqBody.size() + 1);

if (buf.isNull()) {
int e = stream->errorCondition();
Expand Down Expand Up @@ -384,11 +384,11 @@ SimpleHttpRequest::~SimpleHttpRequest() { delete d; }

QString SimpleHttpRequest::requestMethod() const { return d->method; }

QByteArray SimpleHttpRequest::requestUri() const { return d->uri; }
QByteArray SimpleHttpRequest::requestUri() const { return d->uri.asQByteArray(); }

HttpHeaders SimpleHttpRequest::requestHeaders() const { return d->reqHeaders; }

QByteArray SimpleHttpRequest::requestBody() const { return d->reqBody; }
QByteArray SimpleHttpRequest::requestBody() const { return d->reqBody.asQByteArray(); }

void SimpleHttpRequest::respond(int code, const QByteArray &reason, const HttpHeaders &headers,
const QByteArray &body) {
Expand Down
8 changes: 4 additions & 4 deletions src/core/tcpstream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,13 @@ bool TcpStream::checkConnected() {
return true;
}

QByteArray TcpStream::read(int size) {
CowByteArray TcpStream::read(int size) {
assert(inner_);

if (size < 0)
size = DEFAULT_READ_SIZE;

QByteArray buf(size, 0);
CowByteArray buf(size, 0);
errorCondition_ = 0;

int ret = ffi::tcp_stream_read(inner_, (uint8_t *)buf.data(), buf.size(), &errorCondition_);
Expand All @@ -74,15 +74,15 @@ QByteArray TcpStream::read(int size) {
if (errorCondition_ == EAGAIN)
sn_->clearReadiness(SocketNotifier::Read);

return QByteArray();
return CowByteArray();
}

buf.resize(ret);

return buf;
}

int TcpStream::write(const QByteArray &buf) {
int TcpStream::write(const CowByteArray &buf) {
assert(inner_);

errorCondition_ = 0;
Expand Down
5 changes: 2 additions & 3 deletions src/core/tcpstream.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

#include "readwrite.h"
#include "rust/bindings.h"
#include <QByteArray>
#include <boost/signals2.hpp>
#include <memory>
#include <variant>
Expand All @@ -45,8 +44,8 @@ class TcpStream : public ReadWrite {
bool checkConnected();

// Reimplemented
virtual QByteArray read(int size = -1);
virtual int write(const QByteArray &buf);
virtual CowByteArray read(int size = -1);
virtual int write(const CowByteArray &buf);
virtual int errorCondition() const { return errorCondition_; }

private:
Expand Down
12 changes: 6 additions & 6 deletions src/core/tcpstreamtest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,9 @@ static void runIo(std::function<void()> loop_wait) {

TEST_ASSERT_EQ(client.write("hello\n"), 6);

QByteArray received;
CowByteArray received;
while (!received.contains('\n')) {
QByteArray buf = s->read();
CowByteArray buf = s->read();

if (buf.isNull()) {
TEST_ASSERT_EQ(s->errorCondition(), EAGAIN);
Expand All @@ -147,7 +147,7 @@ static void runIo(std::function<void()> loop_wait) {

TEST_ASSERT_EQ(received, "hello\n");

QByteArray written;
CowByteArray written;
received.clear();

// Write until we fill the system buffer
Expand All @@ -166,7 +166,7 @@ static void runIo(std::function<void()> loop_wait) {

// Wait for some bytes on the client side
while (received.isEmpty()) {
QByteArray buf = client.read(100000);
CowByteArray buf = client.read(100000);

if (buf.isNull()) {
TEST_ASSERT_EQ(client.errorCondition(), EAGAIN);
Expand All @@ -184,7 +184,7 @@ static void runIo(std::function<void()> loop_wait) {
// Now read as much as possible on the client side. This helps the server side gain writability
// sooner
while (true) {
QByteArray buf = client.read(100000);
CowByteArray buf = client.read(100000);

if (buf.isNull()) {
TEST_ASSERT_EQ(client.errorCondition(), EAGAIN);
Expand Down Expand Up @@ -213,7 +213,7 @@ static void runIo(std::function<void()> loop_wait) {

// Read until closed on the client side
while (true) {
QByteArray buf = client.read(100000);
CowByteArray buf = client.read(100000);

if (buf.isNull()) {
TEST_ASSERT_EQ(client.errorCondition(), EAGAIN);
Expand Down
Loading
Loading