Skip to content

Commit 3b772b1

Browse files
committed
F Added error handling
1 parent de10588 commit 3b772b1

File tree

6 files changed

+81
-53
lines changed

6 files changed

+81
-53
lines changed

src/Directory.Build.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
<Project>
22
<PropertyGroup>
33
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
4-
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
54
<Nullable>disable</Nullable>
65
<Title>$(ProjectName)</Title>
7-
<Version>0.5.0</Version>
6+
<Version>0.5.1</Version>
87
<Authors>Lukas Volf</Authors>
98
<Copyright>MIT</Copyright>
109
<PackageProjectUrl>https://github.com/jimm98y/SharpOnvif</PackageProjectUrl>
@@ -18,6 +17,7 @@
1817
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1918
<Description>A C# implementation of the Onvif interface - client as well as the server. All profiles are supported.</Description>
2019
</PropertyGroup>
20+
2121
<ItemGroup>
2222
<None Include="..\..\README.md">
2323
<Pack>True</Pack>

src/OnvifService/Onvif/DeviceImpl.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Microsoft.Extensions.Configuration;
44
using Microsoft.Extensions.Logging;
55
using SharpOnvifCommon;
6-
using SharpOnvifServer;
76
using SharpOnvifServer.DeviceMgmt;
87
using System;
98
using System.Linq;

src/OnvifService/Onvif/MediaImpl.cs

