diff options
-rw-r--r-- | lib/Net.Messaging.FBM/src/Client/FBMBuffer.cs | 30 | ||||
-rw-r--r-- | lib/Net.Messaging.FBM/src/Client/FBMRequest.cs | 5 | ||||
-rw-r--r-- | lib/Net.Messaging.FBM/src/FBMMessageHeader.cs | 19 | ||||
-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.cs | 25 |
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"); + } } |