aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Net.Messaging.FBM/src/Client/FBMBuffer.cs30
-rw-r--r--lib/Net.Messaging.FBM/src/Client/FBMRequest.cs5
-rw-r--r--lib/Net.Messaging.FBM/src/FBMMessageHeader.cs19
-rw-r--r--lib/Net.Messaging.FBM/src/Helpers.cs (renamed from lib/Net.Messaging.FBM/src/Client/Helpers.cs)2
-rw-r--r--lib/Net.Messaging.FBM/src/IFBMHeaderBuffer.cs (renamed from lib/Net.Messaging.FBM/src/FBMHeaderBuffer.cs)25
-rw-r--r--lib/Net.Messaging.FBM/src/Server/FBMRequestMessage.cs25
6 files changed, 56 insertions, 50 deletions
diff --git a/lib/Net.Messaging.FBM/src/Client/FBMBuffer.cs b/lib/Net.Messaging.FBM/src/Client/FBMBuffer.cs
index 95a5bb8..fac41a6 100644
--- a/lib/Net.Messaging.FBM/src/Client/FBMBuffer.cs
+++ b/lib/Net.Messaging.FBM/src/Client/FBMBuffer.cs
@@ -24,6 +24,9 @@
using System;
using System.Buffers;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
using VNLib.Utils.IO;
namespace VNLib.Net.Messaging.FBM.Client
@@ -31,7 +34,7 @@ namespace VNLib.Net.Messaging.FBM.Client
/// <summary>
/// Represents a shared internal character and bianry buffer for
/// </summary>
- internal sealed class FBMBuffer : IDisposable
+ internal sealed class FBMBuffer : IFBMHeaderBuffer, IDisposable
{
private readonly IMemoryOwner<byte> Handle;
@@ -70,16 +73,7 @@ namespace VNLib.Net.Messaging.FBM.Client
//Return the internal writer
return _writer;
}
-
- /// <summary>
- /// Gets the buffer manager for managing response headers
- /// </summary>
- /// <returns>The <see cref="FBMHeaderBuffer"/> for managing response header buffers</returns>
- public FBMHeaderBuffer GetResponseHeaderBuffer()
- {
- //Get a buffer wrapper around the memory handle
- return new FBMHeaderBuffer(Handle.Memory);
- }
+
public void Dispose()
{
@@ -100,6 +94,20 @@ namespace VNLib.Net.Messaging.FBM.Client
Helpers.WriteMessageid(RequestBuffer, messageId);
}
+ ///<inheritdoc/>
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ Span<char> IFBMHeaderBuffer.GetSpan(int offset, int count)
+ {
+ //Get the character span
+ Span<char> span = MemoryMarshal.Cast<byte, char>(Handle.Memory.Span);
+ return span.Slice(offset, count);
+ }
+
+ ///<inheritdoc/>
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ Span<char> IFBMHeaderBuffer.GetSpan() => MemoryMarshal.Cast<byte, char>(Handle.Memory.Span);
+
+
private sealed class BinaryRequestAccumulator : IDataAccumulator<byte>
{
private readonly int Size;
diff --git a/lib/Net.Messaging.FBM/src/Client/FBMRequest.cs b/lib/Net.Messaging.FBM/src/Client/FBMRequest.cs
index aaf3926..01302a9 100644
--- a/lib/Net.Messaging.FBM/src/Client/FBMRequest.cs
+++ b/lib/Net.Messaging.FBM/src/Client/FBMRequest.cs
@@ -210,12 +210,9 @@ namespace VNLib.Net.Messaging.FBM.Client
* The headers are read into a list of key-value pairs and the stream
* is positioned to the start of the message body
*/
-
- //Get the response header buffer for parsing
- FBMHeaderBuffer headerBuf = Buffer.GetResponseHeaderBuffer();
//Parse message headers
- HeaderParseError statusFlags = Helpers.ParseHeaders(Response, in headerBuf, ResponseHeaderList, HeaderEncoding);
+ HeaderParseError statusFlags = Helpers.ParseHeaders(Response, Buffer, ResponseHeaderList, HeaderEncoding);
//return response structure
return new(Response, statusFlags, ResponseHeaderList, OnResponseDisposed);
diff --git a/lib/Net.Messaging.FBM/src/FBMMessageHeader.cs b/lib/Net.Messaging.FBM/src/FBMMessageHeader.cs
index e0a33ef..3d345ef 100644
--- a/lib/Net.Messaging.FBM/src/FBMMessageHeader.cs
+++ b/lib/Net.Messaging.FBM/src/FBMMessageHeader.cs
@@ -32,7 +32,14 @@ namespace VNLib.Net.Messaging.FBM
/// </summary>
public readonly struct FBMMessageHeader : IEquatable<FBMMessageHeader>
{
- private readonly FBMHeaderBuffer _buffer;
+ private readonly IFBMHeaderBuffer _buffer;
+
+ /*
+ * Header values are all stored consecutively inside a single
+ * buffer, position the value is stored within the buffer
+ * is designated by it's absolute offset and length within
+ * the buffer segment
+ */
private readonly int _headerOffset;
private readonly int _headerLength;
@@ -42,15 +49,15 @@ namespace VNLib.Net.Messaging.FBM
public readonly HeaderCommand Header { get; }
/// <summary>
- /// The header value
+ /// The header value, or <see cref="ReadOnlySpan{T}.Empty"/> if default
/// </summary>
- public readonly ReadOnlySpan<char> Value => _buffer.GetSpan(_headerOffset, _headerLength);
+ public readonly ReadOnlySpan<char> Value => _buffer != null ? _buffer.GetSpan(_headerOffset, _headerLength) : null;
/// <summary>
- /// Gets the header value as a <see cref="string"/>
+ /// Gets the header value as a <see cref="string"/> or null if default instance
/// </summary>
/// <returns>The allocates string of the value</returns>
- public readonly string GetValueString() => Value.ToString();
+ public readonly string? GetValueString() => _buffer != null ? Value.ToString() : null;
/// <summary>
/// Initializes a new <see cref="FBMMessageHeader"/> of the sepcified command
@@ -60,7 +67,7 @@ namespace VNLib.Net.Messaging.FBM
/// <param name="command">The command this header represents</param>
/// <param name="offset">The char offset within the buffer our header begins</param>
/// <param name="length">The character length of our header value</param>
- internal FBMMessageHeader(FBMHeaderBuffer buffer, HeaderCommand command, int offset, int length)
+ internal FBMMessageHeader(IFBMHeaderBuffer buffer, HeaderCommand command, int offset, int length)
{
Header = command;
_buffer = buffer;
diff --git a/lib/Net.Messaging.FBM/src/Client/Helpers.cs b/lib/Net.Messaging.FBM/src/Helpers.cs
index 0b9e7bd..14900ee 100644
--- a/lib/Net.Messaging.FBM/src/Client/Helpers.cs
+++ b/lib/Net.Messaging.FBM/src/Helpers.cs
@@ -155,7 +155,7 @@ namespace VNLib.Net.Messaging.FBM
/// <param name="headers">The collection to store headers in</param>
/// <param name="encoding">The encoding type used to deocde header values</param>
/// <returns>The results of the parse operation</returns>
- internal static HeaderParseError ParseHeaders(VnMemoryStream vms, in FBMHeaderBuffer buffer, ICollection<FBMMessageHeader> headers, Encoding encoding)
+ internal static HeaderParseError ParseHeaders(VnMemoryStream vms, IFBMHeaderBuffer buffer, ICollection<FBMMessageHeader> headers, Encoding encoding)
{
HeaderParseError status = HeaderParseError.None;
diff --git a/lib/Net.Messaging.FBM/src/FBMHeaderBuffer.cs b/lib/Net.Messaging.FBM/src/IFBMHeaderBuffer.cs
index 42ec2af..bd8d85d 100644
--- a/lib/Net.Messaging.FBM/src/FBMHeaderBuffer.cs
+++ b/lib/Net.Messaging.FBM/src/IFBMHeaderBuffer.cs
@@ -3,9 +3,9 @@
*
* Library: VNLib
* Package: VNLib.Net.Messaging.FBM
-* File: FBMHeaderBuffer.cs
+* File: IFBMHeaderBuffer.cs
*
-* FBMHeaderBuffer.cs is part of VNLib.Net.Messaging.FBM which is part of the larger
+* IFBMHeaderBuffer.cs is part of VNLib.Net.Messaging.FBM which is part of the larger
* VNLib collection of libraries and utilities.
*
* VNLib.Net.Messaging.FBM is free software: you can redistribute it and/or modify
@@ -24,17 +24,11 @@
using System;
-using System.Runtime.InteropServices;
-using System.Runtime.CompilerServices;
-
namespace VNLib.Net.Messaging.FBM
{
- internal readonly struct FBMHeaderBuffer
- {
- private readonly Memory<byte> _handle;
-
- internal FBMHeaderBuffer(Memory<byte> handle) => _handle = handle;
+ internal interface IFBMHeaderBuffer
+ {
/// <summary>
/// Gets a character squence within the binary buffer of the specified
/// character offset and length
@@ -42,19 +36,12 @@ namespace VNLib.Net.Messaging.FBM
/// <param name="offset">The character offset within the internal buffer</param>
/// <param name="count">The number of characters within the desired span</param>
/// <returns>A span at the given character offset and of the specified length</returns>
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public Span<char> GetSpan(int offset, int count)
- {
- //Get the character span
- Span<char> span = GetSpan();
- return span.Slice(offset, count);
- }
+ Span<char> GetSpan(int offset, int count);
/// <summary>
/// Gets the entire internal buffer as a character span
/// </summary>
/// <returns>A span over the entire internal buffer</returns>
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public Span<char> GetSpan() => MemoryMarshal.Cast<byte, char>(_handle.Span);
+ Span<char> GetSpan();
}
}
diff --git a/lib/Net.Messaging.FBM/src/Server/FBMRequestMessage.cs b/lib/Net.Messaging.FBM/src/Server/FBMRequestMessage.cs
index d37ba84..db0655a 100644
--- a/lib/Net.Messaging.FBM/src/Server/FBMRequestMessage.cs
+++ b/lib/Net.Messaging.FBM/src/Server/FBMRequestMessage.cs
@@ -27,6 +27,7 @@ using System.Text;
using System.Buffers;
using System.Text.Json;
using System.Collections.Generic;
+using System.Runtime.CompilerServices;
using VNLib.Utils.IO;
using VNLib.Utils.Extensions;
@@ -37,7 +38,7 @@ namespace VNLib.Net.Messaging.FBM.Server
/// <summary>
/// Represents a client request message to be serviced
/// </summary>
- public sealed class FBMRequestMessage : IReusable
+ public sealed class FBMRequestMessage : IFBMHeaderBuffer, IReusable
{
private readonly List<FBMMessageHeader> _headers;
private readonly int HeaderBufferSize;
@@ -52,7 +53,7 @@ namespace VNLib.Net.Messaging.FBM.Server
_headers = new();
}
- private byte[]? _headerBuffer;
+ private char[]? _headerBuffer;
/// <summary>
/// The ID of the current message
@@ -109,13 +110,10 @@ namespace VNLib.Net.Messaging.FBM.Server
return;
}
- ConnectionId = socketId;
-
- //Get mesage buffer wrapper around the header
- FBMHeaderBuffer buffer = new(_headerBuffer);
+ ConnectionId = socketId;
//Parse headers
- ParseStatus = Helpers.ParseHeaders(vms, in buffer, _headers, dataEncoding);
+ ParseStatus = Helpers.ParseHeaders(vms, this, _headers, dataEncoding);
}
/// <summary>
@@ -145,7 +143,7 @@ namespace VNLib.Net.Messaging.FBM.Server
{
ParseStatus = HeaderParseError.None;
//Alloc header buffer
- _headerBuffer = ArrayPool<byte>.Shared.Rent(HeaderBufferSize);
+ _headerBuffer = ArrayPool<char>.Shared.Rent(HeaderBufferSize);
}
@@ -157,12 +155,21 @@ namespace VNLib.Net.Messaging.FBM.Server
//Clear headers before freeing buffer
_headers.Clear();
//Free header-buffer
- ArrayPool<byte>.Shared.Return(_headerBuffer!);
+ ArrayPool<char>.Shared.Return(_headerBuffer!);
_headerBuffer = null;
ConnectionId = null;
MessageId = 0;
IsControlFrame = false;
return true;
}
+
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ Span<char> IFBMHeaderBuffer.GetSpan(int offset, int count)
+ => _headerBuffer != null ? _headerBuffer.AsSpan(offset, count) : throw new InvalidOperationException("The buffer is no longer available");
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ Span<char> IFBMHeaderBuffer.GetSpan() => _headerBuffer ?? throw new InvalidOperationException("The buffer is no longer available");
+
}
}