Skip to content

0.0.10-alpha#10

Merged
ReneSchwarzer merged 55 commits intomainfrom
develop
Apr 5, 2026
Merged

0.0.10-alpha#10
ReneSchwarzer merged 55 commits intomainfrom
develop

Conversation

@ReneSchwarzer
Copy link
Copy Markdown
Member

This pull request introduces several improvements and additions to the test suite, focusing on code clarity, null handling, and new test coverage. The main changes include the addition of a new unit test class for deterministic identifiers, improved null handling in assertion helpers, and consistent naming and structure updates in test methods.

@ReneSchwarzer ReneSchwarzer changed the title Develop 0.0.10-alpha Apr 1, 2026
@ReneSchwarzer ReneSchwarzer requested a review from Copilot April 1, 2026 20:45
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR bumps the WebExpress.WebCore package to 0.0.10-alpha and introduces broad API refactors (notably RequestIRequest, ResponseIResponse, and ParameterIParameter abstractions) alongside new WebSocket-related infrastructure and expanded unit test coverage.

Changes:

  • Introduces new WebSocket core types (contexts, connection contract, message typing, handshake/size exceptions) plus HTTP upgrade responses/headers.
  • Refactors multiple public APIs to depend on new interfaces (IRequest, IResponse, IParameter) and adds typed URI parameter/segment helpers.
  • Updates and extends the test suite (new RandomId/DeterministicId tests, route/fixture tweaks, and widespread null-style updates).

Reviewed changes

Copilot reviewed 265 out of 270 changed files in this pull request and generated 14 comments.

