Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions .pubnub.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
name: c-sharp
version: "5.3.0"
version: "5.4.0"
schema: 1
scm: github.com/pubnub/c-sharp
changelog:
- date: 2021-12-16
version: v5.4.0
changes:
- type: bug
text: "Replaced BouncyCastle lib with System.Security.Cryptography.Algorithms."
- type: bug
text: "Added try/catch for publish operation to catch exceptions."
- date: 2021-11-16
version: v5.3.0
changes:
Expand Down Expand Up @@ -614,7 +621,7 @@ features:
- QUERY-PARAM
supported-platforms:
-
version: Pubnub 'C#' 5.3.0
version: Pubnub 'C#' 5.4.0
platforms:
- Windows 10 and up
- Windows Server 2008 and up
Expand All @@ -624,7 +631,7 @@ supported-platforms:
- .Net Framework 4.5
- .Net Framework 4.6.1+
-
version: PubnubPCL 'C#' 5.3.0
version: PubnubPCL 'C#' 5.4.0
platforms:
- Xamarin.Android
- Xamarin.iOS
Expand All @@ -643,7 +650,7 @@ supported-platforms:
- .Net Standard 2.1
- .Net Core
-
version: PubnubUWP 'C#' 5.3.0
version: PubnubUWP 'C#' 5.4.0
platforms:
- Windows Phone 10
- Universal Windows Apps
Expand All @@ -667,7 +674,7 @@ sdks:
distribution-type: source
distribution-repository: Github
package-name: Pubnub
location: https://github.com/pubnub/c-sharp/releases/tag/v5.3.0.0
location: https://github.com/pubnub/c-sharp/releases/tag/v5.4.0.0
requires:
-
name: ".Net"
Expand Down Expand Up @@ -964,7 +971,7 @@ sdks:
distribution-type: source
distribution-repository: GitHub
package-name: PubNubPCL
location: https://github.com/pubnub/c-sharp/releases/tag/v5.3.0.0
location: https://github.com/pubnub/c-sharp/releases/tag/v5.4.0.0
requires:
-
name: ".Net Core"
Expand Down Expand Up @@ -1337,7 +1344,7 @@ sdks:
distribution-type: source
distribution-repository: Github
package-name: PubnubUWP
location: https://github.com/pubnub/c-sharp/releases/tag/v5.3.0.0
location: https://github.com/pubnub/c-sharp/releases/tag/v5.4.0.0
requires:
-
name: "Universal Windows Platform Development"
Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
v5.4.0 - December 16 2021
-----------------------------
- Fixed: replaced BouncyCastle lib with System.Security.Cryptography.Algorithms.
- Fixed: added try/catch for publish operation to catch exceptions.

v5.3.0 - November 16 2021
-----------------------------
- Added: added RevokeToken feature.
Expand Down
186 changes: 105 additions & 81 deletions src/Api/PubnubApi/EndPoint/PubSub/PublishOperation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -205,67 +205,81 @@ internal void Publish(string channel, object message, bool storeInHistory, int t
return;
}

string requestMethodName = (this.httpPost) ? "POST" : "GET";
IUrlRequestBuilder urlBuilder = new UrlRequestBuilder(config, jsonLibrary, unit, pubnubLog, pubnubTelemetryMgr, (PubnubInstance != null && !string.IsNullOrEmpty(PubnubInstance.InstanceId) && PubnubTokenMgrCollection.ContainsKey(PubnubInstance.InstanceId)) ? PubnubTokenMgrCollection[PubnubInstance.InstanceId] : null, (PubnubInstance != null) ? PubnubInstance.InstanceId : "");

Uri request = urlBuilder.BuildPublishRequest(requestMethodName, "", channel, message, storeInHistory, ttl, metaData, null, externalQueryParam);

