Add protocol property to the transport

Transport should be protocol aware because it should be possible to
switch the protocol if the operation is supported, for example for upgrading
HTTP to web sockets or HTTP 1.1 to HTTP/2.
This commit is contained in:
2017-02-08 20:04:05 +01:00
parent 43c28b749d
commit 48a49c2a2d
7 changed files with 165 additions and 15 deletions

View File

@ -0,0 +1,77 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/**
* Copyright: Eugene Wissner 2016-2017.
* License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
* Mozilla Public License, v. 2.0).
* Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
*/
module tanya.container.string;
import core.exception;
import core.stdc.string;
import tanya.memory;
/**
* UTF-8 string.
*/
struct String
{
private char[] data;
private size_t length_;
invariant
{
assert(length_ <= data.length);
}
/// Ditto.
this(const(char)[] str, shared Allocator allocator = defaultAllocator)
nothrow @trusted @nogc
{
this(allocator);
data = cast(char[]) allocator.allocate(str.length);
if (str.length > 0 && data is null)
{
onOutOfMemoryErrorNoGC();
}
memcpy(data.ptr, str.ptr, str.length);
}
/// Ditto.
this(const(wchar)[] str, shared Allocator allocator = defaultAllocator)
nothrow @trusted @nogc
{
this(allocator);
}
/// Ditto.
this(const(dchar)[] str, shared Allocator allocator = defaultAllocator)
nothrow @trusted @nogc
{
this(allocator);
}
/// Ditto.
this(shared Allocator allocator) pure nothrow @safe @nogc
in
{
assert(allocator !is null);
}
body
{
allocator_ = allocator;
}
~this() nothrow @trusted @nogc
{
allocator.deallocate(data);
}
mixin DefaultAllocator;
}