Show a summary per file
File Description
src/WebExpress.WebCore/WebUri/UriScheme.cs Add ws/wss schemes
src/WebExpress.WebCore/WebUri/UriQuery.cs Add IUriQuery + generic query helper
src/WebExpress.WebCore/WebUri/IUriQuery.cs New query interface
src/WebExpress.WebCore/WebUri/IUriPathSegment.cs Segment interface updated (hidden/redirect)
src/WebExpress.WebCore/WebUri/IUriPathSegmentVariable.cs Variable segment API expanded (copy/display/icon)
src/WebExpress.WebCore/WebUri/IUriPathSegmentConstant.cs Minor cleanup
src/WebExpress.WebCore/WebUri/UriPathSegmentRoot.cs Adds IsHidden/Uri + display API change
src/WebExpress.WebCore/WebUri/UriPathSegmentVariableUInt.cs Generic parameterized segment
src/WebExpress.WebCore/WebUri/UriPathSegmentVariableInt.cs Generic parameterized segment
src/WebExpress.WebCore/WebUri/UriPathSegmentVariableDouble.cs Generic parameterized segment
src/WebExpress.WebCore/WebUri/UriPathSegmentVariableString.cs Generic parameterized segment
src/WebExpress.WebCore/WebUri/UriPathSegmentVariableRegex.cs New regex segment type
src/WebExpress.WebCore/WebUri/UriPathSegmentVariableApiVersion.cs New API version segment type
src/WebExpress.WebCore/WebTheme/ThemeManager.cs System component + null-style tweaks
src/WebExpress.WebCore/WebTheme/Model/ThemeItemDictionary.cs Null-style tweaks
src/WebExpress.WebCore/WebTask/ITaskManager.cs Adds TaskChanged event
src/WebExpress.WebCore/WebTask/TaskManager.cs Emits TaskChanged + event wiring/unwiring
src/WebExpress.WebCore/WebTask/TaskEventArgs.cs Adds task/progress/message payload
src/WebExpress.WebCore/WebTask/Task.cs Adds ProgressChanged/MessageChanged events
src/WebExpress.WebCore/WebStatusPage/Model/StatusPageDictionary.cs Null-style tweak
src/WebExpress.WebCore/WebStatusPage/IStatusPageManager.cs Request parameter now IRequest
src/WebExpress.WebCore/WebSocket/SocketMessageType.cs New WebSocket message kind enum
src/WebExpress.WebCore/WebSocket/SocketMessageTooLargeException.cs New size-limit exception
src/WebExpress.WebCore/WebSocket/SocketHandshakeException.cs New handshake exception
src/WebExpress.WebCore/WebSocket/SocketCloseInfo.cs New close status model
src/WebExpress.WebCore/WebSocket/ISockt.cs New ISocket endpoint contract
src/WebExpress.WebCore/WebSocket/ISocketContext.cs New socket endpoint context contract
src/WebExpress.WebCore/WebSocket/ISocketConnection.cs New socket connection contract
src/WebExpress.WebCore/WebSocket/SocketContext.cs Default socket context implementation
src/WebExpress.WebCore/WebSitemap/SearchContext.cs HttpContext now IHttpContext
src/WebExpress.WebCore/WebSitemap/Model/SitemapNode.cs Null-style tweak + leaf check change
src/WebExpress.WebCore/WebSitemap/ISitemapManager.cs Parameter array now IParameter[]
src/WebExpress.WebCore/WebSettingPage/Model/TimeSpanConverter.cs Null-style tweak
src/WebExpress.WebCore/WebSettingPage/Model/SettingPageDictionary.cs Null-style tweaks
src/WebExpress.WebCore/WebSettingPage/Model/SettingGroupDictionary.cs Null-style tweaks
src/WebExpress.WebCore/WebSettingPage/Model/SettingCategoryDictionary.cs Null-style tweaks
src/WebExpress.WebCore/WebSession/SessionManager.cs IRequest signature + comment cleanup
src/WebExpress.WebCore/WebSession/ISessionManager.cs IRequest signature
src/WebExpress.WebCore/WebSession/Model/SessionPropertyParameter.cs Namespace switch to WebParameter
src/WebExpress.WebCore/WebSession/Model/Session.cs Null-style tweak (constructors check)
src/WebExpress.WebCore/WebRestApi/RestApiValidator.cs IRequest-based validator hooks
src/WebExpress.WebCore/WebRestApi/RestApiValidationResult.cs Implements interface + fluent Add returns
src/WebExpress.WebCore/WebRestApi/RestApiContext.cs CrudMethod→RequestMethod
src/WebExpress.WebCore/WebRestAPI/RestApi.cs Removes old RestApi base class
src/WebExpress.WebCore/WebRestAPI/IRestApi.cs Removes old IRestApi contract w/ CRUD methods
src/WebExpress.WebCore/WebRestApi/IRestApi.cs New minimal IRestApi marker
src/WebExpress.WebCore/WebRestApi/IRestApiManager.cs New manager contract
src/WebExpress.WebCore/WebRestApi/IRestApiContext.cs CrudMethod→RequestMethod
src/WebExpress.WebCore/WebRestApi/IRestApiResult.cs Response→IResponse conversion
src/WebExpress.WebCore/WebRestApi/Model/RestApiItem.cs Adds MethodInfo slots + RequestMethod list
src/WebExpress.WebCore/WebRestAPI/CrudMethod.cs Removes old CRUD enum wrapper
src/WebExpress.WebCore/WebResource/Resource.cs Process now returns IResponse and takes IRequest
src/WebExpress.WebCore/WebResource/IResource.cs Process now returns IResponse and takes IRequest
src/WebExpress.WebCore/WebResource/ResourceFile.cs Process signature updated
src/WebExpress.WebCore/WebResource/ResourceBinary.cs Process signature + null-style tweak
src/WebExpress.WebCore/WebResource/ResourceAsset.cs Process signature + null-style tweaks
src/WebExpress.WebCore/WebPlugin/Model/PluginLoadContext.cs Null-style tweaks
src/WebExpress.WebCore/WebParameter/ParameterScope.cs Namespace moved to WebParameter
src/WebExpress.WebCore/WebParameter/Parameter.cs Implements IParameterDynamic; scope/value setters
src/WebExpress.WebCore/WebParameter/ParameterDictionary.cs Stores IParameter values
src/WebExpress.WebCore/WebParameter/IParameter.cs New base parameter interface
src/WebExpress.WebCore/WebParameter/IParameterDynamic.cs New dynamic-key parameter interface
src/WebExpress.WebCore/WebParameter/IParameterStatic.cs New static-key parameter interface
src/WebExpress.WebCore/WebParameter/ParameterId.cs New id parameter
src/WebExpress.WebCore/WebParameter/ParameterApiVersion.cs New API version parameter
src/WebExpress.WebCore/WebParameter/ParameterFile.cs Namespace moved to WebParameter
src/WebExpress.WebCore/WebPage/IRenderContext.cs Request now IRequest
src/WebExpress.WebCore/WebPage/IVisualTreeContext.cs Request/Uri now interface types
src/WebExpress.WebCore/WebPage/RenderContext.cs Request now IRequest
src/WebExpress.WebCore/WebPage/VisualTreeContext.cs Request/Uri now interface types
src/WebExpress.WebCore/WebPage/VisualTree.cs Null-style tweaks for links/scripts
src/WebExpress.WebCore/WebPage/PageContext.cs Adds Domains collection
src/WebExpress.WebCore/WebPage/IPageContext.cs Adds Domains collection
src/WebExpress.WebCore/WebPage/Model/PageDictionary.cs Null-style tweak
src/WebExpress.WebCore/WebMessage/IResponse.cs New response interface
src/WebExpress.WebCore/WebMessage/IHttpContext.cs New HTTP context interface
src/WebExpress.WebCore/WebMessage/Response.cs Implements IResponse
src/WebExpress.WebCore/WebMessage/ResponseHeaderFields.cs Adds upgrade/handshake headers
src/WebExpress.WebCore/WebMessage/ResponseBadRequest.cs Fixes default HTML title/body code
src/WebExpress.WebCore/WebMessage/ResponseUpgradeRequired.cs New 426 response
src/WebExpress.WebCore/WebMessage/ResponsePayloadTooLarge.cs New 413 response
src/WebExpress.WebCore/WebMessage/ResponseSwitchingProtocol.cs New 101 Switching Protocols response
src/WebExpress.WebCore/WebMessage/RequestWebSocket.cs New request subtype for websockets
src/WebExpress.WebCore/WebMessage/RequestHeaderFields.cs Adds websocket headers + cookie parsing change
src/WebExpress.WebCore/WebMessage/RequestHeaderFieldsExtensions.cs Header→Dictionary helper for handshake
src/WebExpress.WebCore/WebMessage/RequestAuthorization.cs Null-style tweak
src/WebExpress.WebCore/WebMessage/HttpContext.cs Implements IHttpContext; Request now IRequest
src/WebExpress.WebCore/WebMessage/HttpWebSocketContext.cs New websocket-specific IHttpContext
src/WebExpress.WebCore/WebLog/ILog.cs Current now ILog; Seperator→Separator
src/WebExpress.WebCore/WebLog/Log.cs Seperator→Separator + misc null-style tweaks
src/WebExpress.WebCore/WebLog/LogFrame.cs Accepts ILog + message language updates
src/WebExpress.WebCore/WebJob/JobManager.cs Null-style tweaks
src/WebExpress.WebCore/WebInclude/Model/IncludeDictionary.cs Null-style tweak + collection init
src/WebExpress.WebCore/WebInclude/IncludeManager.cs Null-style tweaks + removal logging
src/WebExpress.WebCore/WebIdentity/IIdentityManager.cs IRequest signatures
src/WebExpress.WebCore/WebIdentity/IdentityManager.cs IRequest signatures + null-style tweaks
src/WebExpress.WebCore/WebIdentity/Model/IdentityPolicyDictionary.cs Null-style tweak
src/WebExpress.WebCore/WebIdentity/Model/IdentityPermissionDictionary.cs Null-style tweak
src/WebExpress.WebCore/WebHtml/TypeTarget.cs Rename ToStringValue→ToValue
src/WebExpress.WebCore/WebHtml/TypeEnctype.cs Adds Multipart + parsing improvements
src/WebExpress.WebCore/WebHtml/RandomId.cs New RNG-based id generator
src/WebExpress.WebCore/WebHtml/HtmlElementTextSemanticsA.cs Uses TypeTarget.ToValue
src/WebExpress.WebCore/WebHtml/HtmlElementSectionBody.cs Null-style tweak
src/WebExpress.WebCore/WebHtml/HtmlElement.cs Null-style tweaks in attribute/element ops
src/WebExpress.WebCore/WebFragment/Model/FragmentItem.cs Request now IRequest
src/WebExpress.WebCore/WebFragment/Model/FragmentDictionary.cs Null-style tweak + formatting
src/WebExpress.WebCore/WebFragment/FragmentManager.cs Null-style tweaks
src/WebExpress.WebCore/WebFragment/FragmentConditionExtentsion.cs Request now IRequest
src/WebExpress.WebCore/WebFragment/FragmentComparer.cs Null-style tweak
src/WebExpress.WebCore/WebEndpoint/IEndpointManager.cs HandleRequest now IRequest/IResponse
src/WebExpress.WebCore/WebEndpoint/EndpointRegistration.cs Handler delegate now IRequest/IResponse
src/WebExpress.WebCore/WebEndpoint/IRoute.cs Parameter namespace switch
src/WebExpress.WebCore/WebEndpoint/RouteEndpoint.cs Adds IEnumerable ctor + ToUri bind change
src/WebExpress.WebCore/WebDomain/IDomain.cs New domain marker interface
src/WebExpress.WebCore/WebCondition/ICondition.cs Request now IRequest
src/WebExpress.WebCore/WebComponent/IComponentHub.cs Adds SocketManager exposure
src/WebExpress.WebCore/WebComponent/Model/ComponentDictionary.cs Value type changed to List<ComponentItem)
src/WebExpress.WebCore/WebAttribute/MethodAttribute.cs Method-level RequestMethod attribute
src/WebExpress.WebCore/WebAttribute/SubProtocolAttribute.cs New WebSocket subprotocol attribute
src/WebExpress.WebCore/WebAttribute/MessageTypeAttribute.cs New WebSocket message type attribute
src/WebExpress.WebCore/WebAttribute/MaxMessageSizeAttribute.cs New message-size limit attribute
src/WebExpress.WebCore/WebAttribute/ISocketAttribute.cs New marker interface
src/WebExpress.WebCore/WebAttribute/SegmentHiddenAttribute.cs New hidden-segment marker
src/WebExpress.WebCore/WebAttribute/SegmentRegexAttribute.cs New regex-segment attribute
src/WebExpress.WebCore/WebAttribute/SegmentGuidAttribute.cs Typed-parameter rewrite
src/WebExpress.WebCore/WebAttribute/SegmentIntAttribute.cs Typed-parameter rewrite
src/WebExpress.WebCore/WebAttribute/SegmentUIntAttribute.cs Typed-parameter rewrite
src/WebExpress.WebCore/WebAttribute/SegmentDoubleAttribute.cs Typed-parameter rewrite
src/WebExpress.WebCore/WebAttribute/SegmentStringAttribute.cs Typed-parameter rewrite
src/WebExpress.WebCore/WebAttribute/SegmentAttribute.cs Removes display argument
src/WebExpress.WebCore/WebAttribute/IncludeSubPathsAttribute.cs Adds AttributeUsage + stored value
src/WebExpress.WebCore/WebAttribute/DomainAttribute.cs New domain assignment attribute
src/WebExpress.WebCore/WebAttribute/ContextPathAttribute.cs Stores context path value
src/WebExpress.WebCore/WebAttribute/SettingSectionAttribute.cs Stores section value
src/WebExpress.WebCore/WebAttribute/TitleAttribute.cs Stores title value
src/WebExpress.WebCore/WebAttribute/ApplicationAttribute.cs Formatting tweak
src/WebExpress.WebCore/WebAsset/IAsset.cs Process signature now takes IRequest
src/WebExpress.WebCore/WebAsset/Asset.cs Null-style tweaks + IRequest param
src/WebExpress.WebCore/WebAsset/AssetManager.cs Null-style tweak
src/WebExpress.WebCore/WebAsset/Model/AssetItemDictionary.cs Null-style tweaks
src/WebExpress.WebCore/WebApplication/ApplicationManager.cs Null-style tweaks + path defaults
src/WebExpress.WebCore/WebApplication/Model/ApplicationDictionary.cs Null-style tweak
src/WebExpress.WebCore/Internationalization/InternationalizationManager.cs IRequest signatures + null-style tweak
src/WebExpress.WebCore/Internationalization/IInternationalizationManager.cs IRequest signatures
src/WebExpress.WebCore/Internationalization/I18N.cs IRequest signatures
src/WebExpress.WebCore/Internationalization/en Adds socketmanager strings
src/WebExpress.WebCore/Internationalization/de Adds socketmanager strings
src/WebExpress.WebCore/WebEx.cs Adds Favicon + logging separator rename
src/WebExpress.WebCore/ArgumentParser.cs Null-style tweaks
src/WebExpress.WebCore/HttpServerStatisticItem.cs New statistics data model
src/WebExpress.WebCore/WebExpress.WebCore.sln New solution file
src/WebExpress.WebCore/WebExpress.WebCore.csproj Version bump + TFM bump + icon change
src/WebExpress.WebCore.Test/WebExpress.WebCore.Test.csproj TFM bump + test SDK/pkg updates
src/WebExpress.WebCore.Test/Fixture/UnitTestFixture.cs Request mock now returns IRequest
src/WebExpress.WebCore.Test/Fixture/AssertExtensions.cs Better null handling for placeholder asserts
src/WebExpress.WebCore.Test/Html/UnitTestRandomId.cs New RandomId tests
src/WebExpress.WebCore.Test/Html/UnitTestDeterministicId.cs New DeterministicId tests
src/WebExpress.WebCore.Test/Route/UnitTestRoute.cs Test clarity (arrange/act/validate)
src/WebExpress.WebCore.Test/TestParameterA.cs Switch to IParameterStatic
src/WebExpress.WebCore.Test/TestParameterB.cs New IParameterStatic test parameter
src/WebExpress.WebCore.Test/TestRenderContext.cs Request now IRequest
src/WebExpress.WebCore.Test/TestSocketA.cs New ISocket test endpoint
src/WebExpress.WebCore.Test/TestTask.cs Null-style tweaks
src/WebExpress.WebCore.Test/TestVisualTree.cs Null-style tweaks
src/WebExpress.WebCore.Test/Manager/UnitTestTaskManager.cs Test clarity (arrange/act)
src/WebExpress.WebCore.Test/Manager/UnitTestSessionManager.cs Parameter namespace switch + clarity
src/WebExpress.WebCore.Test/WWW/Api/1/TestRestApiA.cs Moves Method annotations to methods
src/WebExpress.WebCore.Test/WWW/Api/_2/TestRestApiB.cs Moves Method annotations to methods
src/WebExpress.WebCore.Test/WWW/Api/3/TestRestApiC.cs Renames namespace + method annotations

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +6 to +40
/// <summary>
/// Returns the URI to which the user is redirected.
/// </summary>
IUri Uri { get; internal set; }
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IUriPathSegment is declared public but contains internal members/accessors (Id, IsHidden setter, Uri setter). That makes the interface effectively impossible to implement from other assemblies (e.g., plugins) because the required members are not accessible. Consider making the interface internal, or making these members public, or splitting them into a separate internal interface that only framework types implement.

