2using System.Reflection;
3using System.Collections.Generic;
5using System.Threading.Tasks;
8using System.Security.Cryptography.X509Certificates;
21 public static readonly Encoding
ISO_8859_1 = Encoding.GetEncoding(
"ISO-8859-1");
23 private static string[] canEncodeContentTypes =
null;
24 private static string[] canEncodeFileExtensions =
null;
25 private static string[] canDecodeContentTypes =
null;
26 private static string[] canDecodeFileExtensions =
null;
27 private static string[] canGetUriSchemes =
null;
28 private static string[] canPostToUriSchemes =
null;
29 private static string[] canPutToUriSchemes =
null;
30 private static string[] canDeleteToUriSchemes =
null;
31 private static string[] canHeadUriSchemes =
null;
40 private readonly
static Dictionary<string, KeyValuePair<Grade, IContentDecoder>> decoderByContentType =
41 new Dictionary<string, KeyValuePair<Grade, IContentDecoder>>(StringComparer.CurrentCultureIgnoreCase);
42 private readonly
static Dictionary<string, KeyValuePair<Grade, IContentEncoder>> encodersByType =
43 new Dictionary<string, KeyValuePair<Grade, IContentEncoder>>();
44 private readonly
static Dictionary<string, string> contentTypeByFileExtensions =
new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase);
45 private readonly
static Dictionary<string, string> fileExtensionsByContentType =
new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase);
46 private readonly
static Dictionary<string, IContentConverter> convertersByStep =
new Dictionary<string, IContentConverter>(StringComparer.CurrentCultureIgnoreCase);
47 private readonly
static Dictionary<string, List<IContentConverter>> convertersByFrom =
new Dictionary<string, List<IContentConverter>>();
48 private readonly
static Dictionary<string, IContentGetter[]> gettersByScheme =
new Dictionary<string, IContentGetter[]>(StringComparer.CurrentCultureIgnoreCase);
49 private readonly
static Dictionary<string, IContentPoster[]> postersByScheme =
new Dictionary<string, IContentPoster[]>(StringComparer.CurrentCultureIgnoreCase);
50 private readonly
static Dictionary<string, IContentPutter[]> puttersByScheme =
new Dictionary<string, IContentPutter[]>(StringComparer.CurrentCultureIgnoreCase);
51 private readonly
static Dictionary<string, IContentDeleter[]> deletersByScheme =
new Dictionary<string, IContentDeleter[]>(StringComparer.CurrentCultureIgnoreCase);
52 private readonly
static Dictionary<string, IContentHeader[]> headersByScheme =
new Dictionary<string, IContentHeader[]>(StringComparer.CurrentCultureIgnoreCase);
56 Types.OnInvalidated += Types_OnInvalidated;
59 private static void Types_OnInvalidated(
object Sender, EventArgs e)
61 canEncodeContentTypes =
null;
62 canEncodeFileExtensions =
null;
63 canDecodeContentTypes =
null;
64 canDecodeFileExtensions =
null;
65 canGetUriSchemes =
null;
75 lock (decoderByContentType)
77 decoderByContentType.Clear();
82 encodersByType.Clear();
85 lock (contentTypeByFileExtensions)
87 contentTypeByFileExtensions.Clear();
90 lock (fileExtensionsByContentType)
92 fileExtensionsByContentType.Clear();
95 lock (convertersByStep)
97 convertersByStep.Clear();
98 convertersByFrom.Clear();
101 lock (gettersByScheme)
103 gettersByScheme.Clear();
106 lock (headersByScheme)
108 headersByScheme.Clear();
111 lock (postersByScheme)
113 postersByScheme.Clear();
116 lock (puttersByScheme)
118 puttersByScheme.Clear();
121 lock (deletersByScheme)
123 deletersByScheme.Clear();
136 if (canEncodeContentTypes is
null)
138 SortedDictionary<string, bool> ContentTypes =
new SortedDictionary<string, bool>();
143 ContentTypes[ContentType] =
true;
146 string[]
Types =
new string[ContentTypes.Count];
147 ContentTypes.Keys.CopyTo(
Types, 0);
149 canEncodeContentTypes =
Types;
152 return canEncodeContentTypes;
163 if (canEncodeFileExtensions is
null)
165 SortedDictionary<string, bool> FileExtensions =
new SortedDictionary<string, bool>();
170 FileExtensions[FileExtension] =
true;
173 string[]
Types =
new string[FileExtensions.Count];
174 FileExtensions.Keys.CopyTo(
Types, 0);
176 canEncodeFileExtensions =
Types;
179 return canEncodeFileExtensions;
190 if (encoders is
null)
192 List<IContentEncoder>
Encoders =
new List<IContentEncoder>();
196 foreach (Type T
in EncoderTypes)
233 if (AcceptedContentTypes is
null || AcceptedContentTypes.Length == 0)
234 Key = Object.GetType().FullName;
237 StringBuilder sb =
new StringBuilder();
239 sb.Append(Object.GetType().FullName);
241 foreach (
string Accepted
in AcceptedContentTypes)
250 lock (encodersByType)
252 if (encodersByType.TryGetValue(Key, out KeyValuePair<Grade, IContentEncoder> P))
257 if (!(Encoder is
null))
275 if (Encoder2.
Encodes(Object, out
Grade Grade2, AcceptedContentTypes) && Grade2 >
Grade)
282 lock (encodersByType)
284 encodersByType[Key] =
new KeyValuePair<Grade, IContentEncoder>(
Grade, Encoder);
287 if (!(Encoder is
null))
308 [Obsolete(
"Use the EncodeAsync method for more efficient processing of content including asynchronous processing elements in parallel environments.")]
309 public static byte[]
Encode(
object Object, Encoding Encoding, out
string ContentType, params
string[] AcceptedContentTypes)
311 KeyValuePair<byte[], string> P =
EncodeAsync(Object, Encoding, AcceptedContentTypes).Result;
312 ContentType = P.Value;
324 public static Task<KeyValuePair<byte[], string>>
EncodeAsync(
object Object, Encoding Encoding, params
string[] AcceptedContentTypes)
327 throw new ArgumentException(
"No encoder found to encode objects of type " + (Object?.GetType()?.FullName) +
".", nameof(Object));
329 return Encoder.EncodeAsync(Object, Encoding);
337 public static bool IsAccepted(
string ContentType, params
string[] AcceptedContentTypes)
339 if (AcceptedContentTypes.Length == 0)
342 return Array.IndexOf(AcceptedContentTypes, ContentType) >= 0;
350 public static bool IsAccepted(
string[] ContentTypes, params
string[] AcceptedContentTypes)
352 return IsAccepted(ContentTypes, out
string _, AcceptedContentTypes);
361 public static bool IsAccepted(
string[] ContentTypes, out
string ContentType, params
string[] AcceptedContentTypes)
363 if (ContentTypes.Length == 0)
364 throw new ArgumentException(
"Empty list of content types not permitted.", nameof(ContentTypes));
366 if ((AcceptedContentTypes?.Length ?? 0) == 0)
368 ContentType = ContentTypes[0];
372 foreach (
string ContentType2
in ContentTypes)
374 if (
IsAccepted(ContentType2, AcceptedContentTypes))
376 ContentType = ContentType2;
396 if (canDecodeContentTypes is
null)
398 SortedDictionary<string, bool> ContentTypes =
new SortedDictionary<string, bool>();
403 ContentTypes[ContentType] =
true;
406 string[]
Types =
new string[ContentTypes.Count];
407 ContentTypes.Keys.CopyTo(
Types, 0);
409 canDecodeContentTypes =
Types;
412 return canDecodeContentTypes;
423 if (canDecodeFileExtensions is
null)
425 SortedDictionary<string, bool> FileExtensions =
new SortedDictionary<string, bool>();
430 FileExtensions[FileExtension] =
true;
433 string[]
Types =
new string[FileExtensions.Count];
434 FileExtensions.Keys.CopyTo(
Types, 0);
436 canDecodeFileExtensions =
Types;
439 return canDecodeFileExtensions;
450 if (decoders is
null)
452 List<IContentDecoder>
Decoders =
new List<IContentDecoder>();
456 foreach (Type T
in DecoderTypes)
490 lock (decoderByContentType)
492 if (decoderByContentType.TryGetValue(ContentType, out KeyValuePair<Grade, IContentDecoder> P))
497 return !(Decoder is
null);
513 lock (decoderByContentType)
515 decoderByContentType[ContentType] =
new KeyValuePair<Grade, IContentDecoder>(
Grade, Decoder);
518 return !(Decoder is
null);
531 [Obsolete(
"Use the DecoceAsync method for more efficient processing of content including asynchronous processing elements in parallel environments.")]
532 public static object Decode(
string ContentType,
byte[] Data, Encoding Encoding, KeyValuePair<string, string>[] Fields, Uri BaseUri)
534 return DecodeAsync(ContentType, Data, Encoding, Fields, BaseUri).Result;
547 public static Task<object>
DecodeAsync(
string ContentType,
byte[] Data, Encoding Encoding, KeyValuePair<string, string>[] Fields, Uri BaseUri)
550 throw new ArgumentException(
"No decoder found to decode objects of type " + ContentType +
".", nameof(ContentType));
552 return Decoder.DecodeAsync(ContentType, Data, Encoding, Fields, BaseUri);
563 [Obsolete(
"Use the DecoceAsync method for more efficient processing of content including asynchronous processing elements in parallel environments.")]
564 public static object Decode(
string ContentType,
byte[] Data, Uri BaseUri)
566 return DecodeAsync(ContentType, Data, BaseUri).Result;
577 public static Task<object>
DecodeAsync(
string ContentType,
byte[] Data, Uri BaseUri)
579 Encoding Encoding =
null;
580 KeyValuePair<string, string>[] Fields;
583 i = ContentType.IndexOf(
';');
587 ContentType = ContentType.Substring(0, i).TrimEnd();
589 foreach (KeyValuePair<string, string> Field
in Fields)
591 if (
string.Compare(Field.Key,
"CHARSET",
true) == 0)
596 Fields =
new KeyValuePair<string, string>[0];
598 return DecodeAsync(ContentType, Data, Encoding, Fields, BaseUri);
608 if (
string.IsNullOrEmpty(CharacterSet))
612 switch (CharacterSet.ToUpper())
616 return Encoding.ASCII;
620 return Encoding.Unicode;
623 return Encoding.BigEndianUnicode;
627 return Encoding.UTF32;
629 case "UNICODE-1-1-UTF-7":
631 return Encoding.UTF7;
634 return Encoding.UTF8;
637 return Encoding.GetEncoding(CharacterSet);
643 #region File extensions
668 FileExtension = FileExtension.ToLower();
669 if (FileExtension.StartsWith(
"."))
670 FileExtension = FileExtension.Substring(1);
672 lock (contentTypeByFileExtensions)
674 if (contentTypeByFileExtensions.TryGetValue(FileExtension, out ContentType))
682 lock (contentTypeByFileExtensions)
684 contentTypeByFileExtensions[FileExtension] = ContentType;
695 lock (contentTypeByFileExtensions)
697 contentTypeByFileExtensions[FileExtension] = ContentType;
717 return FileExtension;
730 ContentType = ContentType.ToLower();
732 lock (fileExtensionsByContentType)
734 if (fileExtensionsByContentType.TryGetValue(ContentType, out FileExtension))
742 lock (fileExtensionsByContentType)
744 fileExtensionsByContentType[ContentType] = FileExtension;
755 lock (fileExtensionsByContentType)
757 fileExtensionsByContentType[ContentType] = FileExtension;
769 #region Content Conversion
779 if (converters is
null)
799 lock (convertersByStep)
801 if (converters is
null)
804 string PathKey = FromContentType +
" -> " + ToContentType;
805 if (convertersByStep.TryGetValue(PathKey, out Converter))
806 return !(Converter is
null);
808 if (!convertersByFrom.TryGetValue(FromContentType, out List<IContentConverter>
Converters))
811 LinkedList<ConversionStep> Queue =
new LinkedList<ConversionStep>();
816 Step =
new ConversionStep()
818 From = FromContentType,
828 Dictionary<string, ConversionStep> Possibilities =
new Dictionary<string, ConversionStep>();
829 ConversionStep Best =
null;
831 int BestDistance =
int.MaxValue;
836 while (!(Queue.First is
null))
838 Step = Queue.First.Value;
841 StepDistance = Step.Distance + 1;
842 StepGrade = Step.Converter.ConversionGrade;
843 if (Step.TotalGrade < StepGrade)
844 StepGrade = Step.TotalGrade;
846 foreach (
string To
in Step.Converter.ToContentTypes)
848 if (
string.Compare(To, ToContentType,
true) == 0 || To ==
"*")
850 if (StepGrade > BestGrade || StepGrade == BestGrade && StepDistance < BestDistance)
853 BestGrade = StepGrade;
854 BestDistance = StepDistance;
859 if (Possibilities.TryGetValue(To, out ConversionStep NextStep) && NextStep.TotalGrade >= StepGrade && NextStep.Distance <= StepDistance)
862 if (!convertersByFrom.TryGetValue(To, out
Converters))
868 NextStep =
new ConversionStep()
872 TotalGrade = StepGrade,
874 Distance = StepDistance
879 Possibilities[To] = NextStep;
883 Queue.AddLast(NextStep);
891 List<KeyValuePair<string, IContentConverter>> List =
new List<KeyValuePair<string, IContentConverter>>();
893 while (!(Best is
null))
895 List.Insert(0,
new KeyValuePair<string, IContentConverter>(Best.From, Best.Converter));
899 Converter =
new ConversionSequence(FromContentType, ToContentType, BestGrade, List.ToArray());
900 convertersByStep[PathKey] = Converter;
905 convertersByStep[PathKey] =
null;
912 private class ConversionStep
915 public Grade TotalGrade;
916 public ConversionStep Prev;
921 private static void FindConverters()
923 List<IContentConverter>
Converters =
new List<IContentConverter>();
927 convertersByStep.Clear();
928 convertersByFrom.Clear();
930 lock (convertersByStep)
932 foreach (Type T
in ConverterTypes)
951 if (!convertersByFrom.TryGetValue(From, out List<IContentConverter> List))
953 List =
new List<IContentConverter>();
954 convertersByFrom[From] = List;
962 convertersByStep[From +
" -> " + To] = Converter;
978 lock (convertersByStep)
980 if (converters is
null)
983 if (!convertersByFrom.TryGetValue(FromContentType, out List<IContentConverter>
Converters))
992 #region Getting resources
1001 if (canGetUriSchemes is
null)
1003 SortedDictionary<string, bool> UriSchemes =
new SortedDictionary<string, bool>();
1007 foreach (
string Scheme
in Getter.UriSchemes)
1008 UriSchemes[Scheme] =
true;
1011 string[] Schemes =
new string[UriSchemes.Count];
1012 UriSchemes.Keys.CopyTo(Schemes, 0);
1014 canGetUriSchemes = Schemes;
1017 return canGetUriSchemes;
1028 if (getters is
null)
1035 private static void BuildGetters()
1037 List<IContentGetter>
Getters =
new List<IContentGetter>();
1039 Dictionary<string, List<IContentGetter>> ByScheme =
new Dictionary<string, List<IContentGetter>>();
1042 foreach (Type T
in GetterTypes)
1059 foreach (
string Schema
in Getter.UriSchemes)
1061 if (!ByScheme.TryGetValue(Schema, out List<IContentGetter> List))
1063 List =
new List<IContentGetter>();
1064 ByScheme[Schema] = List;
1071 lock (gettersByScheme)
1073 foreach (KeyValuePair<
string, List<IContentGetter>> P
in ByScheme)
1074 gettersByScheme[P.Key] = P.Value.ToArray();
1090 throw new ArgumentNullException(
"URI cannot be null.", nameof(Uri));
1092 if (getters is
null)
1097 lock (gettersByScheme)
1099 if (Uri is
null || !gettersByScheme.TryGetValue(Uri.Scheme, out
Getters))
1119 return !(Getter is
null);
1128 public static Task<object>
GetAsync(Uri Uri, params KeyValuePair<string, string>[]
Headers)
1140 public static Task<object>
GetAsync(Uri Uri, X509Certificate Certificate, params KeyValuePair<string, string>[]
Headers)
1154 params KeyValuePair<string, string>[]
Headers)
1157 throw new ArgumentException(
"URI Scheme not recognized (GET): " + Uri.Scheme, nameof(Uri));
1159 return Getter.GetAsync(Uri, Certificate, RemoteCertificateValidator,
Headers);
1169 public static Task<object>
GetAsync(Uri Uri,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1182 public static Task<object>
GetAsync(Uri Uri, X509Certificate Certificate,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1197 int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1200 throw new ArgumentException(
"URI Scheme not recognized (GET): " + Uri.Scheme, nameof(Uri));
1202 return Getter.GetAsync(Uri, Certificate, RemoteCertificateValidator, TimeoutMs,
Headers);
1223 public static Task<KeyValuePair<string, TemporaryStream>>
GetTempStreamAsync(Uri Uri, X509Certificate Certificate, params KeyValuePair<string, string>[]
Headers)
1236 public static Task<KeyValuePair<string, TemporaryStream>>
GetTempStreamAsync(Uri Uri, X509Certificate Certificate,
1240 throw new ArgumentException(
"URI Scheme not recognized (GET): " + Uri.Scheme, nameof(Uri));
1242 return Getter.GetTempStreamAsync(Uri, Certificate, RemoteCertificateValidator,
Headers);
1252 public static Task<KeyValuePair<string, TemporaryStream>>
GetTempStreamAsync(Uri Uri,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1265 public static Task<KeyValuePair<string, TemporaryStream>>
GetTempStreamAsync(Uri Uri, X509Certificate Certificate,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1279 public static Task<KeyValuePair<string, TemporaryStream>>
GetTempStreamAsync(Uri Uri, X509Certificate Certificate,
1283 throw new ArgumentException(
"URI Scheme not recognized (GET): " + Uri.Scheme, nameof(Uri));
1285 return Getter.GetTempStreamAsync(Uri, Certificate, RemoteCertificateValidator, TimeoutMs,
Headers);
1290 #region Posting to resources
1299 if (canPostToUriSchemes is
null)
1301 SortedDictionary<string, bool> UriSchemes =
new SortedDictionary<string, bool>();
1306 UriSchemes[Scheme] =
true;
1309 string[] Schemes =
new string[UriSchemes.Count];
1310 UriSchemes.Keys.CopyTo(Schemes, 0);
1312 canPostToUriSchemes = Schemes;
1315 return canPostToUriSchemes;
1326 if (posters is
null)
1333 private static void BuildPosters()
1335 List<IContentPoster>
Posters =
new List<IContentPoster>();
1337 Dictionary<string, List<IContentPoster>> ByScheme =
new Dictionary<string, List<IContentPoster>>();
1340 foreach (Type T
in PosterTypes)
1357 foreach (
string Schema
in Poster.UriSchemes)
1359 if (!ByScheme.TryGetValue(Schema, out List<IContentPoster> List))
1361 List =
new List<IContentPoster>();
1362 ByScheme[Schema] = List;
1369 lock (postersByScheme)
1371 foreach (KeyValuePair<
string, List<IContentPoster>> P
in ByScheme)
1372 postersByScheme[P.Key] = P.Value.ToArray();
1388 throw new ArgumentNullException(
"URI cannot be null.", nameof(Uri));
1390 if (posters is
null)
1395 lock (postersByScheme)
1397 if (Uri is
null || !postersByScheme.TryGetValue(Uri.Scheme, out
Posters))
1417 return !(Poster is
null);
1427 public static Task<object>
PostAsync(Uri Uri,
object Data, params KeyValuePair<string, string>[]
Headers)
1440 public static Task<object>
PostAsync(Uri Uri,
object Data, X509Certificate Certificate, params KeyValuePair<string, string>[]
Headers)
1454 public static Task<object>
PostAsync(Uri Uri,
object Data, X509Certificate Certificate,
1458 throw new ArgumentException(
"URI Scheme not recognized (POST): " + Uri.Scheme, nameof(Uri));
1460 return Poster.PostAsync(Uri, Data, Certificate, RemoteCertificateValidator,
Headers);
1471 public static Task<object>
PostAsync(Uri Uri,
object Data,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1485 public static Task<object>
PostAsync(Uri Uri,
object Data, X509Certificate Certificate,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1500 public static Task<object>
PostAsync(Uri Uri,
object Data, X509Certificate Certificate,
1504 throw new ArgumentException(
"URI Scheme not recognized (POST): " + Uri.Scheme, nameof(Uri));
1506 return Poster.PostAsync(Uri, Data, Certificate, RemoteCertificateValidator, TimeoutMs,
Headers);
1517 public static Task<KeyValuePair<byte[], string>>
PostAsync(Uri Uri,
byte[] EncodedData,
string ContentType, params KeyValuePair<string, string>[]
Headers)
1531 public static Task<KeyValuePair<byte[], string>>
PostAsync(Uri Uri,
byte[] EncodedData,
string ContentType,
1532 X509Certificate Certificate, params KeyValuePair<string, string>[]
Headers)
1534 return PostAsync(Uri, EncodedData, ContentType, Certificate,
null,
Headers);
1547 public static Task<KeyValuePair<byte[], string>>
PostAsync(Uri Uri,
byte[] EncodedData,
string ContentType,
1551 throw new ArgumentException(
"URI Scheme not recognized (POST): " + Uri.Scheme, nameof(Uri));
1553 return Poster.PostAsync(Uri, EncodedData, ContentType, Certificate, RemoteCertificateValidator,
Headers);
1565 public static Task<KeyValuePair<byte[], string>>
PostAsync(Uri Uri,
byte[] EncodedData,
string ContentType,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1567 return PostAsync(Uri, EncodedData, ContentType,
null,
null, TimeoutMs,
Headers);
1580 public static Task<KeyValuePair<byte[], string>>
PostAsync(Uri Uri,
byte[] EncodedData,
string ContentType,
1581 X509Certificate Certificate,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1583 return PostAsync(Uri, EncodedData, ContentType, Certificate,
null, TimeoutMs,
Headers);
1597 public static Task<KeyValuePair<byte[], string>>
PostAsync(Uri Uri,
byte[] EncodedData,
string ContentType,
1599 params KeyValuePair<string, string>[]
Headers)
1602 throw new ArgumentException(
"URI Scheme not recognized (POST): " + Uri.Scheme, nameof(Uri));
1604 return Poster.PostAsync(Uri, EncodedData, ContentType, Certificate, RemoteCertificateValidator, TimeoutMs,
Headers);
1609 #region Putting to resources
1618 if (canPutToUriSchemes is
null)
1620 SortedDictionary<string, bool> UriSchemes =
new SortedDictionary<string, bool>();
1625 UriSchemes[Scheme] =
true;
1628 string[] Schemes =
new string[UriSchemes.Count];
1629 UriSchemes.Keys.CopyTo(Schemes, 0);
1631 canPutToUriSchemes = Schemes;
1634 return canPutToUriSchemes;
1645 if (putters is
null)
1652 private static void BuildPutters()
1654 List<IContentPutter>
Putters =
new List<IContentPutter>();
1656 Dictionary<string, List<IContentPutter>> ByScheme =
new Dictionary<string, List<IContentPutter>>();
1659 foreach (Type T
in PutterTypes)
1676 foreach (
string Schema
in Putter.UriSchemes)
1678 if (!ByScheme.TryGetValue(Schema, out List<IContentPutter> List))
1680 List =
new List<IContentPutter>();
1681 ByScheme[Schema] = List;
1688 lock (puttersByScheme)
1690 foreach (KeyValuePair<
string, List<IContentPutter>> P
in ByScheme)
1691 puttersByScheme[P.Key] = P.Value.ToArray();
1707 throw new ArgumentNullException(
"URI cannot be null.", nameof(Uri));
1709 if (putters is
null)
1714 lock (puttersByScheme)
1716 if (Uri is
null || !puttersByScheme.TryGetValue(Uri.Scheme, out
Putters))
1736 return !(Putter is
null);
1746 public static Task<object>
PutAsync(Uri Uri,
object Data, params KeyValuePair<string, string>[]
Headers)
1759 public static Task<object>
PutAsync(Uri Uri,
object Data, X509Certificate Certificate, params KeyValuePair<string, string>[]
Headers)
1773 public static Task<object>
PutAsync(Uri Uri,
object Data, X509Certificate Certificate,
1777 throw new ArgumentException(
"URI Scheme not recognized (PUT): " + Uri.Scheme, nameof(Uri));
1779 return Putter.PutAsync(Uri, Data, Certificate, RemoteCertificateValidator,
Headers);
1790 public static Task<object>
PutAsync(Uri Uri,
object Data,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1804 public static Task<object>
PutAsync(Uri Uri,
object Data, X509Certificate Certificate,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1819 public static Task<object>
PutAsync(Uri Uri,
object Data, X509Certificate Certificate,
1823 throw new ArgumentException(
"URI Scheme not recognized (PUT): " + Uri.Scheme, nameof(Uri));
1825 return Putter.PutAsync(Uri, Data, Certificate, RemoteCertificateValidator, TimeoutMs,
Headers);
1836 public static Task<KeyValuePair<byte[], string>>
PutAsync(Uri Uri,
byte[] EncodedData,
string ContentType, params KeyValuePair<string, string>[]
Headers)
1850 public static Task<KeyValuePair<byte[], string>>
PutAsync(Uri Uri,
byte[] EncodedData,
string ContentType, X509Certificate Certificate, params KeyValuePair<string, string>[]
Headers)
1852 return PutAsync(Uri, EncodedData, ContentType, Certificate,
null,
Headers);
1865 public static Task<KeyValuePair<byte[], string>>
PutAsync(Uri Uri,
byte[] EncodedData,
string ContentType,
1869 throw new ArgumentException(
"URI Scheme not recognized (PUT): " + Uri.Scheme, nameof(Uri));
1871 return Putter.PutAsync(Uri, EncodedData, ContentType, Certificate, RemoteCertificateValidator,
Headers);
1883 public static Task<KeyValuePair<byte[], string>>
PutAsync(Uri Uri,
byte[] EncodedData,
string ContentType,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1885 return PutAsync(Uri, EncodedData, ContentType,
null,
null, TimeoutMs,
Headers);
1898 public static Task<KeyValuePair<byte[], string>>
PutAsync(Uri Uri,
byte[] EncodedData,
string ContentType, X509Certificate Certificate,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
1900 return PutAsync(Uri, EncodedData, ContentType, Certificate,
null, TimeoutMs,
Headers);
1914 public static Task<KeyValuePair<byte[], string>>
PutAsync(Uri Uri,
byte[] EncodedData,
string ContentType,
1918 throw new ArgumentException(
"URI Scheme not recognized (PUT): " + Uri.Scheme, nameof(Uri));
1920 return Putter.PutAsync(Uri, EncodedData, ContentType, Certificate, RemoteCertificateValidator, TimeoutMs,
Headers);
1925 #region Deleting to resources
1934 if (canDeleteToUriSchemes is
null)
1936 SortedDictionary<string, bool> UriSchemes =
new SortedDictionary<string, bool>();
1940 foreach (
string Scheme
in Deleter.
UriSchemes)
1941 UriSchemes[Scheme] =
true;
1944 string[] Schemes =
new string[UriSchemes.Count];
1945 UriSchemes.Keys.CopyTo(Schemes, 0);
1947 canDeleteToUriSchemes = Schemes;
1950 return canDeleteToUriSchemes;
1961 if (deleters is
null)
1968 private static void BuildDeleters()
1970 List<IContentDeleter>
Deleters =
new List<IContentDeleter>();
1972 Dictionary<string, List<IContentDeleter>> ByScheme =
new Dictionary<string, List<IContentDeleter>>();
1975 foreach (Type T
in DeleterTypes)
1992 foreach (
string Schema
in Deleter.UriSchemes)
1994 if (!ByScheme.TryGetValue(Schema, out List<IContentDeleter> List))
1996 List =
new List<IContentDeleter>();
1997 ByScheme[Schema] = List;
2004 lock (deletersByScheme)
2006 foreach (KeyValuePair<
string, List<IContentDeleter>> P
in ByScheme)
2007 deletersByScheme[P.Key] = P.Value.ToArray();
2023 throw new ArgumentNullException(
"URI cannot be null.", nameof(Uri));
2025 if (deleters is
null)
2030 lock (deletersByScheme)
2032 if (Uri is
null || !deletersByScheme.TryGetValue(Uri.Scheme, out
Deleters))
2052 return !(Deleter is
null);
2073 public static Task<object>
DeleteAsync(Uri Uri, X509Certificate Certificate, params KeyValuePair<string, string>[]
Headers)
2086 public static Task<object>
DeleteAsync(Uri Uri, X509Certificate Certificate,
2090 throw new ArgumentException(
"URI Scheme not recognized (DELETE): " + Uri.Scheme, nameof(Uri));
2092 return Deleter.DeleteAsync(Uri, Certificate, RemoteCertificateValidator,
Headers);
2102 public static Task<object>
DeleteAsync(Uri Uri,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
2115 public static Task<object>
DeleteAsync(Uri Uri, X509Certificate Certificate,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
2129 public static Task<object>
DeleteAsync(Uri Uri, X509Certificate Certificate,
2131 params KeyValuePair<string, string>[]
Headers)
2134 throw new ArgumentException(
"URI Scheme not recognized (DELETE): " + Uri.Scheme, nameof(Uri));
2136 return Deleter.DeleteAsync(Uri, Certificate, RemoteCertificateValidator, TimeoutMs,
Headers);
2141 #region Getting headers of resources
2150 if (canHeadUriSchemes is
null)
2152 SortedDictionary<string, bool> UriSchemes =
new SortedDictionary<string, bool>();
2157 UriSchemes[Scheme] =
true;
2160 string[] Schemes =
new string[UriSchemes.Count];
2161 UriSchemes.Keys.CopyTo(Schemes, 0);
2163 canHeadUriSchemes = Schemes;
2166 return canHeadUriSchemes;
2177 if (headers is
null)
2184 private static void BuildHeaders()
2186 List<IContentHeader>
Headers =
new List<IContentHeader>();
2188 Dictionary<string, List<IContentHeader>> ByScheme =
new Dictionary<string, List<IContentHeader>>();
2191 foreach (Type T
in HeaderTypes)
2208 foreach (
string Schema
in Header.UriSchemes)
2210 if (!ByScheme.TryGetValue(Schema, out List<IContentHeader> List))
2212 List =
new List<IContentHeader>();
2213 ByScheme[Schema] = List;
2220 lock (headersByScheme)
2222 foreach (KeyValuePair<
string, List<IContentHeader>> P
in ByScheme)
2223 headersByScheme[P.Key] = P.Value.ToArray();
2239 throw new ArgumentNullException(
"URI cannot be null.", nameof(Uri));
2241 if (headers is
null)
2246 lock (headersByScheme)
2248 if (Uri is
null || !headersByScheme.TryGetValue(Uri.Scheme, out
Headers))
2268 return !(Header is
null);
2289 public static Task<object>
HeadAsync(Uri Uri, X509Certificate Certificate, params KeyValuePair<string, string>[]
Headers)
2303 params KeyValuePair<string, string>[]
Headers)
2306 throw new ArgumentException(
"URI Scheme not recognized (HEAD): " + Uri.Scheme, nameof(Uri));
2308 return Header.HeadAsync(Uri, Certificate, RemoteCertificateValidator,
Headers);
2318 public static Task<object>
HeadAsync(Uri Uri,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
2331 public static Task<object>
HeadAsync(Uri Uri, X509Certificate Certificate,
int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
2346 int TimeoutMs, params KeyValuePair<string, string>[]
Headers)
2349 throw new ArgumentException(
"URI Scheme not recognized (HEAD): " + Uri.Scheme, nameof(Uri));
2351 return Header.HeadAsync(Uri, Certificate, RemoteCertificateValidator, TimeoutMs,
Headers);
const string DefaultContentType
text/plain
Encodes custom-encoded objects
Helps with parsing of commong data types.
static KeyValuePair< string, string >[] ParseFieldValues(string Value)
Parses a set of comma or semicolon-separated field values, optionaly delimited by ' or " characters.
Static class managing encoding and decoding of internet content.
static Task< KeyValuePair< byte[], string > > PutAsync(Uri Uri, byte[] EncodedData, string ContentType, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static string[] CanDecodeContentTypes
Internet content types that can be decoded.
static bool IsAccepted(string ContentType, params string[] AcceptedContentTypes)
Checks if a given content type is acceptable.
static Task< KeyValuePair< byte[], string > > EncodeAsync(object Object, Encoding Encoding, params string[] AcceptedContentTypes)
Encodes an object.
static Task< KeyValuePair< string, TemporaryStream > > GetTempStreamAsync(Uri Uri, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Gets a (possibly big) resource, given its URI.
static Task< object > DeleteAsync(Uri Uri, X509Certificate Certificate, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Deletes a resource, using a Uniform Resource Identifier (or Locator).
static Task< object > DecodeAsync(string ContentType, byte[] Data, Encoding Encoding, KeyValuePair< string, string >[] Fields, Uri BaseUri)
Decodes an object.
static IContentConverter[] GetConverters(string FromContentType)
Gets available converters that can convert content from a given type.
static byte[] Encode(object Object, Encoding Encoding, out string ContentType, params string[] AcceptedContentTypes)
Encodes an object.
static Task< KeyValuePair< string, TemporaryStream > > GetTempStreamAsync(Uri Uri, X509Certificate Certificate, params KeyValuePair< string, string >[] Headers)
Gets a (possibly big) resource, given its URI.
static Task< KeyValuePair< byte[], string > > PutAsync(Uri Uri, byte[] EncodedData, string ContentType, X509Certificate Certificate, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< object > PutAsync(Uri Uri, object Data, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static IContentHeader[] Headers
Available Internet Content Header-retrievers.
static Task< object > PostAsync(Uri Uri, object Data, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static bool CanPost(Uri Uri, out Grade Grade, out IContentPoster Poster)
If a resource can be posted to, given its URI.
static Task< object > PutAsync(Uri Uri, object Data, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static string GetFileExtension(string ContentType)
Gets the file extension of an item, given its content type. It uses the TryGetFileExtension to see if...
static Task< KeyValuePair< string, TemporaryStream > > GetTempStreamAsync(Uri Uri, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, params KeyValuePair< string, string >[] Headers)
Gets a (possibly big) resource, given its URI.
static Task< object > GetAsync(Uri Uri, params KeyValuePair< string, string >[] Headers)
Gets a resource, given its URI.
static Task< object > GetAsync(Uri Uri, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Gets a resource, given its URI.
static Task< object > PostAsync(Uri Uri, object Data, X509Certificate Certificate, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static bool CanGet(Uri Uri, out Grade Grade, out IContentGetter Getter)
If a resource can be gotten, given its URI.
static Task< KeyValuePair< string, TemporaryStream > > GetTempStreamAsync(Uri Uri, X509Certificate Certificate, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Gets a (possibly big) resource, given its URI.
static IContentDecoder[] Decoders
Available Internet Content Decoders.
static bool Encodes(object Object, out Grade Grade, out IContentEncoder Encoder, params string[] AcceptedContentTypes)
If a given object can be encoded.
static Task< KeyValuePair< byte[], string > > PostAsync(Uri Uri, byte[] EncodedData, string ContentType, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static string[] CanPutToUriSchemes
Internet URI Schemes that can be putted to.
static string[] CanDeleteToUriSchemes
Internet URI Schemes that can be deleted to.
static string GetContentType(string FileExtension)
Gets the content type of an item, given its file extension. It uses the TryGetContentType to see if a...
static IContentEncoder[] Encoders
Available Internet Content Encoders.
static Task< object > PutAsync(Uri Uri, object Data, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< object > HeadAsync(Uri Uri, params KeyValuePair< string, string >[] Headers)
Heads a resource, given its URI.
static bool CanConvert(string FromContentType, string ToContentType, out IContentConverter Converter)
Checks if it is possible to convert content from one type to another.
static Task< object > HeadAsync(Uri Uri, X509Certificate Certificate, params KeyValuePair< string, string >[] Headers)
Heads a resource, given its URI.
static Task< object > HeadAsync(Uri Uri, X509Certificate Certificate, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Heads a resource, given its URI.
static Task< object > PutAsync(Uri Uri, object Data, X509Certificate Certificate, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< object > HeadAsync(Uri Uri, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Heads a resource, given its URI.
static IContentPutter[] Putters
Available Internet Content Putters.
static string[] CanHeadUriSchemes
Internet URI Schemes where it is possible to get headers.
static object Decode(string ContentType, byte[] Data, Uri BaseUri)
Decodes an object.
static IContentGetter[] Getters
Available Internet Content Getters.
static object Decode(string ContentType, byte[] Data, Encoding Encoding, KeyValuePair< string, string >[] Fields, Uri BaseUri)
Decodes an object.
static IContentDeleter[] Deleters
Available Internet Content Deleters.
static Task< object > DeleteAsync(Uri Uri, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Deletes a resource, using a Uniform Resource Identifier (or Locator).
static Task< KeyValuePair< byte[], string > > PostAsync(Uri Uri, byte[] EncodedData, string ContentType, X509Certificate Certificate, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static string[] CanEncodeContentTypes
Internet content types that can be encoded.
static Task< object > DeleteAsync(Uri Uri, params KeyValuePair< string, string >[] Headers)
Deletes a resource, using a Uniform Resource Identifier (or Locator).
static Task< KeyValuePair< byte[], string > > PostAsync(Uri Uri, byte[] EncodedData, string ContentType, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static readonly Encoding ISO_8859_1
ISO-8859-1 character encoding.
static bool Decodes(string ContentType, out Grade Grade, out IContentDecoder Decoder)
If an object with a given content type can be decoded.
static Task< object > PostAsync(Uri Uri, object Data, X509Certificate Certificate, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< KeyValuePair< string, TemporaryStream > > GetTempStreamAsync(Uri Uri, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Gets a (possibly big) resource, given its URI.
static IContentPoster[] Posters
Available Internet Content Posters.
static Task< object > GetAsync(Uri Uri, X509Certificate Certificate, params KeyValuePair< string, string >[] Headers)
Gets a resource, given its URI.
static Task< object > PutAsync(Uri Uri, object Data, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< object > HeadAsync(Uri Uri, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Heads a resource, given its URI.
static bool IsAccepted(string[] ContentTypes, out string ContentType, params string[] AcceptedContentTypes)
Checks if at least one content type in a set of content types is acceptable.
static Task< object > GetAsync(Uri Uri, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Gets a resource, given its URI.
static string[] CanDecodeFileExtensions
File extensions that can be decoded.
static Task< object > GetAsync(Uri Uri, X509Certificate Certificate, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Gets a resource, given its URI.
static bool CanPut(Uri Uri, out Grade Grade, out IContentPutter Putter)
If a resource can be putted to, given its URI.
static string[] CanPostToUriSchemes
Internet URI Schemes that can be posted to.
static Task< KeyValuePair< byte[], string > > PutAsync(Uri Uri, byte[] EncodedData, string ContentType, X509Certificate Certificate, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< object > DeleteAsync(Uri Uri, X509Certificate Certificate, params KeyValuePair< string, string >[] Headers)
Deletes a resource, using a Uniform Resource Identifier (or Locator).
static Task< object > PostAsync(Uri Uri, object Data, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static bool CanHead(Uri Uri, out Grade Grade, out IContentHeader Header)
If the headers of a resource can be gotten, given its URI.
static Task< object > PostAsync(Uri Uri, object Data, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< KeyValuePair< byte[], string > > PutAsync(Uri Uri, byte[] EncodedData, string ContentType, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< KeyValuePair< string, TemporaryStream > > GetTempStreamAsync(Uri Uri, params KeyValuePair< string, string >[] Headers)
Gets a (possibly big) resource, given its URI.
static Task< object > DeleteAsync(Uri Uri, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, params KeyValuePair< string, string >[] Headers)
Deletes a resource, using a Uniform Resource Identifier (or Locator).
static string[] CanGetUriSchemes
Internet URI Schemes that can be gotten.
static Task< object > HeadAsync(Uri Uri, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, params KeyValuePair< string, string >[] Headers)
Heads a resource, given its URI.
static Task< KeyValuePair< byte[], string > > PostAsync(Uri Uri, byte[] EncodedData, string ContentType, X509Certificate Certificate, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< KeyValuePair< byte[], string > > PostAsync(Uri Uri, byte[] EncodedData, string ContentType, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static IContentConverter[] Converters
Available Internet Content Converters.
static Task< KeyValuePair< byte[], string > > PutAsync(Uri Uri, byte[] EncodedData, string ContentType, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< object > PostAsync(Uri Uri, object Data, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< object > PutAsync(Uri Uri, object Data, X509Certificate Certificate, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< KeyValuePair< byte[], string > > PostAsync(Uri Uri, byte[] EncodedData, string ContentType, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, params KeyValuePair< string, string >[] Headers)
Posts to a resource, using a Uniform Resource Identifier (or Locator).
static Task< object > DeleteAsync(Uri Uri, int TimeoutMs, params KeyValuePair< string, string >[] Headers)
Deletes a resource, using a Uniform Resource Identifier (or Locator).
static Task< KeyValuePair< byte[], string > > PutAsync(Uri Uri, byte[] EncodedData, string ContentType, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, params KeyValuePair< string, string >[] Headers)
Puts to a resource, using a Uniform Resource Identifier (or Locator).
static bool IsAccepted(string[] ContentTypes, params string[] AcceptedContentTypes)
Checks if at least one content type in a set of content types is acceptable.
static bool CanDelete(Uri Uri, out Grade Grade, out IContentDeleter Deleter)
If a resource can be deleted to, given its URI.
static string[] CanEncodeFileExtensions
File extensions that can be encoded.
static bool TryGetContentType(string FileExtension, out string ContentType)
Tries to get the content type of an item, given its file extension.
static Task< object > DecodeAsync(string ContentType, byte[] Data, Uri BaseUri)
Decodes an object.
static Task< object > GetAsync(Uri Uri, X509Certificate Certificate, RemoteCertificateEventHandler RemoteCertificateValidator, params KeyValuePair< string, string >[] Headers)
Gets a resource, given its URI.
static Encoding GetEncoding(string CharacterSet)
Gets a character encoding from its name.
static bool TryGetFileExtension(string ContentType, out string FileExtension)
Tries to get the file extension of an item, given its content type.
Static class that dynamically manages types and interfaces available in the runtime environment.
static object[] NoParameters
Contains an empty array of parameter values.
static Type[] GetTypesImplementingInterface(string InterfaceFullName)
Gets all types implementing a given interface.
static ConstructorInfo GetDefaultConstructor(Type Type)
Gets the default constructor of a type, if one exists.
Basic interface for Internet Content encoders. A class implementing this interface and having a defau...
Grade ConversionGrade
How well the content is converted.
string[] FromContentTypes
Converts content from these content types.
string[] ToContentTypes
Converts content to these content types. Return an array of "*" to signify content can be converted t...
Basic interface for Internet Content decoders. A class implementing this interface and having a defau...
bool Decodes(string ContentType, out Grade Grade)
If the decoder decodes an object with a given content type.
Basic interface for Internet Content deleters. A class implementing this interface and having a defau...
string[] UriSchemes
Supported URI schemes.
bool CanDelete(Uri Uri, out Grade Grade)
If the deleter is able to delete to a resource, given its URI.
Basic interface for Internet Content encoders. A class implementing this interface and having a defau...
bool Encodes(object Object, out Grade Grade, params string[] AcceptedContentTypes)
If the encoder encodes a given object.
Basic interface for Internet Content getters. A class implementing this interface and having a defaul...
bool CanGet(Uri Uri, out Grade Grade)
If the getter is able to get a resource, given its URI.
Basic interface for Internet Content posters. A class implementing this interface and having a defaul...
string[] UriSchemes
Supported URI schemes.
bool CanPost(Uri Uri, out Grade Grade)
If the poster is able to post to a resource, given its URI.
Basic interface for Internet Content putters. A class implementing this interface and having a defaul...
string[] UriSchemes
Supported URI schemes.
bool CanPut(Uri Uri, out Grade Grade)
If the putter is able to put to a resource, given its URI.
bool TryGetContentType(string FileExtension, out string ContentType)
Tries to get the content type of an item, given its file extension.
string[] ContentTypes
Supported content types.
bool TryGetFileExtension(string ContentType, out string FileExtension)
Tries to get the file extension of an item, given its Content-Type.
string[] FileExtensions
Supported file extensions.
delegate void RemoteCertificateEventHandler(object Sender, RemoteCertificateEventArgs e)
Delegate for remote certificate event handlers.