RequestState<PNPublishResult> requestState = new RequestState<PNPublishResult>();
requestState.Channels = new [] { channel };
requestState.ResponseType = PNOperationType.PNPublishOperation;
requestState.PubnubCallback = callback;
requestState.Reconnect = false;
requestState.EndPointOperation = this;
try
{
string requestMethodName = (this.httpPost) ? "POST" : "GET";
IUrlRequestBuilder urlBuilder = new UrlRequestBuilder(config, jsonLibrary, unit, pubnubLog, pubnubTelemetryMgr, (PubnubInstance != null && !string.IsNullOrEmpty(PubnubInstance.InstanceId) && PubnubTokenMgrCollection.ContainsKey(PubnubInstance.InstanceId)) ? PubnubTokenMgrCollection[PubnubInstance.InstanceId] : null, (PubnubInstance != null) ? PubnubInstance.InstanceId : "");

string json = "";
Uri request = urlBuilder.BuildPublishRequest(requestMethodName, "", channel, message, storeInHistory, ttl, metaData, null, externalQueryParam);

if (this.httpPost)
{
requestState.UsePostMethod = true;
string postMessage = JsonEncodePublishMsg(message);
byte[] postData = Encoding.UTF8.GetBytes(postMessage);
UrlProcessRequest<PNPublishResult>(request, requestState, false, postData).ContinueWith(r =>
requestState.Channels = new[] { channel };
requestState.ResponseType = PNOperationType.PNPublishOperation;
requestState.PubnubCallback = callback;
requestState.Reconnect = false;
requestState.EndPointOperation = this;

string json = "";

if (this.httpPost)
{
json = r.Result.Item1;
}, TaskContinuationOptions.ExecuteSynchronously).Wait();
}
else
{
UrlProcessRequest<PNPublishResult>(request, requestState, false).ContinueWith(r =>
requestState.UsePostMethod = true;
string postMessage = JsonEncodePublishMsg(message);
byte[] postData = Encoding.UTF8.GetBytes(postMessage);
UrlProcessRequest<PNPublishResult>(request, requestState, false, postData).ContinueWith(r =>
{
json = r.Result.Item1;
}, TaskContinuationOptions.ExecuteSynchronously).Wait();
}
else
{
json = r.Result.Item1;
}, TaskContinuationOptions.ExecuteSynchronously).Wait();
}

if (!string.IsNullOrEmpty(json))
{
List<object> result = ProcessJsonResponse(requestState, json);
UrlProcessRequest<PNPublishResult>(request, requestState, false).ContinueWith(r =>
{
json = r.Result.Item1;
}, TaskContinuationOptions.ExecuteSynchronously).Wait();
}

if (result != null && result.Count >= 3)
if (!string.IsNullOrEmpty(json))
{
int publishStatus;
Int32.TryParse(result[0].ToString(), out publishStatus);
if (publishStatus == 1)
List<object> result = ProcessJsonResponse(requestState, json);

if (result != null && result.Count >= 3)
{
ProcessResponseCallbacks(result, requestState);
int publishStatus;
Int32.TryParse(result[0].ToString(), out publishStatus);
if (publishStatus == 1)
{
ProcessResponseCallbacks(result, requestState);
}
else
{
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(400, result[1].ToString());
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse<PNPublishResult>(PNOperationType.PNPublishOperation, category, requestState, 400, new PNException(json));
if (requestState.PubnubCallback != null)
{
requestState.PubnubCallback.OnResponse(default(PNPublishResult), status);
}
}
}
else
{
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(400, result[1].ToString());
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse<PNPublishResult>(PNOperationType.PNPublishOperation, category, requestState, 400, new PNException(json));
if (requestState.PubnubCallback != null)
{
requestState.PubnubCallback.OnResponse(default(PNPublishResult), status);
}
ProcessResponseCallbacks(result, requestState);
}
}
else

CleanUp();
}
catch (Exception ex)
{
int statusCode = PNStatusCodeHelper.GetHttpStatusCode(ex.ToString());
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, ex.ToString());
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishOperation, category, requestState, statusCode, new PNException(ex.ToString()));
if (requestState.PubnubCallback != null)
{
ProcessResponseCallbacks(result, requestState);
requestState.PubnubCallback.OnResponse(default(PNPublishResult), status);
}
}

CleanUp();
}
}

internal async Task<PNResult<PNPublishResult>> Publish(string channel, object message, bool storeInHistory, int ttl, Dictionary<string, object> metaData, Dictionary<string, object> externalQueryParam)
Copy link
Contributor