Copilot uses AI. Check for mistakes.
Comment on lines +139 to +143
if (!string.IsNullOrWhiteSpace(Upgrade))
{
sb.AppendLine("Upgrade: " + Upgrade);
sb.AppendLine("Connection: Upgrade");
}
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ResponseHeaderFields.ToString() writes Upgrade and forces Connection: Upgrade, but it never emits Sec-WebSocket-Accept. Any WebSocket handshake response built via Header.SecWebSocketAccept (e.g., ResponseSwitchingProtocols) will be missing a required header. Please append Sec-WebSocket-Accept: ... when set, and avoid overriding Connection unconditionally (use the Connection property or set it explicitly in the WebSocket response).

Copilot uses AI. Check for mistakes.
Comment on lines +126 to +131
Cookies = requestFeature.Headers.Cookie
.Select(c =>
{
var split = c.Split('=');
return new Cookie(split[0], split[1]);
});
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cookie parsing uses c.Split('=') and then indexes split[1]. This can throw for malformed cookie headers and also mis-parses real-world cookie headers that contain multiple cookies (a=b; c=d) or values containing '='. Consider parsing on ';' first and splitting each pair on the first '=' only (or reuse an existing cookie parser) to avoid exceptions and data corruption.

Copilot uses AI. Check for mistakes.
Comment on lines 79 to 92
var key = id?.ToLower();

