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 @@ ...@@ -6,6 +6,8 @@
#pragma once #pragma once
#include <pistache/os.h>
#include <cstddef> #include <cstddef>
#include <stdexcept> #include <stdexcept>
#include <cstring> #include <cstring>
...@@ -15,7 +17,6 @@ ...@@ -15,7 +17,6 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <pistache/os.h>
namespace Pistache { namespace Pistache {
...@@ -121,33 +122,17 @@ private: ...@@ -121,33 +122,17 @@ private:
template<typename CharT> template<typename CharT>
size_t ArrayStreamBuf<CharT>::maxSize = Const::DefaultMaxPayload; size_t ArrayStreamBuf<CharT>::maxSize = Const::DefaultMaxPayload;
struct Buffer { struct Buffer
{
Buffer() : data(nullptr), length(0), isDetached(false) {} Buffer();
Buffer(std::shared_ptr<char> _data, int _length, bool _isDetached = false) : data(_data), length(_length), isDetached(_isDetached) {} Buffer(std::string data, int length, bool isDetached = false);
Buffer(const char * _data, int _length, bool _isDetached = false) : data(nullptr), length(_length), isDetached(_isDetached) { Buffer(const char * data, int length, bool isDetached = false);
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){
if (!data) Buffer();
if (length < fromIndex)
throw std::range_error("Trying to detach buffer from an index bigger than lengthght.");
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; Buffer detach(size_t fromIndex);
int length;
int isDetached;
std::string data;
size_t length;
int isDetached;
}; };
struct FileBuffer { struct FileBuffer {
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
*/ */
#include <pistache/stream.h>
#include <iostream> #include <iostream>
#include <algorithm> #include <algorithm>
#include <string> #include <string>
...@@ -12,10 +14,43 @@ ...@@ -12,10 +14,43 @@
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <pistache/stream.h>
namespace Pistache { 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) FileBuffer::FileBuffer(const std::string& fileName)
: fileName_(fileName) : fileName_(fileName)
......
...@@ -237,7 +237,7 @@ Transport::asyncWriteImpl(Fd fd) ...@@ -237,7 +237,7 @@ Transport::asyncWriteImpl(Fd fd)
if (buffer.isRaw()) { if (buffer.isRaw()) {
auto raw = buffer.raw(); auto raw = buffer.raw();
auto ptr = raw.data.get() + totalWritten; auto ptr = raw.data.c_str() + totalWritten;
#ifdef PISTACHE_USE_SSL #ifdef PISTACHE_USE_SSL
auto it = peers.find(fd); auto it = peers.find(fd);
......
...@@ -28,6 +28,7 @@ pistache_test(streaming_test) ...@@ -28,6 +28,7 @@ pistache_test(streaming_test)
pistache_test(rest_server_test) pistache_test(rest_server_test)
pistache_test(string_view_test) pistache_test(string_view_test)
pistache_test(mailbox_test) pistache_test(mailbox_test)
pistache_test(stream_test)
if (PISTACHE_SSL) 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) { ...@@ -46,7 +46,7 @@ void dumpData(const Rest::Request&req, Http::ResponseWriter response) {
stream.ends(); stream.ends();
} }
TEST(stream, from_description) TEST(streaming, from_description)
{ {
Address addr(Ipv4::any(), Port(0)); Address addr(Ipv4::any(), Port(0));
const size_t threads = 20; 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