From 5d7bd9bf1b91a6dc2b1ccb2df0b48914d3aebf6a Mon Sep 17 00:00:00 2001 From: Kennedy Kangethe Munga Date: Thu, 28 Apr 2022 12:11:12 +0300 Subject: [PATCH 1/6] Enable v401 requests --- src/Microsoft.OData.Client/Util.cs | 4 ++++ .../Client.TDD.Tests/Tests/DataServiceContextTests.cs | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/Microsoft.OData.Client/Util.cs b/src/Microsoft.OData.Client/Util.cs index fca4e59142..c768534cc1 100644 --- a/src/Microsoft.OData.Client/Util.cs +++ b/src/Microsoft.OData.Client/Util.cs @@ -86,6 +86,8 @@ internal static Version GetVersionFromMaxProtocolVersion(ODataProtocolVersion ma { case ODataProtocolVersion.V4: return Util.ODataVersion4; + case ODataProtocolVersion.V401: + return Util.ODataVersion401; default: Debug.Assert(false, "Unexpected max protocol version values."); return Util.ODataVersion4; @@ -231,6 +233,8 @@ internal static ODataProtocolVersion CheckEnumerationValue(ODataProtocolVersion { case ODataProtocolVersion.V4: return value; + case ODataProtocolVersion.V401: + return value; default: throw Error.ArgumentOutOfRange(parameterName); } diff --git a/test/FunctionalTests/Tests/DataServices/UnitTests/Client.TDD.Tests/Tests/DataServiceContextTests.cs b/test/FunctionalTests/Tests/DataServices/UnitTests/Client.TDD.Tests/Tests/DataServiceContextTests.cs index a120f464da..c3b0ef4077 100644 --- a/test/FunctionalTests/Tests/DataServices/UnitTests/Client.TDD.Tests/Tests/DataServiceContextTests.cs +++ b/test/FunctionalTests/Tests/DataServices/UnitTests/Client.TDD.Tests/Tests/DataServiceContextTests.cs @@ -263,6 +263,14 @@ public void SaveChangesWithBatchWithIndependentOperationsAndContinueOnErrorShoul test.ShouldThrow().WithMessage("options", ComparisonMode.Substring); } #endif + [Fact] + public void DataServiceContextCanInitializev401WithoutException() + { + DataServiceContext dsContext = null; + Action test = () => dsContext = new DataServiceContext(new Uri("http://base.org/"), ODataProtocolVersion.V401); + test.ShouldNotThrow(); + dsContext.MaxProtocolVersion.ShouldBeEquivalentTo(ODataProtocolVersion.V401); + } [Fact] public void DataServiceContextDoesNotRestrictBaseUriScheme() From 77156e8ed88355f43e0bc95af70e0bae557e45d3 Mon Sep 17 00:00:00 2001 From: Kennedy Kangethe Munga Date: Wed, 4 May 2022 08:10:36 +0300 Subject: [PATCH 2/6] Fix failing vb test --- .../DataServices/UnitTests/ClientUnitTests/PublicPlaces.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/FunctionalTests/Tests/DataServices/UnitTests/ClientUnitTests/PublicPlaces.vb b/test/FunctionalTests/Tests/DataServices/UnitTests/ClientUnitTests/PublicPlaces.vb index 5ed71037ba..537b755ce2 100644 --- a/test/FunctionalTests/Tests/DataServices/UnitTests/ClientUnitTests/PublicPlaces.vb +++ b/test/FunctionalTests/Tests/DataServices/UnitTests/ClientUnitTests/PublicPlaces.vb @@ -321,7 +321,7 @@ Partial Public Class ClientModule New MaxProtocolVersionTestCase() { New MaxProtocolVersionTestCase() With {.MaxProtocolVersion = ODataProtocolVersion.V4}, New MaxProtocolVersionTestCase() With {.MaxProtocolVersion = CType(-1, ODataProtocolVersion), .ExpectedExceptionMessage = "Specified argument was out of the range of valid values." & vbCrLf & "Parameter name: maxProtocolVersion"}, - New MaxProtocolVersionTestCase() With {.MaxProtocolVersion = CType(ODataProtocolVersion.V4 + 1, ODataProtocolVersion), .ExpectedExceptionMessage = "Specified argument was out of the range of valid values." & vbCrLf & "Parameter name: maxProtocolVersion"} + New MaxProtocolVersionTestCase() With {.MaxProtocolVersion = CType(ODataProtocolVersion.V4 + 1, ODataProtocolVersion) }, Sub(testCase) Dim context = New DataServiceContext(New Uri("http://host/service")) From 3d9211b6d7f38b7477377dc18aaf3ba9b90bb989 Mon Sep 17 00:00:00 2001 From: Kennedy Kangethe Munga Date: Wed, 4 May 2022 08:27:12 +0300 Subject: [PATCH 3/6] Add missing brace --- .../DataServices/UnitTests/ClientUnitTests/PublicPlaces.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/FunctionalTests/Tests/DataServices/UnitTests/ClientUnitTests/PublicPlaces.vb b/test/FunctionalTests/Tests/DataServices/UnitTests/ClientUnitTests/PublicPlaces.vb index 537b755ce2..caef26b9b8 100644 --- a/test/FunctionalTests/Tests/DataServices/UnitTests/ClientUnitTests/PublicPlaces.vb +++ b/test/FunctionalTests/Tests/DataServices/UnitTests/ClientUnitTests/PublicPlaces.vb @@ -321,7 +321,7 @@ Partial Public Class ClientModule New MaxProtocolVersionTestCase() { New MaxProtocolVersionTestCase() With {.MaxProtocolVersion = ODataProtocolVersion.V4}, New MaxProtocolVersionTestCase() With {.MaxProtocolVersion = CType(-1, ODataProtocolVersion), .ExpectedExceptionMessage = "Specified argument was out of the range of valid values." & vbCrLf & "Parameter name: maxProtocolVersion"}, - New MaxProtocolVersionTestCase() With {.MaxProtocolVersion = CType(ODataProtocolVersion.V4 + 1, ODataProtocolVersion) + New MaxProtocolVersionTestCase() With {.MaxProtocolVersion = CType(ODataProtocolVersion.V4 + 1, ODataProtocolVersion)} }, Sub(testCase) Dim context = New DataServiceContext(New Uri("http://host/service")) From b102519581400b04f76d85c19f0da57970d521bd Mon Sep 17 00:00:00 2001 From: Kennedy Kangethe Munga Date: Wed, 4 May 2022 09:26:50 +0300 Subject: [PATCH 4/6] Replace hardcoded ODataVersion4 --- src/Microsoft.OData.Client/ALinq/ExpressionWriter.cs | 2 +- src/Microsoft.OData.Client/ALinq/ResourceBinder.cs | 6 +++--- src/Microsoft.OData.Client/ALinq/UriWriter.cs | 2 +- src/Microsoft.OData.Client/BaseSaveResult.cs | 2 +- src/Microsoft.OData.Client/BatchSaveResult.cs | 2 +- src/Microsoft.OData.Client/DataServiceClientFormat.cs | 4 ++-- src/Microsoft.OData.Client/DataServiceContext.cs | 4 ++-- src/Microsoft.OData.Client/DataServiceRequest.cs | 2 +- src/Microsoft.OData.Client/SaveResult.cs | 8 ++++---- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.OData.Client/ALinq/ExpressionWriter.cs b/src/Microsoft.OData.Client/ALinq/ExpressionWriter.cs index 14fcfad70d..31789f787b 100644 --- a/src/Microsoft.OData.Client/ALinq/ExpressionWriter.cs +++ b/src/Microsoft.OData.Client/ALinq/ExpressionWriter.cs @@ -75,7 +75,7 @@ private ExpressionWriter(DataServiceContext context, bool inPath) this.builder = new StringBuilder(); this.expressionStack = new Stack(); this.expressionStack.Push(null); - this.uriVersion = Util.ODataVersion4; + this.uriVersion = context.MaxProtocolVersionAsVersion; this.scopeCount = 0; this.writingFunctionsInQuery = false; } diff --git a/src/Microsoft.OData.Client/ALinq/ResourceBinder.cs b/src/Microsoft.OData.Client/ALinq/ResourceBinder.cs index c99fc39a85..eba2781bdd 100644 --- a/src/Microsoft.OData.Client/ALinq/ResourceBinder.cs +++ b/src/Microsoft.OData.Client/ALinq/ResourceBinder.cs @@ -1712,7 +1712,7 @@ internal static bool MatchPropertyAccess(Expression e, DataServiceContext contex { instance = null; propertyPath = null; - uriVersion = Util.ODataVersion4; + uriVersion = context.MaxProtocolVersionAsVersion; MemberExpression me = StripTo(e); member = me; @@ -1774,7 +1774,7 @@ internal static bool MatchPropertyAccess(Expression e, DataServiceContext contex { instance = null; propertyPath = null; - uriVersion = Util.ODataVersion4; + uriVersion = context.MaxProtocolVersionAsVersion; MemberExpression me = StripTo(e); member = me; @@ -2946,7 +2946,7 @@ internal static void DisallowExpressionEndWithTypeAs(Expression exp, string meth internal static void ValidateExpandPath(Expression input, DataServiceContext context, out string expandPath, out Version uriVersion) { expandPath = null; - uriVersion = Util.ODataVersion4; + uriVersion = context.MaxProtocolVersionAsVersion; LambdaExpression le; if (PatternRules.MatchSingleArgumentLambda(input, out le)) { diff --git a/src/Microsoft.OData.Client/ALinq/UriWriter.cs b/src/Microsoft.OData.Client/ALinq/UriWriter.cs index 20ab6426b2..5bc8f2d566 100644 --- a/src/Microsoft.OData.Client/ALinq/UriWriter.cs +++ b/src/Microsoft.OData.Client/ALinq/UriWriter.cs @@ -51,7 +51,7 @@ private UriWriter(DataServiceContext context) { Debug.Assert(context != null, "context != null"); this.context = context; - this.uriVersion = Util.ODataVersion4; + this.uriVersion = context.MaxProtocolVersionAsVersion; } /// diff --git a/src/Microsoft.OData.Client/BaseSaveResult.cs b/src/Microsoft.OData.Client/BaseSaveResult.cs index 247c8c163b..62b8f2b440 100644 --- a/src/Microsoft.OData.Client/BaseSaveResult.cs +++ b/src/Microsoft.OData.Client/BaseSaveResult.cs @@ -905,7 +905,7 @@ protected ODataRequestMessageWrapper CreateRequest(LinkDescriptor binding) HeaderCollection headers = new HeaderCollection(); - headers.SetRequestVersion(Util.ODataVersion4, this.RequestInfo.MaxProtocolVersionAsVersion); + headers.SetRequestVersion(this.RequestInfo.MaxProtocolVersionAsVersion, this.RequestInfo.MaxProtocolVersionAsVersion); this.RequestInfo.Format.SetRequestAcceptHeader(headers); // if (EntityStates.Deleted || (EntityState.Modifed && null == TargetResource)) diff --git a/src/Microsoft.OData.Client/BatchSaveResult.cs b/src/Microsoft.OData.Client/BatchSaveResult.cs index f5fe794c94..98142e786b 100644 --- a/src/Microsoft.OData.Client/BatchSaveResult.cs +++ b/src/Microsoft.OData.Client/BatchSaveResult.cs @@ -298,7 +298,7 @@ private ODataRequestMessageWrapper CreateBatchRequest() { Uri requestUri = UriUtil.CreateUri(this.RequestInfo.BaseUriResolver.GetBaseUriWithSlash(), UriUtil.CreateUri("$batch", UriKind.Relative)); HeaderCollection headers = new HeaderCollection(); - headers.SetRequestVersion(Util.ODataVersion4, this.RequestInfo.MaxProtocolVersionAsVersion); + headers.SetRequestVersion(this.RequestInfo.MaxProtocolVersionAsVersion, this.RequestInfo.MaxProtocolVersionAsVersion); if (useJsonBatch) { headers.SetHeader(XmlConstants.HttpContentType, CreateApplicationJsonContentType()); diff --git a/src/Microsoft.OData.Client/DataServiceClientFormat.cs b/src/Microsoft.OData.Client/DataServiceClientFormat.cs index b13e37ecbc..2d36e7cf1b 100644 --- a/src/Microsoft.OData.Client/DataServiceClientFormat.cs +++ b/src/Microsoft.OData.Client/DataServiceClientFormat.cs @@ -326,8 +326,8 @@ private void SetRequestContentTypeHeader(HeaderCollection headers, string mediaT { if (mediaType == MimeApplicationJsonODataLight) { - // set the request version to 4.0 - headers.SetRequestVersion(Util.ODataVersion4, this.context.MaxProtocolVersionAsVersion); + // set the request version to 4.0 or 4.01 depending on what is set in tha DataServiceContext. + headers.SetRequestVersion(this.context.MaxProtocolVersionAsVersion, this.context.MaxProtocolVersionAsVersion); } headers.SetHeaderIfUnset(XmlConstants.HttpContentType, mediaType); diff --git a/src/Microsoft.OData.Client/DataServiceContext.cs b/src/Microsoft.OData.Client/DataServiceContext.cs index a54797afb2..00ba13b77e 100644 --- a/src/Microsoft.OData.Client/DataServiceContext.cs +++ b/src/Microsoft.OData.Client/DataServiceContext.cs @@ -3648,7 +3648,7 @@ private LoadPropertyResult CreateLoadPropertyRequest(object entity, string prope } } - requestVersion = Util.ODataVersion4; + requestVersion = this.MaxProtocolVersionAsVersion; HeaderCollection headers = new HeaderCollection(); @@ -3812,7 +3812,7 @@ private GetReadStreamResult CreateGetReadStreamResult( } else { - version = Util.ODataVersion4; + version = this.MaxProtocolVersionAsVersion; if (!entityDescriptor.TryGetNamedStreamInfo(name, out streamDescriptor)) { throw new ArgumentException(Strings.Context_EntityDoesNotContainNamedStream(name), nameof(name)); diff --git a/src/Microsoft.OData.Client/DataServiceRequest.cs b/src/Microsoft.OData.Client/DataServiceRequest.cs index 6788ebc089..00ddb53f8d 100644 --- a/src/Microsoft.OData.Client/DataServiceRequest.cs +++ b/src/Microsoft.OData.Client/DataServiceRequest.cs @@ -195,7 +195,7 @@ internal TElement GetValue(DataServiceContext context, Func Date: Wed, 4 May 2022 09:54:58 +0300 Subject: [PATCH 5/6] Fix SelectExpandPathBuilder --- src/Microsoft.OData.Client/ALinq/ProjectionAnalyzer.cs | 5 ++++- .../ALinq/SelectExpandPathBuilder.cs | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OData.Client/ALinq/ProjectionAnalyzer.cs b/src/Microsoft.OData.Client/ALinq/ProjectionAnalyzer.cs index 35d221a9cf..62297cc9fa 100644 --- a/src/Microsoft.OData.Client/ALinq/ProjectionAnalyzer.cs +++ b/src/Microsoft.OData.Client/ALinq/ProjectionAnalyzer.cs @@ -229,7 +229,10 @@ private static void Analyze(MemberInitExpression mie, SelectExpandPathBuilder pb /// Context of expression to analyze. private static void AnalyzeResourceExpression(LambdaExpression lambda, ResourceExpression resource, DataServiceContext context) { - SelectExpandPathBuilder pb = new SelectExpandPathBuilder(); + SelectExpandPathBuilder pb = new SelectExpandPathBuilder() + { + UriVersion = context.MaxProtocolVersionAsVersion + }; ProjectionAnalyzer.Analyze(lambda, pb, context); resource.Projection = new ProjectionQueryOptionExpression(lambda.Body.Type, lambda, pb.ProjectionPaths.ToList()); resource.ExpandPaths = pb.ExpandPaths.Union(resource.ExpandPaths, StringComparer.Ordinal).ToList(); diff --git a/src/Microsoft.OData.Client/ALinq/SelectExpandPathBuilder.cs b/src/Microsoft.OData.Client/ALinq/SelectExpandPathBuilder.cs index 7fb628a5db..8de1a2e3ad 100644 --- a/src/Microsoft.OData.Client/ALinq/SelectExpandPathBuilder.cs +++ b/src/Microsoft.OData.Client/ALinq/SelectExpandPathBuilder.cs @@ -75,7 +75,6 @@ internal class SelectExpandPathBuilder public SelectExpandPathBuilder() { firstSegmentInNewPath = true; - this.uriVersion = Util.ODataVersion4; } /// @@ -107,7 +106,11 @@ public Version UriVersion { get { - return this.uriVersion; + return this.uriVersion ?? Util.ODataVersion4; + } + set + { + this.uriVersion = value; } } From eae680482dc0c30cf773674c5cba58fec727b5e8 Mon Sep 17 00:00:00 2001 From: Kennedy Kangethe Munga Date: Wed, 4 May 2022 11:06:58 +0300 Subject: [PATCH 6/6] Avoid the DetermineRequestVersion method --- src/Microsoft.OData.Client/BaseSaveResult.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OData.Client/BaseSaveResult.cs b/src/Microsoft.OData.Client/BaseSaveResult.cs index 62b8f2b440..e19f21da14 100644 --- a/src/Microsoft.OData.Client/BaseSaveResult.cs +++ b/src/Microsoft.OData.Client/BaseSaveResult.cs @@ -936,7 +936,8 @@ protected ODataRequestMessageWrapper CreateRequest(EntityDescriptor entityDescri ClientEdmModel model = this.RequestInfo.Model; ClientTypeAnnotation clientType = model.GetClientTypeAnnotation(model.GetOrCreateEdmType(entityDescriptor.Entity.GetType())); - Version requestVersion = DetermineRequestVersion(clientType); + //Version requestVersion = DetermineRequestVersion(clientType); + Version requestVersion = this.RequestInfo.MaxProtocolVersionAsVersion; string httpMethod = this.GetHttpMethod(state, ref requestVersion); HeaderCollection headers = new HeaderCollection();