Choose a reason for hiding this comment

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

Most of the code is repeated in this method

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yeah..due to async/await and callback style outputs, some code was repeated due to threading issues. In the current PR only catch block section code was added to handle unknown exception which customer could not share. Remaining code nothing changed.

Expand All @@ -290,56 +304,66 @@ internal async Task<PNResult<PNPublishResult>> Publish(string channel, object me
return ret;
}

string requestMethodName = (this.httpPost) ? "POST" : "GET";
IUrlRequestBuilder urlBuilder = new UrlRequestBuilder(config, jsonLibrary, unit, pubnubLog, pubnubTelemetryMgr, (PubnubInstance != null && !string.IsNullOrEmpty(PubnubInstance.InstanceId) && PubnubTokenMgrCollection.ContainsKey(PubnubInstance.InstanceId)) ? PubnubTokenMgrCollection[PubnubInstance.InstanceId] : null, (PubnubInstance != null) ? PubnubInstance.InstanceId : "");

Uri request = urlBuilder.BuildPublishRequest(requestMethodName, "", channel, message, storeInHistory, ttl, metaData, null, externalQueryParam);

RequestState<PNPublishResult> requestState = new RequestState<PNPublishResult>();
requestState.Channels = new[] { channel };
requestState.ResponseType = PNOperationType.PNPublishOperation;
requestState.Reconnect = false;
requestState.EndPointOperation = this;
try
{
string requestMethodName = (this.httpPost) ? "POST" : "GET";
IUrlRequestBuilder urlBuilder = new UrlRequestBuilder(config, jsonLibrary, unit, pubnubLog, pubnubTelemetryMgr, (PubnubInstance != null && !string.IsNullOrEmpty(PubnubInstance.InstanceId) && PubnubTokenMgrCollection.ContainsKey(PubnubInstance.InstanceId)) ? PubnubTokenMgrCollection[PubnubInstance.InstanceId] : null, (PubnubInstance != null) ? PubnubInstance.InstanceId : "");

Tuple<string, PNStatus> JsonAndStatusTuple;
Uri request = urlBuilder.BuildPublishRequest(requestMethodName, "", channel, message, storeInHistory, ttl, metaData, null, externalQueryParam);

if (this.httpPost)
{
requestState.UsePostMethod = true;
string postMessage = JsonEncodePublishMsg(message);
byte[] postData = Encoding.UTF8.GetBytes(postMessage);
JsonAndStatusTuple = await UrlProcessRequest(request, requestState, false, postData).ConfigureAwait(false);
}
else
{
JsonAndStatusTuple = await UrlProcessRequest(request, requestState, false).ConfigureAwait(false);
}
ret.Status = JsonAndStatusTuple.Item2;
string json = JsonAndStatusTuple.Item1;
requestState.Channels = new[] { channel };
requestState.ResponseType = PNOperationType.PNPublishOperation;
requestState.Reconnect = false;
requestState.EndPointOperation = this;

if (!string.IsNullOrEmpty(json))
{
List<object> result = ProcessJsonResponse(requestState, json);
Tuple<string, PNStatus> JsonAndStatusTuple;

if (this.httpPost)
{
requestState.UsePostMethod = true;
string postMessage = JsonEncodePublishMsg(message);
byte[] postData = Encoding.UTF8.GetBytes(postMessage);
JsonAndStatusTuple = await UrlProcessRequest(request, requestState, false, postData).ConfigureAwait(false);
}
else
{
JsonAndStatusTuple = await UrlProcessRequest(request, requestState, false).ConfigureAwait(false);
}
ret.Status = JsonAndStatusTuple.Item2;
string json = JsonAndStatusTuple.Item1;

if (result != null && result.Count >= 3)
if (!string.IsNullOrEmpty(json))
{
int publishStatus;
Int32.TryParse(result[0].ToString(), out publishStatus);
if (publishStatus == 1)
List<object> result = ProcessJsonResponse(requestState, json);

if (result != null && result.Count >= 3)
{
List<object> resultList = ProcessJsonResponse(requestState, json);
if (resultList != null && resultList.Count > 0)
int publishStatus;
Int32.TryParse(result[0].ToString(), out publishStatus);
if (publishStatus == 1)
{
ResponseBuilder responseBuilder = new ResponseBuilder(config, jsonLibrary, pubnubLog);
PNPublishResult responseResult = responseBuilder.JsonToObject<PNPublishResult>(resultList, true);
if (responseResult != null)
List<object> resultList = ProcessJsonResponse(requestState, json);
if (resultList != null && resultList.Count > 0)
{
ret.Result = responseResult;
ResponseBuilder responseBuilder = new ResponseBuilder(config, jsonLibrary, pubnubLog);
PNPublishResult responseResult = responseBuilder.JsonToObject<PNPublishResult>(resultList, true);
if (responseResult != null)
{
ret.Result = responseResult;
}
}
}
}
}
}
catch (Exception ex)
{
int statusCode = PNStatusCodeHelper.GetHttpStatusCode(ex.ToString());
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, ex.ToString());
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishOperation, category, requestState, statusCode, new PNException(ex.ToString()));
ret.Status = status;
}

