Unverified Commit 2ab2b548 authored by Dennis Jenkins's avatar Dennis Jenkins Committed by GitHub

Merge pull request #436 from knowledge4igor/start_server_buffers_refactoring

Start server buffers refactoring - Part 1
parents 2fdbe570 121a52d3
......@@ -6,6 +6,8 @@
#pragma once
#include <pistache/os.h>
#include <cstddef>
#include <stdexcept>
#include <cstring>
......@@ -15,7 +17,6 @@
#include <iostream>
#include <string>
#include <pistache/os.h>
namespace Pistache {
......@@ -121,33 +122,17 @@ private:
template<typename CharT>
size_t ArrayStreamBuf<CharT>::maxSize = Const::DefaultMaxPayload;
struct Buffer {
Buffer() : data(nullptr), length(0), isDetached(false) {}
Buffer(std::shared_ptr<char> _data, int _length, bool _isDetached = false) : data(_data), length(_length), isDetached(_isDetached) {}
Buffer(const char * _data, int _length, bool _isDetached = false) : data(nullptr), length(_length), isDetached(_isDetached) {
data = std::shared_ptr<char>(new char[_length+1](), std::default_delete<char[]>());
std::copy(_data, _data + _length + 1, data.get());
}
Buffer detach(int fromIndex){
struct Buffer
{
Buffer();
Buffer(std::string data, int length, bool isDetached = false);
Buffer(const char * data, int length, bool isDetached = false);
if (!data) Buffer();
if (length < fromIndex)
throw std::range_error("Trying to detach buffer from an index bigger than lengthght.");
Buffer detach(size_t fromIndex);
auto newDatalength = length - fromIndex;
auto newData = std::shared_ptr<char>(new char[newDatalength + 1](), std::default_delete<char[]>());
std::copy(data.get() + fromIndex, data.get() + length, newData.get());
return Buffer(newData, newDatalength, true);
}
std::shared_ptr<char> data;
int length;
std::string data;
size_t length;
int isDetached;
};
struct FileBuffer {
......
......@@ -3,6 +3,8 @@
*/
#include <pistache/stream.h>
#include <iostream>
#include <algorithm>
#include <string>
......@@ -12,10 +14,43 @@
#include <unistd.h>
#include <fcntl.h>
#include <pistache/stream.h>
namespace Pistache {
Buffer::Buffer()
: data()
, length(0)
, isDetached(false)
{ }
Buffer::Buffer(std::string data, int length, bool isDetached)
: data(std::move(data))
, length(length)
, isDetached(isDetached)
{ }
Buffer::Buffer(const char* data, int length, bool isDetached)
: data()
, length(length)
, isDetached(isDetached)
{
this->data.resize(length + 1);
this->data.assign(data, length + 1);
}
Buffer Buffer::detach(size_t fromIndex)
{
if (data.empty())
return Buffer();
if (length < fromIndex)
throw std::range_error("Trying to detach buffer from an index bigger than lengthght.");
auto newDatalength = length - fromIndex;
std::string newData = data.substr(fromIndex, newDatalength);
return Buffer(std::move(newData), newDatalength, true);
}
FileBuffer::FileBuffer(const std::string& fileName)
: fileName_(fileName)
......
......@@ -237,7 +237,7 @@ Transport::asyncWriteImpl(Fd fd)
if (buffer.isRaw()) {
auto raw = buffer.raw();
auto ptr = raw.data.get() + totalWritten;
auto ptr = raw.data.c_str() + totalWritten;
#ifdef PISTACHE_USE_SSL
auto it = peers.find(fd);
......
......@@ -28,6 +28,7 @@ pistache_test(streaming_test)
pistache_test(rest_server_test)
pistache_test(string_view_test)
pistache_test(mailbox_test)
pistache_test(stream_test)
if (PISTACHE_SSL)
......
#include <pistache/stream.h>
#include "gtest/gtest.h"
#include <cstring>
using namespace Pistache;
TEST(stream, test_buffer)
{
char str[] = "test_string";
size_t len = strlen(str);
Buffer buffer1(str, len, false);
Buffer buffer2 = buffer1.detach(0);
ASSERT_EQ(buffer2.length, len);
ASSERT_EQ(buffer2.isDetached, true);
Buffer buffer3;
ASSERT_EQ(buffer3.length, 0u);
ASSERT_EQ(buffer3.isDetached, false);
Buffer buffer4 = buffer3.detach(0);
ASSERT_EQ(buffer4.length, 0u);
ASSERT_EQ(buffer4.isDetached, false);
ASSERT_THROW(buffer1.detach(2 * len);, std::range_error);
}
\ No newline at end of file
......@@ -46,7 +46,7 @@ void dumpData(const Rest::Request&req, Http::ResponseWriter response) {
stream.ends();
}
TEST(stream, from_description)
TEST(streaming, from_description)
{
Address addr(Ipv4::any(), Port(0));
const size_t threads = 20;
......
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