if (_dictionary.TryGetValue(id, out var value))
{
return value;
}

var task = ComponentActivator.CreateInstance<Task>(_httpServerContext, _componentHub, [id, args]);

// register events for the newly created task
task.ProgressChanged += OnTaskChanged;

_dictionary.Add(key, task);

Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CreateTask lowercases the key (key = id?.ToLower()), but then checks _dictionary.TryGetValue(id, ...) instead of _dictionary.TryGetValue(key, ...). This allows duplicate creation attempts with different casing and can throw when _dictionary.Add(key, task) is called for an already-existing lowercased key. Use key consistently for lookups and inserts.

Copilot uses AI. Check for mistakes.
Comment on lines 142 to 153
public void RemoveTask(ITask task)
{
var key = task?.Id.ToLower();

if (_dictionary.TryGetValue(key, out var storedTask) && storedTask is Task t)
{
// unregister events to prevent memory leaks
t.ProgressChanged -= OnTaskChanged;
}

_dictionary.Remove(key);
}
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RemoveTask computes key = task?.Id.ToLower() but then calls _dictionary.TryGetValue(key, ...) / _dictionary.Remove(key) even when task (or task.Id) is null. Dictionary operations with a null key throw ArgumentNullException. Add an early return when task/task.Id is null.

Copilot uses AI. Check for mistakes.
Comment on lines +24 to +29
/// <summary>
/// Returns the maximum allowed message size in bytes, or null when the endpoint imposes no limit.
/// servers and hosts may use this to protect against excessively large frames.
/// </summary>
ulong MaxMessageSize { get; }

Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ISocketContext.MaxMessageSize is typed as ulong, but the XML docs say it can be null to indicate "no limit". Either change the type to ulong? or update the docs/semantics (e.g., 0 means unlimited) so callers know how to disable the limit.

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +20
/// <summary>
/// Defines the contract for WebSocket endpoints.
/// </summary>
public interface ISocket : IEndpoint, IDisposable
{
/// <summary>
/// Invoked after the websocket handshake has been accepted.
/// Implementers may use the optional cancellation token to abort long-running startup tasks.
/// the optional connectMessage provides initial metadata from the client (may be null).
/// </summary>
/// <param name="socketConnection">The socket connection.</param>
/// <returns>An asynchronous task.</returns>
Task OnConnectedAsync(ISocketConnection socketConnection);
}
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In ISocket (file name ISockt.cs), the doc comment mentions an optional cancellation token and connectMessage, but OnConnectedAsync does not accept these parameters. Please either update the documentation to match the actual signature, or extend the API to include the documented parameters. Also consider renaming the file to ISocket.cs for discoverability.