Lines changed: 30 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Microsoft.Extensions.Logging;
55
using SharpOnvifCommon;
66
using SharpOnvifCommon.PTZ;
7+
using SharpOnvifServer;
78
using SharpOnvifServer.Media;
89
using System;
910
using System.Collections.Generic;
@@ -50,41 +51,35 @@ public MediaImpl(IServer server, ILogger<MediaImpl> logger, IConfiguration confi
5051

5152
public override GetAudioSourcesResponse GetAudioSources(GetAudioSourcesRequest request)
5253
{
53-
if (Profiles == null)
54-
return new GetAudioSourcesResponse();
55-
5654
return new GetAudioSourcesResponse()
5755
{
58-
AudioSources = Profiles.Values.Select(GetMyAudioSource).ToArray()
56+
AudioSources = Profiles?.Values.Select(GetMyAudioSource).ToArray()
5957
};
6058
}
6159

6260
public override GetProfilesResponse GetProfiles(GetProfilesRequest request)
6361
{
64-
if (Profiles == null)
65-
return new GetProfilesResponse();
66-
6762
return new GetProfilesResponse()
6863
{
69-
Profiles = Profiles.Values.Select(CreateProfile).ToArray()
64+
Profiles = Profiles?.Values.Select(CreateMyProfile).ToArray()
7065
};
7166
}
7267

7368
[return: MessageParameter(Name = "Profile")]
7469
public override Profile GetProfile(string ProfileToken)
7570
{
7671
if (Profiles == null || !Profiles.ContainsKey(ProfileToken))
77-
return new Profile();
72+
OnvifErrors.ReturnSenderInvalidArg();
7873

79-
return CreateProfile(Profiles[ProfileToken]);
74+
return CreateMyProfile(Profiles[ProfileToken]);
8075
}
8176

8277
public override MediaUri GetSnapshotUri(string ProfileToken)
8378
{
8479
Uri endpointUri = OperationContext.Current.IncomingMessageProperties.Via;
8580

8681
if (Profiles == null || !Profiles.ContainsKey(ProfileToken))
87-
return new MediaUri();
82+
OnvifErrors.ReturnSenderInvalidArg();
8883

8984
return new MediaUri()
9085
{
@@ -95,7 +90,7 @@ public override MediaUri GetSnapshotUri(string ProfileToken)
9590
public override MediaUri GetStreamUri(StreamSetup StreamSetup, string ProfileToken)
9691
{
9792
if (Profiles == null || !Profiles.ContainsKey(ProfileToken))
98-
return new MediaUri();
93+
OnvifErrors.ReturnSenderInvalidArg();
9994

10095
return new MediaUri()
10196
{
@@ -105,20 +100,17 @@ public override MediaUri GetStreamUri(StreamSetup StreamSetup, string ProfileTok
105100

106101
public override GetVideoSourcesResponse GetVideoSources(GetVideoSourcesRequest request)
107102
{
108-
if (Profiles == null)
109-
return new GetVideoSourcesResponse();
110-
111103
return new GetVideoSourcesResponse()
112104
{
113-
VideoSources = Profiles.Values.Select(CreateMyVideoSource).ToArray()
105+
VideoSources = Profiles?.Values.Select(CreateMyVideoSource).ToArray()
114106
};
115107
}
116108

117109
[return: MessageParameter(Name = "Configuration")]
118110
public override VideoSourceConfiguration GetVideoSourceConfiguration(string ConfigurationToken)
119111
{
120112
if (ConfigurationToken == null || Profiles == null || Profiles.Values.FirstOrDefault(x => x.VideoSourceToken == ConfigurationToken) == null)
121-
return new VideoSourceConfiguration();
113+
OnvifErrors.ReturnSenderInvalidArg();
122114

123115
return GetMyVideoSourceConfiguration(Profiles.Values.First(x => x.VideoSourceToken == ConfigurationToken));
124116
}
@@ -127,16 +119,16 @@ public override VideoSourceConfiguration GetVideoSourceConfiguration(string Conf
127119
public override VideoEncoderConfiguration GetVideoEncoderConfiguration(string ConfigurationToken)
128120
{
129121
if (ConfigurationToken == null || Profiles == null || Profiles.Values.FirstOrDefault(x => x.VideoEncoderToken == ConfigurationToken) == null)
130-
return new VideoEncoderConfiguration();
122+
OnvifErrors.ReturnSenderInvalidArg();
131123

132124
return GetMyVideoEncoderConfiguration(Profiles.Values.First(x => x.VideoEncoderToken == ConfigurationToken));
133125
}
134126

135127
[return: MessageParameter(Name = "Options")]
136128
public override VideoEncoderConfigurationOptions GetVideoEncoderConfigurationOptions(string ConfigurationToken, string ProfileToken)
137129
{
138-
if (Profiles == null || !Profiles.ContainsKey(ProfileToken))
139-
return new VideoEncoderConfigurationOptions();
130+
if (Profiles == null || !Profiles.ContainsKey(ProfileToken) || Profiles.Values.FirstOrDefault(x => x.VideoEncoderToken == ConfigurationToken) == null)
131+
OnvifErrors.ReturnSenderInvalidArg();
140132

141133
return new VideoEncoderConfigurationOptions()
142134
{
@@ -163,56 +155,44 @@ public override VideoEncoderConfigurationOptions GetVideoEncoderConfigurationOpt
163155
[return: MessageParameter(Name = "Configurations")]
164156
public override GetAudioEncoderConfigurationsResponse GetAudioEncoderConfigurations(GetAudioEncoderConfigurationsRequest request)
165157
{
166-
if (Profiles == null)
167-
return new GetAudioEncoderConfigurationsResponse();
168-
169158
return new GetAudioEncoderConfigurationsResponse()
170159
{
171-
Configurations = Profiles.Values.Select(GetMyAudioEncoderConfiguration).ToArray()
160+
Configurations = Profiles?.Values.Select(GetMyAudioEncoderConfiguration).ToArray()
172161
};
173162
}
174163

175164
[return: MessageParameter(Name = "Configurations")]
176165
public override GetAudioSourceConfigurationsResponse GetAudioSourceConfigurations(GetAudioSourceConfigurationsRequest request)
177166
{
178-
if (Profiles == null)
179-
return new GetAudioSourceConfigurationsResponse();
180-
181167
return new GetAudioSourceConfigurationsResponse()
182168
{
183-
Configurations = Profiles.Values.Select(GetMyAudioSourceConfiguration).ToArray()
169+
Configurations = Profiles?.Values.Select(GetMyAudioSourceConfiguration).ToArray()
184170
};
185171
}
186172

187173
[return: MessageParameter(Name = "Configurations")]
188174
public override GetVideoEncoderConfigurationsResponse GetVideoEncoderConfigurations(GetVideoEncoderConfigurationsRequest request)
189175
{
190-
if (Profiles == null)
191-
return new GetVideoEncoderConfigurationsResponse();
192-
193176
return new GetVideoEncoderConfigurationsResponse()
194177
{
195-
Configurations = Profiles.Values.Select(GetMyVideoEncoderConfiguration).ToArray()
178+
Configurations = Profiles?.Values.Select(GetMyVideoEncoderConfiguration).ToArray()
196179
};
197180
}
198181

199182
[return: MessageParameter(Name = "Configurations")]
200183
public override GetVideoSourceConfigurationsResponse GetVideoSourceConfigurations(GetVideoSourceConfigurationsRequest request)
201184
{
202-
if (Profiles == null)
203-
return new GetVideoSourceConfigurationsResponse();
204-
205185
return new GetVideoSourceConfigurationsResponse()
206186
{
207-
Configurations = Profiles.Values.Select(GetMyVideoSourceConfiguration).ToArray()
187+
Configurations = Profiles?.Values.Select(GetMyVideoSourceConfiguration).ToArray()
208188
};
209189
}
210190

211191
[return: MessageParameter(Name = "Options")]
212192
public override VideoSourceConfigurationOptions GetVideoSourceConfigurationOptions(string ConfigurationToken, string ProfileToken)
213193
{
214-
if (Profiles == null || !Profiles.ContainsKey(ProfileToken))
215-
return new VideoSourceConfigurationOptions();
194+
if (Profiles == null || !Profiles.ContainsKey(ProfileToken) || Profiles.Values.FirstOrDefault(x => x.VideoSourceToken == ConfigurationToken) == null)
195+
OnvifErrors.ReturnSenderInvalidArg();
216196

217197
return new VideoSourceConfigurationOptions()
218198
{
@@ -243,7 +223,7 @@ public override VideoSourceConfigurationOptions GetVideoSourceConfigurationOptio
243223
public override GetCompatibleVideoEncoderConfigurationsResponse GetCompatibleVideoEncoderConfigurations(GetCompatibleVideoEncoderConfigurationsRequest request)
244224
{
245225
if (Profiles == null)
246-
return new GetCompatibleVideoEncoderConfigurationsResponse();
226+
OnvifErrors.ReturnSenderInvalidArg();
247227

248228
return new GetCompatibleVideoEncoderConfigurationsResponse()
249229
{
@@ -256,16 +236,7 @@ public override GetCompatibleAudioDecoderConfigurationsResponse GetCompatibleAud
256236
{
257237
return new GetCompatibleAudioDecoderConfigurationsResponse()
258238
{
259-
Configurations = Profiles.Values.Select(CreateMyAudioDecoderConfiguration).ToArray()
260-
};
261-
}
262-
263-
private AudioDecoderConfiguration CreateMyAudioDecoderConfiguration(MediaProfile profile)
264-
{
265-
return new AudioDecoderConfiguration()
266-
{
267-
token = profile.AudioDecoderToken,
268-
Name = profile.AudioDecoderToken,
239+
Configurations = Profiles?.Values.Select(CreateMyAudioDecoderConfiguration).ToArray()
269240
};
270241
}
271242

@@ -315,7 +286,16 @@ public override void AddAudioDecoderConfiguration(string ProfileToken, string Co
315286
_logger.LogInformation("MediaImpl: AddAudioDecoderConfiguration");
316287
}
317288

318-
private static Profile CreateProfile(MediaProfile profile)
289+
private AudioDecoderConfiguration CreateMyAudioDecoderConfiguration(MediaProfile profile)
290+
{
291+
return new AudioDecoderConfiguration()
292+
{
293+
token = profile.AudioDecoderToken,
294+
Name = profile.AudioDecoderToken,
295+
};
296+
}
297+
298+
private static Profile CreateMyProfile(MediaProfile profile)
319299
{
320300
return new Profile()
321301
{

src/OnvifService/OnvifService.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<ItemGroup>
1616
<PackageReference Include="CoreWCF.Http" Version="1.8.0" />
1717
<PackageReference Include="CoreWCF.Primitives" Version="1.8.0" />
18+
<PackageReference Include="CoreWCF.WebHttp" Version="1.8.0" />
1819
</ItemGroup>
1920
<ItemGroup>
2021
<ProjectReference Include="..\SharpOnvifServer.DeviceMgmt\SharpOnvifServer.DeviceMgmt.csproj" />
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using CoreWCF;
2+
using CoreWCF.Web;
3+
using System.Net;
4+
5+
namespace SharpOnvifServer
6+
{
7+
public static class OnvifErrors
8+
{
9+
/// <summary>
10+
/// Returns 400 Bad Request with InvalidArgVal error code.
11+
/// </summary>
12+
/// <exception cref="FaultException"></exception>
13+
public static void ReturnSenderInvalidArg()
14+
{
15+
ReturnSenderError("Argument Value Invalid", "InvalidArgVal");
16+
}
17+
18+
/// <summary>
19+
/// Returns 400 Bad Request with ActionNotSupported error code.
20+
/// </summary>
21+
/// <exception cref="FaultException"></exception>
22+
public static void ReturnReceiverActionNotSupported()
23+
{
24+
ReturnReceiverError("Action Not Supported", "ActionNotSupported");
25+
}
26+
27+
/// <summary>
28+
/// Returns receiver error.
29+
/// </summary>
30+
/// <exception cref="FaultException"></exception>
31+
public static void ReturnReceiverError(string reason, string subcodeName, string subcodeNamespace = "http://www.onvif.org/ver10/error", HttpStatusCode httpStatusCode = HttpStatusCode.BadRequest)
32+
{
33+
WebOperationContext.Current.OutgoingResponse.StatusCode = httpStatusCode; // changes the default 500 status code
34+
throw new FaultException(new FaultReason(reason), FaultCode.CreateReceiverFaultCode(subcodeName, subcodeNamespace));
35+
}
36+
37+
/// <summary>
38+
/// Returns sender error.
39+
/// </summary>
40+
/// <exception cref="FaultException"></exception>
41+
public static void ReturnSenderError(string reason, string subcodeName, string subcodeNamespace = "http://www.onvif.org/ver10/error", HttpStatusCode httpStatusCode = HttpStatusCode.BadRequest)
42+
{
43+
WebOperationContext.Current.OutgoingResponse.StatusCode = httpStatusCode; // changes the default 500 status code
44+
throw new FaultException(new FaultReason(reason), FaultCode.CreateSenderFaultCode(subcodeName, subcodeNamespace));
45+
}
46+
}
47+
}

src/SharpOnvifServer/SharpOnvifServer.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<ItemGroup>
1414
<PackageReference Include="CoreWCF.Http" Version="1.8.0" />
1515
<PackageReference Include="CoreWCF.Primitives" Version="1.8.0" />
16+
<PackageReference Include="CoreWCF.WebHttp" Version="1.8.0" />
1617
<PackageReference Include="System.Text.Encodings.Web" Version="8.0.0" />
1718
<PackageReference Include="System.Text.Json" Version="8.0.6" />
1819
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />

0 commit comments

Comments
 (0)