return ret;
}
Expand Down
4 changes: 2 additions & 2 deletions src/Api/PubnubApi/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
[assembly: AssemblyProduct("Pubnub C# SDK")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("5.3.0.0")]
[assembly: AssemblyFileVersion("5.3.0.0")]
[assembly: AssemblyVersion("5.4.0.0")]
[assembly: AssemblyFileVersion("5.4.0.0")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
Expand Down
15 changes: 5 additions & 10 deletions src/Api/PubnubApi/PubnubApi.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,16 @@

<PropertyGroup>
<PackageId>Pubnub</PackageId>
<PackageVersion>5.3.0.0</PackageVersion>
<PackageVersion>5.4.0.0</PackageVersion>
<Title>PubNub C# .NET - Web Data Push API</Title>
<Authors>Pandu Masabathula</Authors>
<Owners>PubNub</Owners>
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
<PackageIconUrl>http://pubnub.s3.amazonaws.com/2011/powered-by-pubnub/pubnub-icon-600x600.png</PackageIconUrl>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<RepositoryUrl>https://github.com/pubnub/c-sharp/</RepositoryUrl>
<PackageReleaseNotes>Added RevokeToken feature.</PackageReleaseNotes>
<PackageReleaseNotes>Replaced BouncyCastle lib with System.Security.Cryptography.Algorithms.
Added try/catch for publish operation to catch exceptions.</PackageReleaseNotes>
<PackageTags>Web Data Push Real-time Notifications ESB Message Broadcasting Distributed Computing</PackageTags>
<!--<Summary>PubNub is a Massively Scalable Web Push Service for Web and Mobile Games. This is a cloud-based service for broadcasting messages to thousands of web and mobile clients simultaneously</Summary>-->
<Description>PubNub is a Massively Scalable Web Push Service for Web and Mobile Games. This is a cloud-based service for broadcasting messages to thousands of web and mobile clients simultaneously</Description>
Expand Down Expand Up @@ -85,9 +86,6 @@
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net40'">
<PackageReference Include="Portable.BouncyCastle" Version="1.8.1.2">
<PrivateAssets>None</PrivateAssets>
</PackageReference>
<PackageReference Include="AsyncBridge.JetBrains" Version="0.1.1">
<PrivateAssets>None</PrivateAssets>
</PackageReference>
Expand All @@ -99,9 +97,6 @@
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
<PackageReference Include="Portable.BouncyCastle" Version="1.8.1.2">
<PrivateAssets>None</PrivateAssets>
</PackageReference>
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
<PackageReference Include="System.ValueTuple" Version="4.4.0">
Expand All @@ -110,8 +105,8 @@
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net461'">
<PackageReference Include="Portable.BouncyCastle" Version="1.8.1.2">
<PrivateAssets>None</PrivateAssets>
<PackageReference Include="System.Security.Cryptography.Algorithms">
<Version>4.3.0</Version>
</PackageReference>
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
Expand Down
Loading