Copilot uses AI. Check for mistakes.
var id = RandomId.Create();

// validation
var hex = id.Substring(4);
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hex = id.Substring(4) skips one extra character beyond the id_ prefix (length 3), so the test does not validate the full hex payload. Use Substring("id_".Length) (or Substring(3)) to validate all generated hex characters.

Suggested change
var hex = id.Substring(4);
var hex = id.Substring("id_".Length);

Copilot uses AI. Check for mistakes.
Comment on lines 13 to 17
/// </summary>
/// <param name="request">The request.</param>
/// <returns>The response.</returns>
Response Process(Request request);
Response Process(IRequest request);
}
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IAsset.Process still returns the concrete Response type while most of the updated request/response pipeline is moving to IRequest/IResponse. Returning Response here unnecessarily restricts implementations and makes the API inconsistent. Consider changing the return type to IResponse (as was done for IResource).

Copilot uses AI. Check for mistakes.
Comment on lines 4 to 10
<OutputType>Library</OutputType>
<Title>WebExpress.WebCore</Title>
<Version>0.0.9.0</Version>
<AssemblyVersion>0.0.9.0</AssemblyVersion>
<TargetFramework>net9.0</TargetFramework>
<Version>0.0.10.0</Version>
<AssemblyVersion>0.0.10.0</AssemblyVersion>
<TargetFramework>net10.0</TargetFramework>
<RuntimeIdentifiers>any</RuntimeIdentifiers>
<RepositoryUrl>https://github.com/webexpress-framework/WebExpress.git</RepositoryUrl>
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR description focuses on test-suite clarity/null handling, but this change set also introduces large public API changes (e.g., RequestIRequest, ResponseIResponse, new WebSocket types, new parameter abstractions, target framework bump). Please update the PR description to reflect the full scope, as this impacts reviewers and downstream consumers significantly.

Copilot uses AI. Check for mistakes.
@ReneSchwarzer ReneSchwarzer self-assigned this Apr 1, 2026
Copilot AI and others added 6 commits April 2, 2026 20:58
Copilot AI and others added 3 commits April 4, 2026 20:10
…d of hardcoding Connection: Upgrade

Agent-Logs-Url: https://github.com/webexpress-framework/WebExpress.WebCore/sessions/e8d260a2-11b1-4b7a-a8fc-0c154ce33291

Co-authored-by: ReneSchwarzer <31061438+ReneSchwarzer@users.noreply.github.com>
…entation-for-installation

Fix ResponseHeaderFields.ToString() to emit Connection header from property instead of hardcoding "Upgrade"
@ReneSchwarzer ReneSchwarzer merged commit 4a4f692 into main Apr 5, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants