Conversation
…ilter logic, and added IQuery support
There was a problem hiding this comment.
Pull request overview
This PR bumps the WebExpress.WebCore package to 0.0.10-alpha and introduces broad API refactors (notably Request→IRequest, Response→IResponse, and Parameter→IParameter 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.
| /// <summary> | ||
| /// Returns the URI to which the user is redirected. | ||
| /// </summary> | ||
| IUri Uri { get; internal set; } |
There was a problem hiding this comment.
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.
| if (!string.IsNullOrWhiteSpace(Upgrade)) | ||
| { | ||
| sb.AppendLine("Upgrade: " + Upgrade); | ||
| sb.AppendLine("Connection: Upgrade"); | ||
| } |
There was a problem hiding this comment.
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).
| Cookies = requestFeature.Headers.Cookie | ||
| .Select(c => | ||
| { | ||
| var split = c.Split('='); | ||
| return new Cookie(split[0], split[1]); | ||
| }); |
There was a problem hiding this comment.
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.
| 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); | ||
|
|
There was a problem hiding this comment.
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.
| 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); | ||
| } |
There was a problem hiding this comment.
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.
| /// <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; } | ||
|
|
There was a problem hiding this comment.
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.
| /// <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); | ||
| } |
There was a problem hiding this comment.
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.
| var id = RandomId.Create(); | ||
|
|
||
| // validation | ||
| var hex = id.Substring(4); |
There was a problem hiding this comment.
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.
| var hex = id.Substring(4); | |
| var hex = id.Substring("id_".Length); |
| /// </summary> | ||
| /// <param name="request">The request.</param> | ||
| /// <returns>The response.</returns> | ||
| Response Process(Request request); | ||
| Response Process(IRequest request); | ||
| } |
There was a problem hiding this comment.
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).
| <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> |
There was a problem hiding this comment.
The PR description focuses on test-suite clarity/null handling, but this change set also introduces large public API changes (e.g., Request→IRequest, Response→IResponse, 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.
…interface visibility, WebSocket headers Agent-Logs-Url: https://github.com/webexpress-framework/WebExpress.WebCore/sessions/21fd93fa-c2a8-4f06-a85f-237eec4ad043 Co-authored-by: ReneSchwarzer <31061438+ReneSchwarzer@users.noreply.github.com>
…e-documentation Fix PR #10 review comments: null safety, interface visibility, cookie parsing, WebSocket headers, typos
…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"
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.