From 45d0607fd55bbcf65adbf0ba4830dd852c1df119 Mon Sep 17 00:00:00 2001 From: "michael.hallett" Date: Thu, 6 Aug 2015 13:37:28 -0700 Subject: [PATCH 1/9] added support for .net 4.6, added additional sln files, renamed core project to include framework edition, trying to bring back support for windows phone 7.1 and the compact framework --- .nuget/Signed/RestSharp.Build.dll | Bin 8192 -> 8192 bytes RestSharp.2015.sln | 277 +++++++++++ RestSharp.All.sln | 451 ++++++++++++++++++ RestSharp.Build/RestSharp.Build.Signed.csproj | 2 +- .../RestSharp.IntegrationTests.Signed.csproj | 4 +- RestSharp.Net4/RestSharp.Net4.Signed.csproj | 2 +- .../RestSharp.Net452.Signed.csproj | 2 +- .../Extensions/RestClientExtensions.cs | 17 + RestSharp.Net46/Properties/AssemblyInfo.cs | 24 + RestSharp.Net46/RestSharp.Net46.Signed.csproj | 301 ++++++++++++ RestSharp.Net46/RestSharp.Net46.csproj | 289 +++++++++++ RestSharp.Net46/packages.config | 3 + RestSharp.Signed.sln | 30 +- RestSharp.Tests/RestSharp.Tests.Signed.csproj | 10 +- RestSharp.Tests/RestSharp.Tests.csproj | 6 +- RestSharp.sln | 42 +- RestSharp/Deserializers/JsonDeserializer.cs | 11 +- RestSharp/RestRequest.cs | 19 + ...d.csproj => RestSharp.Net35.Signed.csproj} | 6 +- ...estSharp.csproj => RestSharp.Net35.csproj} | 0 RestSharp/SimpleJson.cs | 4 + 21 files changed, 1447 insertions(+), 53 deletions(-) create mode 100644 RestSharp.2015.sln create mode 100644 RestSharp.All.sln create mode 100644 RestSharp.Net46/Extensions/RestClientExtensions.cs create mode 100644 RestSharp.Net46/Properties/AssemblyInfo.cs create mode 100644 RestSharp.Net46/RestSharp.Net46.Signed.csproj create mode 100644 RestSharp.Net46/RestSharp.Net46.csproj create mode 100644 RestSharp.Net46/packages.config rename RestSharp/{RestSharp.Signed.csproj => RestSharp.Net35.Signed.csproj} (98%) rename RestSharp/{RestSharp.csproj => RestSharp.Net35.csproj} (100%) diff --git a/.nuget/Signed/RestSharp.Build.dll b/.nuget/Signed/RestSharp.Build.dll index 71d45f9125d81e6bb90ebca280751b3ce0ee9522..7ad762763b61a55e0a0c49a7b87f5c1f2f56056c 100644 GIT binary patch delta 193 zcmV;y06zbKK!8Ayhy!S`!jX$j0}ROkvDOP%|skW3(*2?1~65W z%W7vp1nN6-<@r)CnRh9``}vB?w)M z#PmGH3<}740D+NPdBN~&mXkT)>09&ZXT1r4QMe7JGqwUjHJ~qHVpeO9BV&FKcauZl v0adfm0z45AeICzl4KLPAoL!$`#e?-^vm6v`0t0BV!jp>@DFFntwH8YWuUb>a delta 193 zcmV;y06zbKK!8Ayhy%F|z>$kh1K0oovD;Q(| zj{mC~5MR>8>!zT#HX^Ot_LwcIgJ`{1-_^#}JNR*Id0HD^)=q$|v>DFFeqwH8YWEE`zK diff --git a/RestSharp.2015.sln b/RestSharp.2015.sln new file mode 100644 index 000000000..a36ec2ce6 --- /dev/null +++ b/RestSharp.2015.sln @@ -0,0 +1,277 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NuGet", "NuGet", "{E709A928-A45C-4622-A35C-CCD8EE44CA80}" + ProjectSection(SolutionItems) = preProject + package.cmd = package.cmd + packageAll.cmd = packageAll.cmd + packageSigned.cmd = packageSigned.cmd + readme.txt = readme.txt + restsharp.nuspec = restsharp.nuspec + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{1B3F12F6-D32B-48C4-98D7-AB448EB78811}" + ProjectSection(SolutionItems) = preProject + .nuget\NuGet.exe = .nuget\NuGet.exe + .nuget\NuGet.targets = .nuget\NuGet.targets + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{C5B02FAA-6A0A-4BF9-BBD4-82FD2DCBF669}" + ProjectSection(SolutionItems) = preProject + CONTRIBUTING.markdown = CONTRIBUTING.markdown + README.markdown = README.markdown + readme.txt = readme.txt + releasenotes.markdown = releasenotes.markdown + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp", "RestSharp\RestSharp.csproj", "{2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Tests", "RestSharp.Tests\RestSharp.Tests.csproj", "{1464E4AC-18BB-4F23-8A0B-68196F9E1871}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.IntegrationTests", "RestSharp.IntegrationTests\RestSharp.IntegrationTests.csproj", "{47D3EBB9-0300-4AF8-BAC5-740D51454A63}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Silverlight", "RestSharp.Silverlight\RestSharp.Silverlight.csproj", "{11F84600-0978-48B9-A28F-63B3781E54B3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.WindowsPhone", "RestSharp.WindowsPhone\RestSharp.WindowsPhone.csproj", "{F4D48DF6-316E-4963-B5C1-59CA39B431B7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net4", "RestSharp.Net4\RestSharp.Net4.csproj", "{5FF943A5-260F-4042-B4CE-C4977BAD4EBB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Build", "RestSharp.Build\RestSharp.Build.csproj", "{CCC30138-3D68-44D8-AF1A-D22F769EE8DC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net45", "RestSharp.Net45\RestSharp.Net45.csproj", "{D5D62FE9-1679-4697-BDC6-9574D907A717}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net451", "RestSharp.Net451\RestSharp.Net451.csproj", "{53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net452", "RestSharp.Net452\RestSharp.Net452.csproj", "{353349A9-4E6C-4706-A1C4-8363EAE0DBF3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net46", "RestSharp.Net46\RestSharp.Net46.csproj", "{47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x86 = Debug|x86 + DebugAppveyor|Any CPU = DebugAppveyor|Any CPU + DebugAppveyor|ARM = DebugAppveyor|ARM + DebugAppveyor|Mixed Platforms = DebugAppveyor|Mixed Platforms + DebugAppveyor|x86 = DebugAppveyor|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|ARM.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|x86.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Any CPU.Build.0 = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|ARM.ActiveCfg = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|x86.ActiveCfg = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|ARM.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|x86.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|Any CPU.Build.0 = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|ARM.ActiveCfg = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|x86.ActiveCfg = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|ARM.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|x86.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|Mixed Platforms.ActiveCfg = DebugAppveyor|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|Mixed Platforms.Build.0 = DebugAppveyor|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|Any CPU.Build.0 = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|ARM.ActiveCfg = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|x86.ActiveCfg = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|ARM.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|x86.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|Any CPU.Build.0 = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|ARM.ActiveCfg = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|x86.ActiveCfg = Release|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|ARM.ActiveCfg = Debug|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|ARM.Build.0 = Debug|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|x86.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|ARM.ActiveCfg = Debug|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|ARM.Build.0 = Debug|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|Any CPU.Build.0 = Release|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|ARM.ActiveCfg = Release|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|ARM.Build.0 = Release|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|x86.ActiveCfg = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|ARM.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|x86.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|Any CPU.Build.0 = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|ARM.ActiveCfg = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|x86.ActiveCfg = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|ARM.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|x86.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|Any CPU.Build.0 = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|ARM.ActiveCfg = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|x86.ActiveCfg = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|ARM.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|x86.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|Any CPU.Build.0 = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|ARM.ActiveCfg = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|x86.ActiveCfg = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|ARM.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|x86.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|Any CPU.Build.0 = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|ARM.ActiveCfg = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|x86.ActiveCfg = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|ARM.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|x86.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|Any CPU.Build.0 = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|ARM.ActiveCfg = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|x86.ActiveCfg = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|ARM.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|ARM.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|x86.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|x86.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|ARM.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|x86.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|Any CPU.Build.0 = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|ARM.ActiveCfg = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|ARM.Build.0 = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|x86.ActiveCfg = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/RestSharp.All.sln b/RestSharp.All.sln new file mode 100644 index 000000000..4b7d83b8f --- /dev/null +++ b/RestSharp.All.sln @@ -0,0 +1,451 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NuGet", "NuGet", "{E709A928-A45C-4622-A35C-CCD8EE44CA80}" + ProjectSection(SolutionItems) = preProject + package.cmd = package.cmd + packageAll.cmd = packageAll.cmd + packageSigned.cmd = packageSigned.cmd + readme.txt = readme.txt + restsharp.nuspec = restsharp.nuspec + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{1B3F12F6-D32B-48C4-98D7-AB448EB78811}" + ProjectSection(SolutionItems) = preProject + .nuget\NuGet.exe = .nuget\NuGet.exe + .nuget\NuGet.targets = .nuget\NuGet.targets + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{C5B02FAA-6A0A-4BF9-BBD4-82FD2DCBF669}" + ProjectSection(SolutionItems) = preProject + CONTRIBUTING.markdown = CONTRIBUTING.markdown + README.markdown = README.markdown + readme.txt = readme.txt + releasenotes.markdown = releasenotes.markdown + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net35", "RestSharp\RestSharp.Net35.csproj", "{2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Tests", "RestSharp.Tests\RestSharp.Tests.csproj", "{1464E4AC-18BB-4F23-8A0B-68196F9E1871}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.IntegrationTests", "RestSharp.IntegrationTests\RestSharp.IntegrationTests.csproj", "{47D3EBB9-0300-4AF8-BAC5-740D51454A63}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Silverlight", "RestSharp.Silverlight\RestSharp.Silverlight.csproj", "{11F84600-0978-48B9-A28F-63B3781E54B3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.WindowsPhone", "RestSharp.WindowsPhone\RestSharp.WindowsPhone.csproj", "{F4D48DF6-316E-4963-B5C1-59CA39B431B7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net4", "RestSharp.Net4\RestSharp.Net4.csproj", "{5FF943A5-260F-4042-B4CE-C4977BAD4EBB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Build", "RestSharp.Build\RestSharp.Build.csproj", "{CCC30138-3D68-44D8-AF1A-D22F769EE8DC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net45", "RestSharp.Net45\RestSharp.Net45.csproj", "{D5D62FE9-1679-4697-BDC6-9574D907A717}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net451", "RestSharp.Net451\RestSharp.Net451.csproj", "{53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net452", "RestSharp.Net452\RestSharp.Net452.csproj", "{353349A9-4E6C-4706-A1C4-8363EAE0DBF3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net46", "RestSharp.Net46\RestSharp.Net46.csproj", "{47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net35.Signed", "RestSharp\RestSharp.Net35.Signed.csproj", "{3190E0DC-674C-4C41-A7A3-BD2F406963B0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Build.Signed", "RestSharp.Build\RestSharp.Build.Signed.csproj", "{60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.IntegrationTests.Signed", "RestSharp.IntegrationTests\RestSharp.IntegrationTests.Signed.csproj", "{3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net4.Signed", "RestSharp.Net4\RestSharp.Net4.Signed.csproj", "{ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net45.Signed", "RestSharp.Net45\RestSharp.Net45.Signed.csproj", "{EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net46.Signed", "RestSharp.Net46\RestSharp.Net46.Signed.csproj", "{BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net451.Signed", "RestSharp.Net451\RestSharp.Net451.Signed.csproj", "{142BC56F-48B2-4BAE-A33D-583D0B77232C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net452.Signed", "RestSharp.Net452\RestSharp.Net452.Signed.csproj", "{F4C74773-8D8E-4A7D-977B-DE985B4D49D9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Tests.Signed", "RestSharp.Tests\RestSharp.Tests.Signed.csproj", "{25D4AAB0-B538-4F13-AB0E-96247307858B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x86 = Debug|x86 + DebugAppveyor|Any CPU = DebugAppveyor|Any CPU + DebugAppveyor|ARM = DebugAppveyor|ARM + DebugAppveyor|Mixed Platforms = DebugAppveyor|Mixed Platforms + DebugAppveyor|x86 = DebugAppveyor|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|ARM.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|x86.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Any CPU.Build.0 = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|ARM.ActiveCfg = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|x86.ActiveCfg = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|ARM.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|x86.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|Any CPU.Build.0 = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|ARM.ActiveCfg = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Release|x86.ActiveCfg = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|ARM.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Debug|x86.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|Mixed Platforms.ActiveCfg = DebugAppveyor|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|Mixed Platforms.Build.0 = DebugAppveyor|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|Any CPU.Build.0 = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|ARM.ActiveCfg = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {47D3EBB9-0300-4AF8-BAC5-740D51454A63}.Release|x86.ActiveCfg = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|ARM.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Debug|x86.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|Any CPU.Build.0 = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|ARM.ActiveCfg = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {11F84600-0978-48B9-A28F-63B3781E54B3}.Release|x86.ActiveCfg = Release|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|ARM.ActiveCfg = Debug|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|ARM.Build.0 = Debug|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Debug|x86.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|ARM.ActiveCfg = Debug|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|ARM.Build.0 = Debug|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|Any CPU.Build.0 = Release|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|ARM.ActiveCfg = Release|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|ARM.Build.0 = Release|ARM + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {F4D48DF6-316E-4963-B5C1-59CA39B431B7}.Release|x86.ActiveCfg = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|ARM.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Debug|x86.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|Any CPU.Build.0 = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|ARM.ActiveCfg = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {5FF943A5-260F-4042-B4CE-C4977BAD4EBB}.Release|x86.ActiveCfg = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|ARM.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Debug|x86.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|Any CPU.Build.0 = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|ARM.ActiveCfg = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {CCC30138-3D68-44D8-AF1A-D22F769EE8DC}.Release|x86.ActiveCfg = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|ARM.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Debug|x86.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|Any CPU.Build.0 = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|ARM.ActiveCfg = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D5D62FE9-1679-4697-BDC6-9574D907A717}.Release|x86.ActiveCfg = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|ARM.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Debug|x86.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|Any CPU.Build.0 = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|ARM.ActiveCfg = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {53F45A1D-088B-4A2C-A8E2-5901F0DB5EA8}.Release|x86.ActiveCfg = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|ARM.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Debug|x86.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|Any CPU.Build.0 = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|ARM.ActiveCfg = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|x86.ActiveCfg = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|ARM.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Debug|x86.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|Any CPU.Build.0 = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|ARM.ActiveCfg = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2}.Release|x86.ActiveCfg = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|ARM.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|x86.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|Any CPU.Build.0 = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|ARM.ActiveCfg = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|x86.ActiveCfg = Release|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Debug|ARM.ActiveCfg = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Debug|x86.ActiveCfg = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Release|Any CPU.Build.0 = Release|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Release|ARM.ActiveCfg = Release|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475}.Release|x86.ActiveCfg = Release|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Debug|ARM.ActiveCfg = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Release|Any CPU.Build.0 = Release|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Release|ARM.ActiveCfg = Release|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6}.Release|x86.ActiveCfg = Release|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Debug|ARM.ActiveCfg = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Debug|x86.ActiveCfg = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Release|Any CPU.Build.0 = Release|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Release|ARM.ActiveCfg = Release|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92}.Release|x86.ActiveCfg = Release|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Debug|ARM.ActiveCfg = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Debug|x86.ActiveCfg = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Release|Any CPU.Build.0 = Release|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Release|ARM.ActiveCfg = Release|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {EC77CB3A-A55C-4A00-8471-C9AADAE2EED4}.Release|x86.ActiveCfg = Release|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Debug|ARM.ActiveCfg = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Debug|x86.ActiveCfg = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Release|Any CPU.Build.0 = Release|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Release|ARM.ActiveCfg = Release|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Release|x86.ActiveCfg = Release|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Debug|ARM.ActiveCfg = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Debug|x86.ActiveCfg = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Release|Any CPU.Build.0 = Release|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Release|ARM.ActiveCfg = Release|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {142BC56F-48B2-4BAE-A33D-583D0B77232C}.Release|x86.ActiveCfg = Release|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Debug|ARM.ActiveCfg = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Debug|x86.ActiveCfg = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Release|Any CPU.Build.0 = Release|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Release|ARM.ActiveCfg = Release|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9}.Release|x86.ActiveCfg = Release|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Debug|ARM.ActiveCfg = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Debug|x86.ActiveCfg = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Release|Any CPU.Build.0 = Release|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Release|ARM.ActiveCfg = Release|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {25D4AAB0-B538-4F13-AB0E-96247307858B}.Release|x86.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/RestSharp.Build/RestSharp.Build.Signed.csproj b/RestSharp.Build/RestSharp.Build.Signed.csproj index 007591010..04daffbb8 100644 --- a/RestSharp.Build/RestSharp.Build.Signed.csproj +++ b/RestSharp.Build/RestSharp.Build.Signed.csproj @@ -5,7 +5,7 @@ AnyCPU 8.0.30703 2.0 - {CCC30138-3D68-44D8-AF1A-D22F769EE8DC} + {60CF35B5-ABE3-47E4-BA0C-0ABAF1618475} Library Properties RestSharp.Build diff --git a/RestSharp.IntegrationTests/RestSharp.IntegrationTests.Signed.csproj b/RestSharp.IntegrationTests/RestSharp.IntegrationTests.Signed.csproj index 21cb24ea3..74edf6121 100644 --- a/RestSharp.IntegrationTests/RestSharp.IntegrationTests.Signed.csproj +++ b/RestSharp.IntegrationTests/RestSharp.IntegrationTests.Signed.csproj @@ -5,7 +5,7 @@ AnyCPU 9.0.30729 2.0 - {47D3EBB9-0300-4AF8-BAC5-740D51454A63} + {3AC3B97E-D5AF-4462-BF5D-0EC28F4619C6} Library Properties RestSharp.IntegrationTests @@ -98,7 +98,7 @@ - {5ff943a5-260f-4042-b4ce-c4977bad4ebb} + {ed71eee1-29e5-437a-a4c7-06da0ec1aa92} RestSharp.Net4.Signed diff --git a/RestSharp.Net4/RestSharp.Net4.Signed.csproj b/RestSharp.Net4/RestSharp.Net4.Signed.csproj index 9ef2cdb48..3cab4f2da 100644 --- a/RestSharp.Net4/RestSharp.Net4.Signed.csproj +++ b/RestSharp.Net4/RestSharp.Net4.Signed.csproj @@ -5,7 +5,7 @@ AnyCPU 8.0.30703 2.0 - {5FF943A5-260F-4042-B4CE-C4977BAD4EBB} + {ED71EEE1-29E5-437A-A4C7-06DA0EC1AA92} Library Properties RestSharp diff --git a/RestSharp.Net452/RestSharp.Net452.Signed.csproj b/RestSharp.Net452/RestSharp.Net452.Signed.csproj index fe6e497cf..62974f27e 100644 --- a/RestSharp.Net452/RestSharp.Net452.Signed.csproj +++ b/RestSharp.Net452/RestSharp.Net452.Signed.csproj @@ -5,7 +5,7 @@ AnyCPU 8.0.30703 2.0 - {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110} + {F4C74773-8D8E-4A7D-977B-DE985B4D49D9} Library Properties RestSharp diff --git a/RestSharp.Net46/Extensions/RestClientExtensions.cs b/RestSharp.Net46/Extensions/RestClientExtensions.cs new file mode 100644 index 000000000..553c6ce78 --- /dev/null +++ b/RestSharp.Net46/Extensions/RestClientExtensions.cs @@ -0,0 +1,17 @@ + +namespace RestSharp.Extensions +{ + public static partial class RestClientExtensions + { + public static RestResponse ExecuteDynamic(this IRestClient client, IRestRequest request) + { + var response = client.Execute(request); + var generic = (RestResponse)response; + dynamic content = SimpleJson.DeserializeObject(response.Content); + + generic.Data = content; + + return generic; + } + } +} diff --git a/RestSharp.Net46/Properties/AssemblyInfo.cs b/RestSharp.Net46/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..9c1b96b16 --- /dev/null +++ b/RestSharp.Net46/Properties/AssemblyInfo.cs @@ -0,0 +1,24 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("RestSharp")] + +// 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. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("97044cbf-6c9d-4b08-87e3-bf30fbde1933")] + +#if SIGNED +[assembly: InternalsVisibleTo("RestSharp.IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100fda57af14a288d46e3efea89617037585c4de57159cd536ca6dff792ea1d6addc665f2fccb4285413d9d44db5a1be87cb82686db200d16325ed9c42c89cd4824d8cc447f7cee2ac000924c3bceeb1b7fcb5cc1a3901785964d48ce14172001084134f4dcd9973c3776713b595443b1064bb53e2eeb924969244d354e46495e9d"), + InternalsVisibleTo("RestSharp.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100fda57af14a288d46e3efea89617037585c4de57159cd536ca6dff792ea1d6addc665f2fccb4285413d9d44db5a1be87cb82686db200d16325ed9c42c89cd4824d8cc447f7cee2ac000924c3bceeb1b7fcb5cc1a3901785964d48ce14172001084134f4dcd9973c3776713b595443b1064bb53e2eeb924969244d354e46495e9d")] +#else +[assembly: InternalsVisibleTo("RestSharp.IntegrationTests"), + InternalsVisibleTo("RestSharp.Tests")] +#endif diff --git a/RestSharp.Net46/RestSharp.Net46.Signed.csproj b/RestSharp.Net46/RestSharp.Net46.Signed.csproj new file mode 100644 index 000000000..fe6e497cf --- /dev/null +++ b/RestSharp.Net46/RestSharp.Net46.Signed.csproj @@ -0,0 +1,301 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110} + Library + Properties + RestSharp + RestSharp + v4.5.2 + 512 + ..\ + true + + + + true + full + false + bin\DebugSigned\ + obj\DebugSigned\ + TRACE;DEBUG;FRAMEWORK, NET4, SIGNED + prompt + 4 + bin\DebugSigned\RestSharp.xml + 1591,1584,1572,1574,1658 + false + + + pdbonly + true + bin\ReleaseSigned\ + obj\ReleaseSigned\ + TRACE;FRAMEWORK, NET4, SIGNED + prompt + 4 + bin\ReleaseSigned\RestSharp.xml + 1591,1573,1658,1584,1574,1572 + true + false + + + true + + + ..\RestSharp.snk + + + false + + + + + + + + + + + + + Authenticators\HttpBasicAuthenticator.cs + + + Authenticators\IAuthenticator.cs + + + Authenticators\JwtAuthenticator.cs + + + Authenticators\NtlmAuthenticator.cs + + + Authenticators\OAuth1Authenticator.cs + + + Authenticators\OAuth2Authenticator.cs + + + Authenticators\OAuth\Extensions\CollectionExtensions.cs + + + Authenticators\OAuth\Extensions\OAuthExtensions.cs + + + Authenticators\OAuth\Extensions\StringExtensions.cs + + + Authenticators\OAuth\Extensions\TimeExtensions.cs + + + Authenticators\OAuth\HttpPostParameter.cs + + + Authenticators\OAuth\HttpPostParameterType.cs + + + Authenticators\OAuth\OAuthParameterHandling.cs + + + Authenticators\OAuth\OAuthSignatureMethod.cs + + + Authenticators\OAuth\OAuthSignatureTreatment.cs + + + Authenticators\OAuth\OAuthTools.cs + + + Authenticators\OAuth\OAuthType.cs + + + Authenticators\OAuth\OAuthWebQueryInfo.cs + + + Authenticators\OAuth\OAuthWorkflow.cs + + + Authenticators\OAuth\WebPair.cs + + + Authenticators\OAuth\WebPairCollection.cs + + + Authenticators\OAuth\WebParameter.cs + + + Authenticators\OAuth\WebParameterCollection.cs + + + Authenticators\SimpleAuthenticator.cs + + + Deserializers\DeserializeAsAttribute.cs + + + Deserializers\DotNetXmlDeserializer.cs + + + Deserializers\IDeserializer.cs + + + Deserializers\JsonDeserializer.cs + + + Deserializers\XmlAttributeDeserializer.cs + + + Deserializers\XmlDeserializer.cs + + + Enum.cs + + + Extensions\MiscExtensions.cs + + + Extensions\MonoHttp\Helpers.cs + + + Extensions\MonoHttp\HtmlEncoder.cs + + + Extensions\MonoHttp\HttpUtility.cs + + + Extensions\ReflectionExtensions.cs + + + Extensions\ResponseExtensions.cs + + + Extensions\ResponseStatusExtensions.cs + + + Extensions\StringExtensions.cs + + + Extensions\XmlExtensions.cs + + + FileParameter.cs + + + Http.Async.cs + + + Http.cs + + + Http.Sync.cs + + + HttpCookie.cs + + + HttpFile.cs + + + HttpHeader.cs + + + HttpParameter.cs + + + HttpResponse.cs + + + IHttp.cs + + + IHttpFactory.cs + + + IHttpResponse.cs + + + IRestClient.cs + + + IRestRequest.cs + + + IRestResponse.cs + + + Parameter.cs + + + RestClient.Async.cs + + + RestClient.cs + + + RestClient.Sync.cs + + + RestClientExtensions.cs + + + RestRequest.cs + + + RestRequestAsyncHandle.cs + + + RestResponse.cs + + + RestResponseCookie.cs + + + Serializers\DotNetXmlSerializer.cs + + + Serializers\ISerializer.cs + + + Serializers\JsonSerializer.cs + + + Serializers\SerializeAsAttribute.cs + + + Serializers\XmlSerializer.cs + + + SharedAssemblyInfo.cs + + + Validation\Require.cs + + + SimpleJson.cs + + + Validation\Validate.cs + + + + + + + RestSharp.snk + + + + + + + \ No newline at end of file diff --git a/RestSharp.Net46/RestSharp.Net46.csproj b/RestSharp.Net46/RestSharp.Net46.csproj new file mode 100644 index 000000000..1912646c9 --- /dev/null +++ b/RestSharp.Net46/RestSharp.Net46.csproj @@ -0,0 +1,289 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {47C29B0E-D6F9-4FAA-B321-20053A1E3EE2} + Library + Properties + RestSharp + RestSharp + v4.6 + 512 + ..\ + true + + + + true + full + false + bin\Debug\ + TRACE;DEBUG;FRAMEWORK, NET4 + prompt + 4 + bin\Debug\RestSharp.xml + 1591,1584,1572,1574,1658 + false + + + pdbonly + true + bin\Release\ + TRACE;FRAMEWORK, NET4 + prompt + 4 + bin\Release\RestSharp.xml + 1591,1573,1658,1584,1574,1572 + true + false + + + + + + + + + + + + + Authenticators\HttpBasicAuthenticator.cs + + + Authenticators\IAuthenticator.cs + + + Authenticators\JwtAuthenticator.cs + + + Authenticators\NtlmAuthenticator.cs + + + Authenticators\OAuth1Authenticator.cs + + + Authenticators\OAuth2Authenticator.cs + + + Authenticators\OAuth\Extensions\CollectionExtensions.cs + + + Authenticators\OAuth\Extensions\OAuthExtensions.cs + + + Authenticators\OAuth\Extensions\StringExtensions.cs + + + Authenticators\OAuth\Extensions\TimeExtensions.cs + + + Authenticators\OAuth\HttpPostParameter.cs + + + Authenticators\OAuth\HttpPostParameterType.cs + + + Authenticators\OAuth\OAuthParameterHandling.cs + + + Authenticators\OAuth\OAuthSignatureMethod.cs + + + Authenticators\OAuth\OAuthSignatureTreatment.cs + + + Authenticators\OAuth\OAuthTools.cs + + + Authenticators\OAuth\OAuthType.cs + + + Authenticators\OAuth\OAuthWebQueryInfo.cs + + + Authenticators\OAuth\OAuthWorkflow.cs + + + Authenticators\OAuth\WebPair.cs + + + Authenticators\OAuth\WebPairCollection.cs + + + Authenticators\OAuth\WebParameter.cs + + + Authenticators\OAuth\WebParameterCollection.cs + + + Authenticators\SimpleAuthenticator.cs + + + Deserializers\DeserializeAsAttribute.cs + + + Deserializers\DotNetXmlDeserializer.cs + + + Deserializers\IDeserializer.cs + + + Deserializers\JsonDeserializer.cs + + + Deserializers\XmlAttributeDeserializer.cs + + + Deserializers\XmlDeserializer.cs + + + Enum.cs + + + Extensions\MiscExtensions.cs + + + Extensions\MonoHttp\Helpers.cs + + + Extensions\MonoHttp\HtmlEncoder.cs + + + Extensions\MonoHttp\HttpUtility.cs + + + Extensions\ReflectionExtensions.cs + + + Extensions\ResponseExtensions.cs + + + Extensions\ResponseStatusExtensions.cs + + + Extensions\StringExtensions.cs + + + Extensions\XmlExtensions.cs + + + FileParameter.cs + + + Http.Async.cs + + + Http.cs + + + Http.Sync.cs + + + HttpCookie.cs + + + HttpFile.cs + + + HttpHeader.cs + + + HttpParameter.cs + + + HttpResponse.cs + + + IHttp.cs + + + IHttpFactory.cs + + + IHttpResponse.cs + + + IRestClient.cs + + + IRestRequest.cs + + + IRestResponse.cs + + + Parameter.cs + + + RestClient.Async.cs + + + RestClient.cs + + + RestClient.Sync.cs + + + RestClientExtensions.cs + + + RestRequest.cs + + + RestRequestAsyncHandle.cs + + + RestResponse.cs + + + RestResponseCookie.cs + + + Serializers\DotNetXmlSerializer.cs + + + Serializers\ISerializer.cs + + + Serializers\JsonSerializer.cs + + + Serializers\SerializeAsAttribute.cs + + + Serializers\XmlSerializer.cs + + + SharedAssemblyInfo.cs + + + Validation\Require.cs + + + SimpleJson.cs + + + Validation\Validate.cs + + + + + + + Designer + + + + + + \ No newline at end of file diff --git a/RestSharp.Net46/packages.config b/RestSharp.Net46/packages.config new file mode 100644 index 000000000..6b8deb9c9 --- /dev/null +++ b/RestSharp.Net46/packages.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/RestSharp.Signed.sln b/RestSharp.Signed.sln index 1973b999f..73fed770b 100644 --- a/RestSharp.Signed.sln +++ b/RestSharp.Signed.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30723.0 +VisualStudioVersion = 12.0.40629.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NuGet", "NuGet", "{E709A928-A45C-4622-A35C-CCD8EE44CA80}" ProjectSection(SolutionItems) = preProject @@ -25,8 +25,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{C5B02FAA-6 releasenotes.markdown = releasenotes.markdown EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Signed", "RestSharp\RestSharp.Signed.csproj", "{2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Tests.Signed", "RestSharp.Tests\RestSharp.Tests.Signed.csproj", "{1464E4AC-18BB-4F23-8A0B-68196F9E1871}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.IntegrationTests.Signed", "RestSharp.IntegrationTests\RestSharp.IntegrationTests.Signed.csproj", "{47D3EBB9-0300-4AF8-BAC5-740D51454A63}" @@ -45,6 +43,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net451.Signed", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net452.Signed", "RestSharp.Net452\RestSharp.Net452.Signed.csproj", "{BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net35.Signed", "RestSharp\RestSharp.Net35.Signed.csproj", "{3190E0DC-674C-4C41-A7A3-BD2F406963B0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -57,18 +57,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|ARM.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|x86.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Any CPU.Build.0 = Release|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|ARM.ActiveCfg = Release|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|x86.ActiveCfg = Release|Any CPU {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Any CPU.Build.0 = Debug|Any CPU {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -179,6 +167,18 @@ Global {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Release|Mixed Platforms.Build.0 = Release|Any CPU {BD61DB80-63AC-4BFD-8232-A5C4DD9B8110}.Release|x86.ActiveCfg = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|ARM.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Debug|x86.ActiveCfg = Debug|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|Any CPU.Build.0 = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|ARM.ActiveCfg = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3190E0DC-674C-4C41-A7A3-BD2F406963B0}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/RestSharp.Tests/RestSharp.Tests.Signed.csproj b/RestSharp.Tests/RestSharp.Tests.Signed.csproj index 578d9f9e6..517f4b30d 100644 --- a/RestSharp.Tests/RestSharp.Tests.Signed.csproj +++ b/RestSharp.Tests/RestSharp.Tests.Signed.csproj @@ -5,7 +5,7 @@ AnyCPU 9.0.30729 2.0 - {1464E4AC-18BB-4F23-8A0B-68196F9E1871} + {25D4AAB0-B538-4F13-AB0E-96247307858B} Library Properties RestSharp.Tests @@ -225,12 +225,12 @@ - {ccc30138-3d68-44d8-af1a-d22f769ee8dc} + {60cf35b5-abe3-47e4-ba0c-0abaf1618475} RestSharp.Build.Signed - - {2ececfbf-5f3e-40ee-a963-72336dc7abe2} - RestSharp.Signed + + {3190e0dc-674c-4c41-a7a3-bd2f406963b0} + RestSharp.Net35.Signed diff --git a/RestSharp.Tests/RestSharp.Tests.csproj b/RestSharp.Tests/RestSharp.Tests.csproj index 75f9d8ef9..a23aa111a 100644 --- a/RestSharp.Tests/RestSharp.Tests.csproj +++ b/RestSharp.Tests/RestSharp.Tests.csproj @@ -226,9 +226,9 @@ {CCC30138-3D68-44D8-AF1A-D22F769EE8DC} RestSharp.Build - - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2} - RestSharp + + {2ececfbf-5f3e-40ee-a963-72336dc7abe2} + RestSharp.Net35 diff --git a/RestSharp.sln b/RestSharp.sln index 245edcc9d..a40282629 100644 --- a/RestSharp.sln +++ b/RestSharp.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30723.0 +VisualStudioVersion = 12.0.40629.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NuGet", "NuGet", "{E709A928-A45C-4622-A35C-CCD8EE44CA80}" ProjectSection(SolutionItems) = preProject @@ -25,8 +25,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{C5B02FAA-6 releasenotes.markdown = releasenotes.markdown EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp", "RestSharp\RestSharp.csproj", "{2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Tests", "RestSharp.Tests\RestSharp.Tests.csproj", "{1464E4AC-18BB-4F23-8A0B-68196F9E1871}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.IntegrationTests", "RestSharp.IntegrationTests\RestSharp.IntegrationTests.csproj", "{47D3EBB9-0300-4AF8-BAC5-740D51454A63}" @@ -45,6 +43,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net451", "RestSha EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net452", "RestSharp.Net452\RestSharp.Net452.csproj", "{353349A9-4E6C-4706-A1C4-8363EAE0DBF3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Net35", "RestSharp\RestSharp.Net35.csproj", "{2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -61,24 +61,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|ARM.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|x86.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Any CPU.Build.0 = Release|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|ARM.ActiveCfg = Release|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|x86.ActiveCfg = Release|Any CPU {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|Any CPU.Build.0 = Debug|Any CPU {1464E4AC-18BB-4F23-8A0B-68196F9E1871}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -244,6 +226,24 @@ Global {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|Mixed Platforms.Build.0 = Release|Any CPU {353349A9-4E6C-4706-A1C4-8363EAE0DBF3}.Release|x86.ActiveCfg = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|ARM.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Debug|x86.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Any CPU.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Any CPU.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|ARM.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|Mixed Platforms.Build.0 = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.DebugAppveyor|x86.ActiveCfg = Debug|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Any CPU.Build.0 = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|ARM.ActiveCfg = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/RestSharp/Deserializers/JsonDeserializer.cs b/RestSharp/Deserializers/JsonDeserializer.cs index 4c0116fd0..3008a6b01 100644 --- a/RestSharp/Deserializers/JsonDeserializer.cs +++ b/RestSharp/Deserializers/JsonDeserializer.cs @@ -277,12 +277,21 @@ private object ConvertValue(Type type, object value) } else if (type == typeof(TimeSpan)) { +#if PocketPC + try + { + TimeSpan timeSpan = TimeSpan.Parse(stringValue); + + return timeSpan; + } + catch (Exception) { } +#else TimeSpan timeSpan; if (TimeSpan.TryParse(stringValue, out timeSpan)) { return timeSpan; } - +#endif // This should handle ISO 8601 durations return XmlConvert.ToTimeSpan(stringValue); } diff --git a/RestSharp/RestRequest.cs b/RestSharp/RestRequest.cs index 03ae59f1b..3172bb0b8 100644 --- a/RestSharp/RestRequest.cs +++ b/RestSharp/RestRequest.cs @@ -122,7 +122,11 @@ public RestRequest(Uri resource, Method method) /// Full path to file to upload /// The MIME type of the file to upload /// This request +#if PocketPC + public IRestRequest AddFile(string name, string path, string contentType) +#else public IRestRequest AddFile(string name, string path, string contentType = null) +#endif { FileInfo f = new FileInfo(path); long fileLength = f.Length; @@ -151,7 +155,11 @@ public IRestRequest AddFile(string name, string path, string contentType = null) /// The file name to use for the uploaded file /// The MIME type of the file to upload /// This request +#if PocketPC + public IRestRequest AddFile(string name, byte[] bytes, string fileName, string contentType) +#else public IRestRequest AddFile(string name, byte[] bytes, string fileName, string contentType = null) +#endif { return this.AddFile(FileParameter.Create(name, bytes, fileName, contentType)); } @@ -164,7 +172,11 @@ public IRestRequest AddFile(string name, byte[] bytes, string fileName, string c /// The file name to use for the uploaded file /// The MIME type of the file to upload /// This request +#if PocketPC + public IRestRequest AddFile(string name, Action writer, string fileName, string contentType) +#else public IRestRequest AddFile(string name, Action writer, string fileName, string contentType = null) +#endif { return AddFile(new FileParameter { @@ -189,8 +201,15 @@ private IRestRequest AddFile(FileParameter file) /// The file name to use for the uploaded file /// Specific content type. Es: application/x-gzip /// +#if PocketPC + public IRestRequest AddFileBytes(string name, byte[] bytes, string filename, string contentType) + { + if (string.IsNullOrEmpty(contentType)) + contentType = "application/x-gzip"; +#else public IRestRequest AddFileBytes(string name, byte[] bytes, string filename, string contentType = "application/x-gzip") { +#endif long length = bytes.Length; return AddFile(new FileParameter diff --git a/RestSharp/RestSharp.Signed.csproj b/RestSharp/RestSharp.Net35.Signed.csproj similarity index 98% rename from RestSharp/RestSharp.Signed.csproj rename to RestSharp/RestSharp.Net35.Signed.csproj index 020845cc8..bd42d9160 100644 --- a/RestSharp/RestSharp.Signed.csproj +++ b/RestSharp/RestSharp.Net35.Signed.csproj @@ -5,7 +5,7 @@ AnyCPU 9.0.30729 2.0 - {2ECECFBF-5F3E-40EE-A963-72336DC7ABE2} + {3190E0DC-674C-4C41-A7A3-BD2F406963B0} Library Properties RestSharp @@ -201,9 +201,9 @@ - + {ccc30138-3d68-44d8-af1a-d22f769ee8dc} - RestSharp.Build.Signed + RestSharp.Build diff --git a/RestSharp/RestSharp.csproj b/RestSharp/RestSharp.Net35.csproj similarity index 100% rename from RestSharp/RestSharp.csproj rename to RestSharp/RestSharp.Net35.csproj diff --git a/RestSharp/SimpleJson.cs b/RestSharp/SimpleJson.cs index 4e857b69c..12f7d619c 100644 --- a/RestSharp/SimpleJson.cs +++ b/RestSharp/SimpleJson.cs @@ -1348,8 +1348,10 @@ public virtual object DeserializeObject(object value, Type type) { if (type == typeof(DateTime) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTime))) return DateTime.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); +#if !PocketPC if (type == typeof(DateTimeOffset) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTimeOffset))) return DateTimeOffset.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); +#endif if (type == typeof(Guid) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid))) return new Guid(str); if (type == typeof(Uri)) @@ -1479,8 +1481,10 @@ protected virtual bool TrySerializeKnownTypes(object input, out object output) bool returnValue = true; if (input is DateTime) output = ((DateTime)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); +#if !PocketPC else if (input is DateTimeOffset) output = ((DateTimeOffset)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); +#endif else if (input is Guid) output = ((Guid)input).ToString("D"); else if (input is Uri) From 34f01f9e1e1ab5bdf40c4807e759c71aadb33699 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 15 Aug 2015 12:30:56 -0700 Subject: [PATCH 2/9] fixed linked file in new 4.6 projects --- .../Extensions/RestClientExtensions.cs | 17 ----------------- RestSharp.Net46/RestSharp.Net46.Signed.csproj | 5 ++--- RestSharp.Net46/RestSharp.Net46.csproj | 4 +++- 3 files changed, 5 insertions(+), 21 deletions(-) delete mode 100644 RestSharp.Net46/Extensions/RestClientExtensions.cs diff --git a/RestSharp.Net46/Extensions/RestClientExtensions.cs b/RestSharp.Net46/Extensions/RestClientExtensions.cs deleted file mode 100644 index 553c6ce78..000000000 --- a/RestSharp.Net46/Extensions/RestClientExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ - -namespace RestSharp.Extensions -{ - public static partial class RestClientExtensions - { - public static RestResponse ExecuteDynamic(this IRestClient client, IRestRequest request) - { - var response = client.Execute(request); - var generic = (RestResponse)response; - dynamic content = SimpleJson.DeserializeObject(response.Content); - - generic.Data = content; - - return generic; - } - } -} diff --git a/RestSharp.Net46/RestSharp.Net46.Signed.csproj b/RestSharp.Net46/RestSharp.Net46.Signed.csproj index fe6e497cf..bc515030b 100644 --- a/RestSharp.Net46/RestSharp.Net46.Signed.csproj +++ b/RestSharp.Net46/RestSharp.Net46.Signed.csproj @@ -238,8 +238,8 @@ RestClient.Sync.cs - - RestClientExtensions.cs + + Extensions\RestClientExtensions.cs RestRequest.cs @@ -280,7 +280,6 @@ Validation\Validate.cs - diff --git a/RestSharp.Net46/RestSharp.Net46.csproj b/RestSharp.Net46/RestSharp.Net46.csproj index 1912646c9..76cf6c6a5 100644 --- a/RestSharp.Net46/RestSharp.Net46.csproj +++ b/RestSharp.Net46/RestSharp.Net46.csproj @@ -50,6 +50,9 @@ + + Extensions\RestClientExtensions.cs + Authenticators\HttpBasicAuthenticator.cs @@ -269,7 +272,6 @@ Validation\Validate.cs - From 6d753671d352828d9ba0729aad611938db6f2273 Mon Sep 17 00:00:00 2001 From: Michael Hallett Date: Sat, 15 Aug 2015 13:15:31 -0700 Subject: [PATCH 3/9] removed support for compact framework; removed all ifdef PocketPC statements; --- RestSharp.Compact.sln | 20 --- RestSharp.Net46/RestSharp.Net46.Signed.csproj | 3 + .../OAuth/Extensions/CollectionExtensions.cs | 2 +- .../OAuth/Extensions/StringExtensions.cs | 2 +- .../OAuth/HttpPostParameterType.cs | 2 +- .../OAuth/OAuthParameterHandling.cs | 2 +- .../OAuth/OAuthSignatureMethod.cs | 2 +- .../OAuth/OAuthSignatureTreatment.cs | 2 +- RestSharp/Authenticators/OAuth/OAuthTools.cs | 12 +- RestSharp/Authenticators/OAuth/OAuthType.cs | 2 +- .../Authenticators/OAuth/OAuthWebQueryInfo.cs | 2 +- .../Authenticators/OAuth/OAuthWorkflow.cs | 10 +- .../Authenticators/OAuth/WebPairCollection.cs | 2 +- .../Authenticators/OAuth/WebParameter.cs | 4 +- .../OAuth/WebParameterCollection.cs | 2 +- .../Authenticators/OAuth1Authenticator.cs | 5 - RestSharp/Deserializers/JsonDeserializer.cs | 22 +-- RestSharp/Deserializers/XmlDeserializer.cs | 4 +- RestSharp/Extensions/MiscExtensions.cs | 2 +- RestSharp/Extensions/MonoHttp/HtmlEncoder.cs | 8 - RestSharp/Extensions/ReflectionExtensions.cs | 4 +- RestSharp/Extensions/StringExtensions.cs | 21 --- RestSharp/FileParameter.cs | 2 +- RestSharp/Http.Async.cs | 21 +-- RestSharp/Http.Sync.cs | 20 +-- RestSharp/Http.cs | 17 +- RestSharp/IHttp.cs | 6 +- RestSharp/IRestClient.cs | 5 +- RestSharp/RestClient.Async.cs | 6 - RestSharp/RestClient.Sync.cs | 7 +- RestSharp/RestClient.cs | 21 +-- RestSharp/RestRequest.cs | 19 --- RestSharp/RestSharp.Compact.csproj | 160 ------------------ RestSharp/SharedAssemblyInfo.cs | 2 - RestSharp/SimpleJson.cs | 139 ++++++++------- 35 files changed, 131 insertions(+), 429 deletions(-) delete mode 100644 RestSharp.Compact.sln delete mode 100644 RestSharp/RestSharp.Compact.csproj diff --git a/RestSharp.Compact.sln b/RestSharp.Compact.sln deleted file mode 100644 index 39ae77eb7..000000000 --- a/RestSharp.Compact.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RestSharp.Compact", "RestSharp\RestSharp.Compact.csproj", "{A29E330B-F854-4287-BEB2-C4CBE9D9C637}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A29E330B-F854-4287-BEB2-C4CBE9D9C637}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A29E330B-F854-4287-BEB2-C4CBE9D9C637}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A29E330B-F854-4287-BEB2-C4CBE9D9C637}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A29E330B-F854-4287-BEB2-C4CBE9D9C637}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/RestSharp.Net46/RestSharp.Net46.Signed.csproj b/RestSharp.Net46/RestSharp.Net46.Signed.csproj index bc515030b..f78397fb0 100644 --- a/RestSharp.Net46/RestSharp.Net46.Signed.csproj +++ b/RestSharp.Net46/RestSharp.Net46.Signed.csproj @@ -241,6 +241,9 @@ Extensions\RestClientExtensions.cs + + RestClientExtensions.cs + RestRequest.cs diff --git a/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs index 63595328b..a54360455 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs @@ -49,7 +49,7 @@ public static void ForEach(this IEnumerable items, Action action) } } -#if !WINDOWS_PHONE && !SILVERLIGHT && !PocketPC +#if !WINDOWS_PHONE && !SILVERLIGHT public static void AddRange(this IDictionary collection, NameValueCollection range) { diff --git a/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs index e280ebe18..724b4f293 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs @@ -96,7 +96,7 @@ public static IDictionary ParseQueryString(this string query) } private const RegexOptions Options = -#if !WINDOWS_PHONE && !SILVERLIGHT && !PocketPC +#if !WINDOWS_PHONE && !SILVERLIGHT RegexOptions.Compiled | RegexOptions.IgnoreCase; #else RegexOptions.IgnoreCase; diff --git a/RestSharp/Authenticators/OAuth/HttpPostParameterType.cs b/RestSharp/Authenticators/OAuth/HttpPostParameterType.cs index e345efe4e..0ad1d3f78 100644 --- a/RestSharp/Authenticators/OAuth/HttpPostParameterType.cs +++ b/RestSharp/Authenticators/OAuth/HttpPostParameterType.cs @@ -2,7 +2,7 @@ namespace RestSharp.Authenticators.OAuth { -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE [Serializable] #endif internal enum HttpPostParameterType diff --git a/RestSharp/Authenticators/OAuth/OAuthParameterHandling.cs b/RestSharp/Authenticators/OAuth/OAuthParameterHandling.cs index 35d8f08a8..e9b79a6a5 100644 --- a/RestSharp/Authenticators/OAuth/OAuthParameterHandling.cs +++ b/RestSharp/Authenticators/OAuth/OAuthParameterHandling.cs @@ -2,7 +2,7 @@ namespace RestSharp.Authenticators.OAuth { -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE [Serializable] #endif public enum OAuthParameterHandling diff --git a/RestSharp/Authenticators/OAuth/OAuthSignatureMethod.cs b/RestSharp/Authenticators/OAuth/OAuthSignatureMethod.cs index 534fa7c47..96e16236f 100644 --- a/RestSharp/Authenticators/OAuth/OAuthSignatureMethod.cs +++ b/RestSharp/Authenticators/OAuth/OAuthSignatureMethod.cs @@ -2,7 +2,7 @@ namespace RestSharp.Authenticators.OAuth { -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE [Serializable] #endif public enum OAuthSignatureMethod diff --git a/RestSharp/Authenticators/OAuth/OAuthSignatureTreatment.cs b/RestSharp/Authenticators/OAuth/OAuthSignatureTreatment.cs index 3b767e8ba..cad9e28e1 100644 --- a/RestSharp/Authenticators/OAuth/OAuthSignatureTreatment.cs +++ b/RestSharp/Authenticators/OAuth/OAuthSignatureTreatment.cs @@ -2,7 +2,7 @@ namespace RestSharp.Authenticators.OAuth { -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE [Serializable] #endif public enum OAuthSignatureTreatment diff --git a/RestSharp/Authenticators/OAuth/OAuthTools.cs b/RestSharp/Authenticators/OAuth/OAuthTools.cs index e63fd0688..b1ee24a46 100644 --- a/RestSharp/Authenticators/OAuth/OAuthTools.cs +++ b/RestSharp/Authenticators/OAuth/OAuthTools.cs @@ -6,7 +6,7 @@ namespace RestSharp.Authenticators.OAuth { -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE [Serializable] #endif internal static class OAuthTools @@ -20,13 +20,13 @@ internal static class OAuthTools private static readonly Random _random; private static readonly object _randomLock = new object(); -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE private static readonly RandomNumberGenerator _rng = RandomNumberGenerator.Create(); #endif static OAuthTools() { -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE var bytes = new byte[4]; _rng.GetNonZeroBytes(bytes); _random = new Random(BitConverter.ToInt32(bytes, 0)); @@ -312,7 +312,6 @@ public static string GetSignature(OAuthSignatureMethod signatureMethod, switch (signatureMethod) { -#if !PocketPC case OAuthSignatureMethod.HmacSha1: { var crypto = new HMACSHA1(); @@ -323,7 +322,6 @@ public static string GetSignature(OAuthSignatureMethod signatureMethod, break; } -#endif case OAuthSignatureMethod.PlainText: { @@ -333,11 +331,7 @@ public static string GetSignature(OAuthSignatureMethod signatureMethod, } default: -#if PocketPC - throw new NotImplementedException("Only PlainText is currently supported."); -#else throw new NotImplementedException("Only HMAC-SHA1 is currently supported."); -#endif } var result = signatureTreatment == OAuthSignatureTreatment.Escaped diff --git a/RestSharp/Authenticators/OAuth/OAuthType.cs b/RestSharp/Authenticators/OAuth/OAuthType.cs index 0355695b6..8c369bb76 100644 --- a/RestSharp/Authenticators/OAuth/OAuthType.cs +++ b/RestSharp/Authenticators/OAuth/OAuthType.cs @@ -2,7 +2,7 @@ namespace RestSharp.Authenticators.OAuth { -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE [Serializable] #endif public enum OAuthType diff --git a/RestSharp/Authenticators/OAuth/OAuthWebQueryInfo.cs b/RestSharp/Authenticators/OAuth/OAuthWebQueryInfo.cs index 45057a1bf..b73cfa3e3 100644 --- a/RestSharp/Authenticators/OAuth/OAuthWebQueryInfo.cs +++ b/RestSharp/Authenticators/OAuth/OAuthWebQueryInfo.cs @@ -2,7 +2,7 @@ namespace RestSharp.Authenticators.OAuth { -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE [Serializable] #endif public class OAuthWebQueryInfo diff --git a/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs b/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs index 405442698..7b3741b4a 100644 --- a/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs +++ b/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using RestSharp.Authenticators.OAuth.Extensions; -#if !WINDOWS_PHONE && !SILVERLIGHT && !PocketPC +#if !WINDOWS_PHONE && !SILVERLIGHT using RestSharp.Contrib; #endif @@ -223,23 +223,19 @@ public virtual OAuthWebQueryInfo BuildProtectedResourceInfo(string method, WebPa // Include url parameters in query pool var uri = new Uri(url); -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE var urlParameters = HttpUtility.ParseQueryString(uri.Query); #else var urlParameters = uri.Query.ParseQueryString(); #endif -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE foreach (var parameter in urlParameters.AllKeys) #else foreach (var parameter in urlParameters.Keys) #endif { -#if PocketPC - switch (method.ToUpper()) -#else switch (method.ToUpperInvariant()) -#endif { case "POST": parameters.Add(new HttpPostParameter(parameter, urlParameters[parameter])); diff --git a/RestSharp/Authenticators/OAuth/WebPairCollection.cs b/RestSharp/Authenticators/OAuth/WebPairCollection.cs index f53ccc31e..dc0aa936c 100644 --- a/RestSharp/Authenticators/OAuth/WebPairCollection.cs +++ b/RestSharp/Authenticators/OAuth/WebPairCollection.cs @@ -30,7 +30,7 @@ public WebPairCollection(IEnumerable parameters) _parameters = new List(parameters); } -#if !WINDOWS_PHONE && !SILVERLIGHT && !PocketPC +#if !WINDOWS_PHONE && !SILVERLIGHT public WebPairCollection(NameValueCollection collection) : this() { diff --git a/RestSharp/Authenticators/OAuth/WebParameter.cs b/RestSharp/Authenticators/OAuth/WebParameter.cs index 253a6ab01..7c6093c4a 100644 --- a/RestSharp/Authenticators/OAuth/WebParameter.cs +++ b/RestSharp/Authenticators/OAuth/WebParameter.cs @@ -5,10 +5,10 @@ namespace RestSharp.Authenticators.OAuth { -#if !Smartphone && !PocketPC +#if !Smartphone [DebuggerDisplay("{Name}:{Value}")] #endif -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE [Serializable] #endif internal class WebParameter : WebPair diff --git a/RestSharp/Authenticators/OAuth/WebParameterCollection.cs b/RestSharp/Authenticators/OAuth/WebParameterCollection.cs index 504bc2886..8d29e0d90 100644 --- a/RestSharp/Authenticators/OAuth/WebParameterCollection.cs +++ b/RestSharp/Authenticators/OAuth/WebParameterCollection.cs @@ -8,7 +8,7 @@ internal class WebParameterCollection : WebPairCollection public WebParameterCollection(IEnumerable parameters) : base(parameters) { } -#if !WINDOWS_PHONE && !SILVERLIGHT && !PocketPC +#if !WINDOWS_PHONE && !SILVERLIGHT public WebParameterCollection(NameValueCollection collection) : base(collection) { } #endif diff --git a/RestSharp/Authenticators/OAuth1Authenticator.cs b/RestSharp/Authenticators/OAuth1Authenticator.cs index 0b31af8cd..54f5b788c 100644 --- a/RestSharp/Authenticators/OAuth1Authenticator.cs +++ b/RestSharp/Authenticators/OAuth1Authenticator.cs @@ -191,12 +191,7 @@ private void AddOAuthData(IRestClient client, IRestRequest request, OAuthWorkflo url = url.Substring(0, queryStringStart); OAuthWebQueryInfo oauth; -#if PocketPC - var method = request.Method.ToString().ToUpper(); -#else var method = request.Method.ToString().ToUpperInvariant(); -#endif - var parameters = new WebParameterCollection(); // include all GET and POST parameters before generating the signature diff --git a/RestSharp/Deserializers/JsonDeserializer.cs b/RestSharp/Deserializers/JsonDeserializer.cs index 3008a6b01..e4be3437d 100644 --- a/RestSharp/Deserializers/JsonDeserializer.cs +++ b/RestSharp/Deserializers/JsonDeserializer.cs @@ -228,11 +228,7 @@ private object ConvertValue(Type type, object value) return stringValue; } - if (type == typeof(DateTime) -#if !PocketPC - || type == typeof(DateTimeOffset) -#endif - ) + if (type == typeof(DateTime) || type == typeof(DateTimeOffset)) { DateTime dt; @@ -247,9 +243,6 @@ private object ConvertValue(Type type, object value) dt = stringValue.ParseJsonDate(Culture); } -#if PocketPC - return dt; -#else if (type == typeof(DateTime)) { return dt; @@ -259,7 +252,6 @@ private object ConvertValue(Type type, object value) { return (DateTimeOffset)dt; } -#endif } else if (type == typeof(Decimal)) { @@ -277,21 +269,13 @@ private object ConvertValue(Type type, object value) } else if (type == typeof(TimeSpan)) { -#if PocketPC - try - { - TimeSpan timeSpan = TimeSpan.Parse(stringValue); - - return timeSpan; - } - catch (Exception) { } -#else TimeSpan timeSpan; + if (TimeSpan.TryParse(stringValue, out timeSpan)) { return timeSpan; } -#endif + // This should handle ISO 8601 durations return XmlConvert.ToTimeSpan(stringValue); } diff --git a/RestSharp/Deserializers/XmlDeserializer.cs b/RestSharp/Deserializers/XmlDeserializer.cs index 63c067a3d..0d900c970 100644 --- a/RestSharp/Deserializers/XmlDeserializer.cs +++ b/RestSharp/Deserializers/XmlDeserializer.cs @@ -197,7 +197,6 @@ protected virtual object Map(object x, XElement root) prop.SetValue(x, value, null); } -#if !PocketPC else if (type == typeof(DateTimeOffset)) { var toConvert = value.ToString(); @@ -228,7 +227,6 @@ protected virtual object Map(object x, XElement root) } } } -#endif else if (type == typeof(Decimal)) { value = Decimal.Parse(value.ToString(), Culture); @@ -299,7 +297,7 @@ protected virtual object Map(object x, XElement root) private static bool TryGetFromString(string inputString, out object result, Type type) { -#if !SILVERLIGHT && !WINDOWS_PHONE && !PocketPC +#if !SILVERLIGHT && !WINDOWS_PHONE var converter = TypeDescriptor.GetConverter(type); if (converter.CanConvertFrom(typeof(string))) diff --git a/RestSharp/Extensions/MiscExtensions.cs b/RestSharp/Extensions/MiscExtensions.cs index d2d770dd0..2027f9e7e 100644 --- a/RestSharp/Extensions/MiscExtensions.cs +++ b/RestSharp/Extensions/MiscExtensions.cs @@ -24,7 +24,7 @@ namespace RestSharp.Extensions /// public static class MiscExtensions { -#if !WINDOWS_PHONE && !PocketPC +#if !WINDOWS_PHONE /// /// Save a byte array to a file /// diff --git a/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs b/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs index f9bcb915b..3862daa61 100644 --- a/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs +++ b/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs @@ -47,11 +47,7 @@ class HttpEncoder { static char[] hexChars = "0123456789abcdef".ToCharArray(); static object entitiesLock = new object(); -#if PocketPC - static Dictionary entities; -#else static SortedDictionary entities; -#endif #if NET_4_0 static Lazy defaultEncoder; static Lazy currentEncoderLazy; @@ -703,11 +699,7 @@ static void InitEntities() { // Build the hash table of HTML entity references. This list comes // from the HTML 4.01 W3C recommendation. -#if PocketPC - entities = new Dictionary(StringComparer.Ordinal); -#else entities = new SortedDictionary(StringComparer.Ordinal); -#endif entities.Add("nbsp", '\u00A0'); entities.Add("iexcl", '\u00A1'); entities.Add("cent", '\u00A2'); diff --git a/RestSharp/Extensions/ReflectionExtensions.cs b/RestSharp/Extensions/ReflectionExtensions.cs index 2c40af09c..3c2dea41c 100644 --- a/RestSharp/Extensions/ReflectionExtensions.cs +++ b/RestSharp/Extensions/ReflectionExtensions.cs @@ -73,7 +73,7 @@ public static bool IsSubclassOfRawGeneric(this Type toCheck, Type generic) public static object ChangeType(this object source, Type newType) { -#if FRAMEWORK && !PocketPC +#if FRAMEWORK return Convert.ChangeType(source, newType); #else return Convert.ChangeType(source, newType, null); @@ -99,7 +99,7 @@ public static object ChangeType(this object source, Type newType, CultureInfo cu /// public static object FindEnumValue(this Type type, string value, CultureInfo culture) { -#if FRAMEWORK && !PocketPC +#if FRAMEWORK var ret = Enum.GetValues(type) .Cast() .FirstOrDefault(v => v.ToString() diff --git a/RestSharp/Extensions/StringExtensions.cs b/RestSharp/Extensions/StringExtensions.cs index 64c33a0ce..513360a84 100644 --- a/RestSharp/Extensions/StringExtensions.cs +++ b/RestSharp/Extensions/StringExtensions.cs @@ -37,12 +37,10 @@ namespace RestSharp.Extensions { public static class StringExtensions { -#if !PocketPC public static string UrlDecode(this string input) { return HttpUtility.UrlDecode(input); } -#endif /// /// Uses Uri.EscapeDataString() based on recommendations on MSDN @@ -72,7 +70,6 @@ public static string UrlEncode(this string input) return sb.ToString(); } -#if !PocketPC public static string HtmlDecode(this string input) { return HttpUtility.HtmlDecode(input); @@ -82,7 +79,6 @@ public static string HtmlEncode(this string input) { return HttpUtility.HtmlEncode(input); } -#endif #if FRAMEWORK public static string HtmlAttributeEncode(this string input) @@ -182,22 +178,6 @@ private static DateTime ParseFormattedDate(string input, CultureInfo culture) "M/d/yyyy h:mm:ss tt" // default format for invariant culture }; -#if PocketPC - foreach (string format in formats) - { - try - { - return DateTime.ParseExact(input, format, culture); - } - catch (Exception) { } - } - - try - { - return DateTime.Parse(input, culture); - } - catch (Exception) { } -#else DateTime date; if (DateTime.TryParseExact(input, formats, culture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out date)) @@ -209,7 +189,6 @@ private static DateTime ParseFormattedDate(string input, CultureInfo culture) { return date; } -#endif return default(DateTime); } diff --git a/RestSharp/FileParameter.cs b/RestSharp/FileParameter.cs index f04001978..ef79e7c1c 100644 --- a/RestSharp/FileParameter.cs +++ b/RestSharp/FileParameter.cs @@ -18,7 +18,7 @@ public class FileParameter ///The public static FileParameter Create(string name, byte[] data, string filename, string contentType) { -#if FRAMEWORK && !PocketPC +#if FRAMEWORK var length = data.LongLength; #else var length = (long)data.Length; diff --git a/RestSharp/Http.Async.cs b/RestSharp/Http.Async.cs index 684cfda6a..674062f96 100644 --- a/RestSharp/Http.Async.cs +++ b/RestSharp/Http.Async.cs @@ -30,8 +30,8 @@ using System.Windows; #endif -#if (FRAMEWORK && !MONOTOUCH && !MONODROID && !PocketPC) -using System.Web; +#if (FRAMEWORK && !MONOTOUCH && !MONODROID) + #endif namespace RestSharp @@ -91,11 +91,7 @@ public HttpWebRequest MergeAsync(Action action) /// public HttpWebRequest AsPostAsync(Action action, string httpMethod) { -#if PocketPC - return PutPostInternalAsync(httpMethod.ToUpper(), action); -#else return PutPostInternalAsync(httpMethod.ToUpperInvariant(), action); -#endif } /// @@ -106,11 +102,7 @@ public HttpWebRequest AsPostAsync(Action action, string httpMethod /// public HttpWebRequest AsGetAsync(Action action, string httpMethod) { -#if PocketPC - return GetStyleMethodInternalAsync(httpMethod.ToUpper(), action); -#else return GetStyleMethodInternalAsync(httpMethod.ToUpperInvariant(), action); -#endif } private HttpWebRequest GetStyleMethodInternalAsync(string method, Action callback) @@ -187,7 +179,7 @@ private void WriteRequestBodyAsync(HttpWebRequest webRequest, Action RequestStreamCallback(result, callback), webRequest); @@ -269,7 +261,7 @@ private void RequestStreamCallback(IAsyncResult result, Action cal private void SetTimeout(IAsyncResult asyncResult, TimeOutState timeOutState) { -#if FRAMEWORK && !PocketPC +#if FRAMEWORK if (Timeout != 0) { ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle, @@ -402,9 +394,8 @@ private HttpWebRequest ConfigureAsyncWebRequest(string method, Uri url) WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp); #endif var webRequest = (HttpWebRequest)WebRequest.Create(url); -#if !PocketPC + webRequest.UseDefaultCredentials = UseDefaultCredentials; -#endif #if !WINDOWS_PHONE && !SILVERLIGHT webRequest.PreAuthenticate = PreAuthenticate; @@ -415,7 +406,7 @@ private HttpWebRequest ConfigureAsyncWebRequest(string method, Uri url) webRequest.Method = method; // make sure Content-Length header is always sent since default is -1 -#if !WINDOWS_PHONE && !PocketPC +#if !WINDOWS_PHONE // WP7 doesn't as of Beta doesn't support a way to set this value either directly // or indirectly if (!HasFiles && !AlwaysMultipartFormData) diff --git a/RestSharp/Http.Sync.cs b/RestSharp/Http.Sync.cs index a08d234db..3b74342b8 100644 --- a/RestSharp/Http.Sync.cs +++ b/RestSharp/Http.Sync.cs @@ -14,12 +14,12 @@ // limitations under the License. #endregion -#if FRAMEWORK || PocketPC +#if FRAMEWORK using System; using System.Net; -#if !MONOTOUCH && !MONODROID && !PocketPC -using System.Web; +#if !MONOTOUCH && !MONODROID + #endif using RestSharp.Extensions; @@ -102,11 +102,7 @@ public HttpResponse Merge() /// public HttpResponse AsGet(string httpMethod) { -#if PocketPC - return GetStyleMethodInternal(httpMethod.ToUpper()); -#else return GetStyleMethodInternal(httpMethod.ToUpperInvariant()); -#endif } /// @@ -116,11 +112,7 @@ public HttpResponse AsGet(string httpMethod) /// public HttpResponse AsPost(string httpMethod) { -#if PocketPC - return PostPutInternal(httpMethod.ToUpper()); -#else return PostPutInternal(httpMethod.ToUpperInvariant()); -#endif } private HttpResponse GetStyleMethodInternal(string method) @@ -225,7 +217,7 @@ private void WriteRequestBody(HttpWebRequest webRequest) { if (HasBody || HasFiles || AlwaysMultipartFormData) { -#if !WINDOWS_PHONE && !PocketPC +#if !WINDOWS_PHONE webRequest.ContentLength = CalculateContentLength(); #endif } @@ -252,11 +244,9 @@ private void WriteRequestBody(HttpWebRequest webRequest) private HttpWebRequest ConfigureWebRequest(string method, Uri url) { var webRequest = (HttpWebRequest)WebRequest.Create(url); -#if !PocketPC + webRequest.UseDefaultCredentials = UseDefaultCredentials; -#endif webRequest.PreAuthenticate = PreAuthenticate; - webRequest.ServicePoint.Expect100Continue = false; AppendHeaders(webRequest); diff --git a/RestSharp/Http.cs b/RestSharp/Http.cs index 2112802dd..cab95da9c 100644 --- a/RestSharp/Http.cs +++ b/RestSharp/Http.cs @@ -105,12 +105,10 @@ protected bool HasFiles /// public ICredentials Credentials { get; set; } -#if !PocketPC /// /// The System.Net.CookieContainer to be used for the request /// public CookieContainer CookieContainer { get; set; } -#endif /// /// The method to use to write the response instead of reading into RawBytes @@ -136,20 +134,19 @@ protected bool HasFiles public X509CertificateCollection ClientCertificates { get; set; } #endif -#if FRAMEWORK || PocketPC +#if FRAMEWORK /// /// Maximum number of automatic redirects to follow if FollowRedirects is true /// public int? MaxRedirects { get; set; } #endif -#if !PocketPC /// /// Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) /// will be sent along to the server. /// public bool UseDefaultCredentials { get; set; } -#endif + private Encoding encoding = Encoding.UTF8; public Encoding Encoding { get { return this.encoding; } set { this.encoding = value; } } @@ -194,7 +191,7 @@ protected bool HasFiles /// public bool PreAuthenticate { get; set; } -#if FRAMEWORK || PocketPC +#if FRAMEWORK /// /// Proxy info to be sent with request /// @@ -306,12 +303,10 @@ private void AppendHeaders(HttpWebRequest webRequest) private void AppendCookies(HttpWebRequest webRequest) { -#if !PocketPC webRequest.CookieContainer = this.CookieContainer ?? new CookieContainer(); -#endif + foreach (var httpCookie in Cookies) { -#if !PocketPC #if FRAMEWORK var cookie = new Cookie { @@ -331,7 +326,6 @@ private void AppendCookies(HttpWebRequest webRequest) var uri = webRequest.RequestUri; webRequest.CookieContainer.Add(new Uri(string.Format("{0}://{1}", uri.Scheme, uri.Host)), cookie); -#endif #endif } } @@ -424,7 +418,6 @@ private void ExtractResponseData(HttpResponse response, HttpWebResponse webRespo response.ResponseUri = webResponse.ResponseUri; response.ResponseStatus = ResponseStatus.Completed; -#if !PocketPC if (webResponse.Cookies != null) { foreach (Cookie cookie in webResponse.Cookies) @@ -448,7 +441,7 @@ private void ExtractResponseData(HttpResponse response, HttpWebResponse webRespo }); } } -#endif + foreach (var headerName in webResponse.Headers.AllKeys) { var headerValue = webResponse.Headers[headerName]; diff --git a/RestSharp/IHttp.cs b/RestSharp/IHttp.cs index fd249122c..d6b24faf9 100644 --- a/RestSharp/IHttp.cs +++ b/RestSharp/IHttp.cs @@ -31,9 +31,7 @@ public interface IHttp { Action ResponseWriter { get; set; } -#if !PocketPC CookieContainer CookieContainer { get; set; } -#endif ICredentials Credentials { get; set; } @@ -58,9 +56,7 @@ public interface IHttp int? MaxRedirects { get; set; } #endif -#if !PocketPC bool UseDefaultCredentials { get; set; } -#endif Encoding Encoding { get; set; } @@ -109,7 +105,7 @@ public interface IHttp HttpWebRequest AsGetAsync(Action action, string httpMethod); -#if FRAMEWORK || PocketPC +#if FRAMEWORK HttpResponse Delete(); HttpResponse Get(); diff --git a/RestSharp/IRestClient.cs b/RestSharp/IRestClient.cs index 8fab9bbc6..29494e1f9 100644 --- a/RestSharp/IRestClient.cs +++ b/RestSharp/IRestClient.cs @@ -33,9 +33,8 @@ namespace RestSharp { public interface IRestClient { -#if !PocketPC CookieContainer CookieContainer { get; set; } -#endif + int? MaxRedirects { get; set; } string UserAgent { get; set; } @@ -60,7 +59,7 @@ public interface IRestClient RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action, RestRequestAsyncHandle> callback); -#if FRAMEWORK || PocketPC +#if FRAMEWORK IRestResponse Execute(IRestRequest request); IRestResponse Execute(IRestRequest request) where T : new(); diff --git a/RestSharp/RestClient.Async.cs b/RestSharp/RestClient.Async.cs index afdf7456f..69bdaf249 100644 --- a/RestSharp/RestClient.Async.cs +++ b/RestSharp/RestClient.Async.cs @@ -35,11 +35,7 @@ public partial class RestClient public virtual RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action callback) { -#if PocketPC - string method = request.Method.ToString(); -#else string method = Enum.GetName(typeof(Method), request.Method); -#endif switch (request.Method) { @@ -93,7 +89,6 @@ private RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action response_cb = r => this.ProcessResponse(request, r, asyncHandle, callback); -#if !PocketPC if (this.UseSynchronizationContext && SynchronizationContext.Current != null) { var ctx = SynchronizationContext.Current; @@ -101,7 +96,6 @@ private RestRequestAsyncHandle ExecuteAsync(IRestRequest request, response_cb = resp => ctx.Post(s => cb(resp), null); } -#endif asyncHandle.WebRequest = getWebRequest(http, response_cb, httpMethod); return asyncHandle; diff --git a/RestSharp/RestClient.Sync.cs b/RestSharp/RestClient.Sync.cs index 6c1d756aa..7abc8c2a9 100644 --- a/RestSharp/RestClient.Sync.cs +++ b/RestSharp/RestClient.Sync.cs @@ -1,4 +1,4 @@ -#if FRAMEWORK || PocketPC +#if FRAMEWORK using System; namespace RestSharp @@ -23,11 +23,8 @@ public byte[] DownloadData(IRestRequest request) /// RestResponse public virtual IRestResponse Execute(IRestRequest request) { -#if PocketPC - var method = request.Method.ToString(); -#else var method = Enum.GetName(typeof (Method), request.Method); -#endif + switch (request.Method) { case Method.POST: diff --git a/RestSharp/RestClient.cs b/RestSharp/RestClient.cs index 8376d36d9..265db3e11 100644 --- a/RestSharp/RestClient.cs +++ b/RestSharp/RestClient.cs @@ -37,13 +37,9 @@ namespace RestSharp public partial class RestClient : IRestClient { // silverlight friendly way to get current version -#if PocketPC - static readonly Version version = Assembly.GetExecutingAssembly().GetName().Version; -#else private static readonly Version version = new AssemblyName(Assembly.GetExecutingAssembly().FullName).Version; -#endif - public IHttpFactory HttpFactory = new SimpleFactory(); + public IHttpFactory HttpFactory = new SimpleFactory(); /// /// Maximum number of redirects to follow if FollowRedirects is true @@ -74,12 +70,10 @@ public partial class RestClient : IRestClient /// public bool FollowRedirects { get; set; } -#if !PocketPC /// /// The CookieContainer used for requests made by this client instance /// public CookieContainer CookieContainer { get; set; } -#endif /// /// UserAgent to use for requests made by this client instance @@ -347,11 +341,7 @@ public Uri BuildUri(IRestRequest request) private static string EncodeParameters(IEnumerable parameters) { -#if !PocketPC return string.Join("&", parameters.Select(EncodeParameter).ToArray()); -#else - return string.Join("&", parameters.Select(x => EncodeParameter(x)).ToArray()); -#endif } private static string EncodeParameter(Parameter parameter) @@ -365,13 +355,10 @@ private void ConfigureHttp(IRestRequest request, IHttp http) { http.Encoding = this.Encoding; http.AlwaysMultipartFormData = request.AlwaysMultipartFormData; -#if !PocketPC http.UseDefaultCredentials = request.UseDefaultCredentials; -#endif http.ResponseWriter = request.ResponseWriter; -#if !PocketPC http.CookieContainer = CookieContainer; -#endif + // move RestClient.DefaultParameters into Request.Parameters foreach (var p in DefaultParameters) { @@ -384,11 +371,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) } // Add Accept header based on registered deserializers if none has been set by the caller. -#if PocketPC - if (request.Parameters.All(p2 => p2.Name.ToLower() != "accept")) -#else if (request.Parameters.All(p2 => p2.Name.ToLowerInvariant() != "accept")) -#endif { var accepts = string.Join(", ", AcceptTypes.ToArray()); request.AddParameter("Accept", accepts, ParameterType.HttpHeader); diff --git a/RestSharp/RestRequest.cs b/RestSharp/RestRequest.cs index 3172bb0b8..03ae59f1b 100644 --- a/RestSharp/RestRequest.cs +++ b/RestSharp/RestRequest.cs @@ -122,11 +122,7 @@ public RestRequest(Uri resource, Method method) /// Full path to file to upload /// The MIME type of the file to upload /// This request -#if PocketPC - public IRestRequest AddFile(string name, string path, string contentType) -#else public IRestRequest AddFile(string name, string path, string contentType = null) -#endif { FileInfo f = new FileInfo(path); long fileLength = f.Length; @@ -155,11 +151,7 @@ public IRestRequest AddFile(string name, string path, string contentType = null) /// The file name to use for the uploaded file /// The MIME type of the file to upload /// This request -#if PocketPC - public IRestRequest AddFile(string name, byte[] bytes, string fileName, string contentType) -#else public IRestRequest AddFile(string name, byte[] bytes, string fileName, string contentType = null) -#endif { return this.AddFile(FileParameter.Create(name, bytes, fileName, contentType)); } @@ -172,11 +164,7 @@ public IRestRequest AddFile(string name, byte[] bytes, string fileName, string c /// The file name to use for the uploaded file /// The MIME type of the file to upload /// This request -#if PocketPC - public IRestRequest AddFile(string name, Action writer, string fileName, string contentType) -#else public IRestRequest AddFile(string name, Action writer, string fileName, string contentType = null) -#endif { return AddFile(new FileParameter { @@ -201,15 +189,8 @@ private IRestRequest AddFile(FileParameter file) /// The file name to use for the uploaded file /// Specific content type. Es: application/x-gzip /// -#if PocketPC - public IRestRequest AddFileBytes(string name, byte[] bytes, string filename, string contentType) - { - if (string.IsNullOrEmpty(contentType)) - contentType = "application/x-gzip"; -#else public IRestRequest AddFileBytes(string name, byte[] bytes, string filename, string contentType = "application/x-gzip") { -#endif long length = bytes.Length; return AddFile(new FileParameter diff --git a/RestSharp/RestSharp.Compact.csproj b/RestSharp/RestSharp.Compact.csproj deleted file mode 100644 index 7dcba3d69..000000000 --- a/RestSharp/RestSharp.Compact.csproj +++ /dev/null @@ -1,160 +0,0 @@ - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {A29E330B-F854-4287-BEB2-C4CBE9D9C637} - Library - Properties - RestSharp.Compact - RestSharp.Compact - {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - PocketPC - 4118C335-430C-497f-BE48-11C3316B135E - 5.1 - RestSharp.Compact - v3.5 - Windows Mobile 5.0 Pocket PC SDK - - - - - true - full - false - bin_compact\Debug\ - TRACE;DEBUG;PocketPC SIMPLE_JSON_NO_LINQ_EXPRESSION - true - true - prompt - 512 - 4 - Off - - - pdbonly - true - bin_compact\Release\ - TRACE;PocketPC SIMPLE_JSON_NO_LINQ_EXPRESSION FRAMEWORK - true - true - prompt - 512 - 4 - Off - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - T4Helper.log - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/RestSharp/SharedAssemblyInfo.cs b/RestSharp/SharedAssemblyInfo.cs index 43d7c8ee1..47d4c5a35 100644 --- a/RestSharp/SharedAssemblyInfo.cs +++ b/RestSharp/SharedAssemblyInfo.cs @@ -24,7 +24,6 @@ // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion(SharedAssemblyInfo.Version + ".0")] -#if !PocketPC #if SIGNED [assembly: AssemblyInformationalVersion(SharedAssemblyInfo.FileVersion)] [assembly: AssemblyFileVersion(SharedAssemblyInfo.FileVersion + ".0")] @@ -32,7 +31,6 @@ [assembly: AssemblyInformationalVersion(SharedAssemblyInfo.Version)] [assembly: AssemblyFileVersion(SharedAssemblyInfo.Version + ".0")] #endif -#endif class SharedAssemblyInfo { diff --git a/RestSharp/SimpleJson.cs b/RestSharp/SimpleJson.cs index 12f7d619c..674ae2ee6 100644 --- a/RestSharp/SimpleJson.cs +++ b/RestSharp/SimpleJson.cs @@ -167,7 +167,8 @@ internal static object GetAtIndex(IDictionary obj, int index) throw new ArgumentOutOfRangeException("index"); int i = 0; foreach (KeyValuePair o in obj) - if (i++ == index) return o.Value; + if (i++ == index) + return o.Value; return null; } @@ -278,7 +279,8 @@ public bool Contains(KeyValuePair item) /// Index of the array. public void CopyTo(KeyValuePair[] array, int arrayIndex) { - if (array == null) throw new ArgumentNullException("array"); + if (array == null) + throw new ArgumentNullException("array"); int num = Count; foreach (KeyValuePair kvp in this) { @@ -526,7 +528,7 @@ static class SimpleJson static SimpleJson() { EscapeTable = new char[93]; - EscapeTable['"'] = '"'; + EscapeTable['"'] = '"'; EscapeTable['\\'] = '\\'; EscapeTable['\b'] = 'b'; EscapeTable['\f'] = 'f'; @@ -560,7 +562,7 @@ public static object DeserializeObject(string json) /// /// Returns true if successfull otherwise false. /// - [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification="Need to support .NET 2")] + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] public static bool TryDeserializeObject(string json, out object obj) { bool success = true; @@ -591,12 +593,12 @@ public static object DeserializeObject(string json, Type type) public static T DeserializeObject(string json, IJsonSerializerStrategy jsonSerializerStrategy) { - return (T)DeserializeObject(json, typeof(T), jsonSerializerStrategy); + return (T) DeserializeObject(json, typeof(T), jsonSerializerStrategy); } public static T DeserializeObject(string json) { - return (T)DeserializeObject(json, typeof(T), null); + return (T) DeserializeObject(json, typeof(T), null); } /// @@ -854,8 +856,8 @@ static string ParseString(char[] json, ref int index, ref bool success) { if (0xDC00 <= lowCodePoint && lowCodePoint <= 0xDFFF) // if low surrogate { - s.Append((char)codePoint); - s.Append((char)lowCodePoint); + s.Append((char) codePoint); + s.Append((char) lowCodePoint); index += 6; // skip 6 chars continue; } @@ -864,7 +866,7 @@ static string ParseString(char[] json, ref int index, ref bool success) success = false; // invalid surrogate pair return ""; } - s.Append(ConvertFromUtf32((int)codePoint)); + s.Append(ConvertFromUtf32((int) codePoint)); // skip 4 chars index += 4; } @@ -891,9 +893,9 @@ private static string ConvertFromUtf32(int utf32) if (0xD800 <= utf32 && utf32 <= 0xDFFF) throw new ArgumentOutOfRangeException("utf32", "The argument must not be in surrogate pair range."); if (utf32 < 0x10000) - return new string((char)utf32, 1); + return new string((char) utf32, 1); utf32 -= 0x10000; - return new string(new char[] { (char)((utf32 >> 10) + 0xD800), (char)(utf32 % 0x0400 + 0xDC00) }); + return new string(new char[] { (char) ((utf32 >> 10) + 0xD800), (char) (utf32 % 0x0400 + 0xDC00) }); } static object ParseNumber(char[] json, ref int index, ref bool success) @@ -923,14 +925,16 @@ static int GetLastIndexOfNumber(char[] json, int index) { int lastIndex; for (lastIndex = index; lastIndex < json.Length; lastIndex++) - if ("0123456789+-.eE".IndexOf(json[lastIndex]) == -1) break; + if ("0123456789+-.eE".IndexOf(json[lastIndex]) == -1) + break; return lastIndex - 1; } static void EatWhitespace(char[] json, ref int index) { for (; index < json.Length; index++) - if (" \t\n\r\b\f".IndexOf(json[index]) == -1) break; + if (" \t\n\r\b\f".IndexOf(json[index]) == -1) + break; } static int LookAhead(char[] json, int index) @@ -1036,7 +1040,7 @@ static bool SerializeValue(IJsonSerializerStrategy jsonSerializerStrategy, objec else if (IsNumeric(value)) success = SerializeNumber(value, builder); else if (value is bool) - builder.Append((bool)value ? "true" : "false"); + builder.Append((bool) value ? "true" : "false"); else if (value == null) builder.Append("null"); else @@ -1068,7 +1072,8 @@ static bool SerializeObject(IJsonSerializerStrategy jsonSerializerStrategy, IEnu if (stringKey != null) SerializeString(stringKey, builder); else - if (!SerializeValue(jsonSerializerStrategy, value, builder)) return false; + if (!SerializeValue(jsonSerializerStrategy, value, builder)) + return false; builder.Append(":"); if (!SerializeValue(jsonSerializerStrategy, value, builder)) return false; @@ -1146,17 +1151,17 @@ static bool SerializeString(string aString, StringBuilder builder) static bool SerializeNumber(object number, StringBuilder builder) { if (number is long) - builder.Append(((long)number).ToString(CultureInfo.InvariantCulture)); + builder.Append(((long) number).ToString(CultureInfo.InvariantCulture)); else if (number is ulong) - builder.Append(((ulong)number).ToString(CultureInfo.InvariantCulture)); + builder.Append(((ulong) number).ToString(CultureInfo.InvariantCulture)); else if (number is int) - builder.Append(((int)number).ToString(CultureInfo.InvariantCulture)); + builder.Append(((int) number).ToString(CultureInfo.InvariantCulture)); else if (number is uint) - builder.Append(((uint)number).ToString(CultureInfo.InvariantCulture)); + builder.Append(((uint) number).ToString(CultureInfo.InvariantCulture)); else if (number is decimal) - builder.Append(((decimal)number).ToString(CultureInfo.InvariantCulture)); + builder.Append(((decimal) number).ToString(CultureInfo.InvariantCulture)); else if (number is float) - builder.Append(((float)number).ToString(CultureInfo.InvariantCulture)); + builder.Append(((float) number).ToString(CultureInfo.InvariantCulture)); else builder.Append(Convert.ToDouble(number, CultureInfo.InvariantCulture).ToString("r", CultureInfo.InvariantCulture)); return true; @@ -1168,17 +1173,28 @@ static bool SerializeNumber(object number, StringBuilder builder) /// static bool IsNumeric(object value) { - if (value is sbyte) return true; - if (value is byte) return true; - if (value is short) return true; - if (value is ushort) return true; - if (value is int) return true; - if (value is uint) return true; - if (value is long) return true; - if (value is ulong) return true; - if (value is float) return true; - if (value is double) return true; - if (value is decimal) return true; + if (value is sbyte) + return true; + if (value is byte) + return true; + if (value is short) + return true; + if (value is ushort) + return true; + if (value is int) + return true; + if (value is uint) + return true; + if (value is long) + return true; + if (value is ulong) + return true; + if (value is float) + return true; + if (value is double) + return true; + if (value is decimal) + return true; return false; } @@ -1226,7 +1242,7 @@ public static DataContractJsonSerializerStrategy DataContractJsonSerializerStrat #endif } - + [GeneratedCode("simple-json", "1.0.0")] #if SIMPLE_JSON_INTERNAL internal @@ -1235,7 +1251,7 @@ public static DataContractJsonSerializerStrategy DataContractJsonSerializerStrat #endif interface IJsonSerializerStrategy { - [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification="Need to support .NET 2")] + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] bool TrySerializeNonPrimitiveObject(object input, out object output); object DeserializeObject(object value, Type type); } @@ -1331,15 +1347,16 @@ public virtual bool TrySerializeNonPrimitiveObject(object input, out object outp [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] public virtual object DeserializeObject(object value, Type type) { - if (type == null) throw new ArgumentNullException("type"); + if (type == null) + throw new ArgumentNullException("type"); string str = value as string; - if (type == typeof (Guid) && string.IsNullOrEmpty(str)) + if (type == typeof(Guid) && string.IsNullOrEmpty(str)) return default(Guid); if (value == null) return null; - + object obj = null; if (str != null) @@ -1348,27 +1365,27 @@ public virtual object DeserializeObject(object value, Type type) { if (type == typeof(DateTime) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTime))) return DateTime.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); -#if !PocketPC + if (type == typeof(DateTimeOffset) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTimeOffset))) return DateTimeOffset.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); -#endif + if (type == typeof(Guid) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid))) return new Guid(str); if (type == typeof(Uri)) { - bool isValid = Uri.IsWellFormedUriString(str, UriKind.RelativeOrAbsolute); + bool isValid = Uri.IsWellFormedUriString(str, UriKind.RelativeOrAbsolute); Uri result; if (isValid && Uri.TryCreate(str, UriKind.RelativeOrAbsolute, out result)) return result; - return null; + return null; } - - if (type == typeof(string)) - return str; - return Convert.ChangeType(str, type, CultureInfo.InvariantCulture); + if (type == typeof(string)) + return str; + + return Convert.ChangeType(str, type, CultureInfo.InvariantCulture); } else { @@ -1385,7 +1402,7 @@ public virtual object DeserializeObject(object value, Type type) } else if (value is bool) return value; - + bool valueIsLong = value is long; bool valueIsDouble = value is double; if ((valueIsLong && type == typeof(long)) || (valueIsDouble && type == typeof(double))) @@ -1412,7 +1429,7 @@ public virtual object DeserializeObject(object value, Type type) Type genericType = typeof(Dictionary<,>).MakeGenericType(keyType, valueType); - IDictionary dict = (IDictionary)ConstructorCache[genericType](); + IDictionary dict = (IDictionary) ConstructorCache[genericType](); foreach (KeyValuePair kvp in jsonObject) dict.Add(kvp.Key, DeserializeObject(kvp.Value, valueType)); @@ -1448,7 +1465,7 @@ public virtual object DeserializeObject(object value, Type type) if (type.IsArray) { - list = (IList)ConstructorCache[type](jsonObject.Count); + list = (IList) ConstructorCache[type](jsonObject.Count); int i = 0; foreach (object o in jsonObject) list[i++] = DeserializeObject(o, type.GetElementType()); @@ -1456,7 +1473,7 @@ public virtual object DeserializeObject(object value, Type type) else if (ReflectionUtils.IsTypeGenericeCollectionInterface(type) || ReflectionUtils.IsAssignableFrom(typeof(IList), type)) { Type innerType = ReflectionUtils.GetGenericListElementType(type); - list = (IList)(ConstructorCache[type] ?? ConstructorCache[typeof(List<>).MakeGenericType(innerType)])(jsonObject.Count); + list = (IList) (ConstructorCache[type] ?? ConstructorCache[typeof(List<>).MakeGenericType(innerType)])(jsonObject.Count); foreach (object o in jsonObject) list.Add(DeserializeObject(o, innerType)); } @@ -1475,23 +1492,23 @@ protected virtual object SerializeEnum(Enum p) return Convert.ToDouble(p, CultureInfo.InvariantCulture); } - [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification="Need to support .NET 2")] + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] protected virtual bool TrySerializeKnownTypes(object input, out object output) { bool returnValue = true; + if (input is DateTime) - output = ((DateTime)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); -#if !PocketPC + output = ((DateTime) input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); else if (input is DateTimeOffset) - output = ((DateTimeOffset)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); -#endif + output = ((DateTimeOffset) input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); else if (input is Guid) - output = ((Guid)input).ToString("D"); + output = ((Guid) input).ToString("D"); else if (input is Uri) output = input.ToString(); else { Enum inputEnum = input as Enum; + if (inputEnum != null) output = SerializeEnum(inputEnum); else @@ -1500,12 +1517,14 @@ protected virtual bool TrySerializeKnownTypes(object input, out object output) output = null; } } + return returnValue; } - [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification="Need to support .NET 2")] + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] protected virtual bool TrySerializeUnknownTypes(object input, out object output) { - if (input == null) throw new ArgumentNullException("input"); + if (input == null) + throw new ArgumentNullException("input"); output = null; Type type = input.GetType(); if (type.FullName == null) @@ -1604,7 +1623,7 @@ private static bool CanAdd(MemberInfo info, out string jsonKey) namespace Reflection { // This class is meant to be copied into other libraries. So we want to exclude it from Code Analysis rules - // that might be in place in the target project. + // that might be in place in the target project. [GeneratedCode("reflection-utils", "1.0.0")] #if SIMPLE_JSON_REFLECTION_UTILS_PUBLIC public @@ -1657,7 +1676,7 @@ public static Type GetGenericListElementType(Type type) foreach (Type implementedInterface in interfaces) { if (IsTypeGeneric(implementedInterface) && - implementedInterface.GetGenericTypeDefinition() == typeof (IList<>)) + implementedInterface.GetGenericTypeDefinition() == typeof(IList<>)) { return GetGenericTypeArguments(implementedInterface)[0]; } @@ -1707,7 +1726,7 @@ public static bool IsTypeGenericeCollectionInterface(Type type) || genericDefinition == typeof(IReadOnlyCollection<>) || genericDefinition == typeof(IReadOnlyList<>) #endif - ); +); } public static bool IsAssignableFrom(Type type1, Type type2) From 2a239b0008ae585e8444cf1291bef8d9b23deed5 Mon Sep 17 00:00:00 2001 From: Michael Hallett Date: Sat, 15 Aug 2015 18:44:01 -0700 Subject: [PATCH 4/9] cleaned up code; removed duplicate code; cleaned up references; --- .nuget/RestSharp.Build.dll | Bin 7680 -> 7680 bytes .nuget/Signed/RestSharp.Build.dll | Bin 8192 -> 8192 bytes RestSharp.Build/NuSpecUpdateTask.cs | 42 +- .../AsyncRequestBodyTests.cs | 1 - RestSharp.IntegrationTests/AsyncTests.cs | 10 +- .../AuthenticationTests.cs | 4 +- .../CompressionTests.cs | 34 +- RestSharp.IntegrationTests/FileTests.cs | 2 +- .../Helpers/Handlers.cs | 26 +- .../MultipartFormDataTests.cs | 31 +- .../NonProtocolExceptionHandlingTests.cs | 13 +- .../RequestBodyTests.cs | 1 + .../RequestHeadTests.cs | 13 +- .../RestSharp.IntegrationTests.Signed.csproj | 2 +- RestSharp.IntegrationTests/StatusCodeTests.cs | 6 +- RestSharp.IntegrationTests/oAuth1Tests.cs | 32 +- .../Extensions/RestClientExtensions.cs | 17 - RestSharp.Net4/RestSharp.Net4.Signed.csproj | 1 - RestSharp.Net4/RestSharp.Net4.csproj | 1 - .../Extensions/RestClientExtensions.cs | 17 - RestSharp.Net45/RestSharp.Net45.Signed.csproj | 1 - RestSharp.Net45/RestSharp.Net45.csproj | 1 - .../Extensions/RestClientExtensions.cs | 17 - .../RestSharp.Net451.Signed.csproj | 1 - RestSharp.Net451/RestSharp.Net451.csproj | 1 - .../Extensions/RestClientExtensions.cs | 17 - .../RestSharp.Net452.Signed.csproj | 1 - RestSharp.Net452/RestSharp.Net452.csproj | 1 - RestSharp.Net46/RestSharp.Net46.Signed.csproj | 3 - RestSharp.Net46/RestSharp.Net46.csproj | 3 - RestSharp.Tests/AddRangeTests.cs | 4 +- RestSharp.Tests/CultureChange.cs | 4 - .../InterfaceImplementationTests.cs | 12 +- RestSharp.Tests/JsonTests.cs | 445 +++++---- RestSharp.Tests/JwtAuthTests.cs | 35 +- RestSharp.Tests/NamespacedXmlTests.cs | 88 +- RestSharp.Tests/NuSpecUpdateTask.cs | 7 +- RestSharp.Tests/OAuthTests.cs | 6 +- RestSharp.Tests/RestRequestTests.cs | 13 +- .../SampleClasses/EmployeeTracker.cs | 8 +- RestSharp.Tests/SampleClasses/EnumTest.cs | 2 +- RestSharp.Tests/SampleClasses/Goodreads.cs | 4 + RestSharp.Tests/SampleClasses/misc.cs | 10 +- RestSharp.Tests/SampleClasses/nullables.cs | 2 +- RestSharp.Tests/SerializerTests.cs | 290 +++--- RestSharp.Tests/UrlBuilderTests.cs | 150 +-- .../XmlAttributeDeserializerTests.cs | 369 ++++---- RestSharp.Tests/XmlDeserializerTests.cs | 367 +++---- .../Authenticators/HttpBasicAuthenticator.cs | 9 +- RestSharp/Authenticators/IAuthenticator.cs | 2 +- RestSharp/Authenticators/JwtAuthenticator.cs | 7 +- RestSharp/Authenticators/NtlmAuthenticator.cs | 10 +- .../OAuth/Extensions/CollectionExtensions.cs | 19 +- .../OAuth/Extensions/OAuthExtensions.cs | 4 + .../OAuth/Extensions/StringExtensions.cs | 32 +- .../OAuth/Extensions/TimeExtensions.cs | 3 +- .../Authenticators/OAuth/HttpPostParameter.cs | 28 +- RestSharp/Authenticators/OAuth/OAuthTools.cs | 86 +- .../Authenticators/OAuth/OAuthWorkflow.cs | 170 ++-- .../Authenticators/OAuth/WebPairCollection.cs | 79 +- .../Authenticators/OAuth/WebParameter.cs | 6 - .../OAuth/WebParameterCollection.cs | 4 +- .../Authenticators/OAuth1Authenticator.cs | 198 ++-- .../Authenticators/OAuth2Authenticator.cs | 14 +- .../Authenticators/SimpleAuthenticator.cs | 22 +- RestSharp/Compression/ZLib/Crc32.cs | 250 +++-- RestSharp/Compression/ZLib/GZipStream.cs | 127 +-- RestSharp/Compression/ZLib/InfTree.cs | 105 +- RestSharp/Compression/ZLib/Inflate.cs | 896 +++++++++++------- RestSharp/Compression/ZLib/ZLib.cs | 23 +- RestSharp/Compression/ZLib/ZLibCodec.cs | 17 +- RestSharp/Compression/ZLib/ZLibConstants.cs | 10 +- RestSharp/Compression/ZLib/ZLibStream.cs | 469 ++++----- .../Deserializers/DeserializeAsAttribute.cs | 2 +- .../Deserializers/DotNetXmlDeserializer.cs | 1 + RestSharp/Deserializers/IDeserializer.cs | 3 + RestSharp/Deserializers/JsonDeserializer.cs | 14 +- RestSharp/Deserializers/XmlDeserializer.cs | 88 +- RestSharp/Enum.cs | 4 +- RestSharp/Extensions/MonoHttp/Helpers.cs | 3 +- RestSharp/Extensions/MonoHttp/HtmlEncoder.cs | 808 ++++++++-------- RestSharp/Extensions/MonoHttp/HttpUtility.cs | 10 +- RestSharp/Extensions/ReflectionExtensions.cs | 2 +- RestSharp/Extensions/StringExtensions.cs | 75 +- RestSharp/FileParameter.cs | 16 +- RestSharp/Http.Async.cs | 25 +- RestSharp/Http.Sync.cs | 9 +- RestSharp/Http.cs | 79 +- RestSharp/HttpResponse.cs | 14 +- RestSharp/IHttpFactory.cs | 3 +- RestSharp/IRestClient.cs | 2 + RestSharp/RestClient.Async.cs | 65 +- RestSharp/RestClient.Sync.cs | 3 + RestSharp/RestClient.cs | 19 +- RestSharp/RestClientExtensions.cs | 72 +- RestSharp/RestRequest.cs | 34 +- RestSharp/RestResponse.cs | 57 +- RestSharp/Serializers/SerializeAsAttribute.cs | 2 +- RestSharp/Serializers/XmlSerializer.cs | 3 +- 99 files changed, 3208 insertions(+), 2910 deletions(-) delete mode 100644 RestSharp.Net4/Extensions/RestClientExtensions.cs delete mode 100644 RestSharp.Net45/Extensions/RestClientExtensions.cs delete mode 100644 RestSharp.Net451/Extensions/RestClientExtensions.cs delete mode 100644 RestSharp.Net452/Extensions/RestClientExtensions.cs diff --git a/.nuget/RestSharp.Build.dll b/.nuget/RestSharp.Build.dll index 7aa20747bff343f5c470afb98f5ab86117ee1c8a..ed9b656c54ca3e10b7ca29273469a78ff337ae85 100644 GIT binary patch delta 2155 zcmai$du$X{6vn@M=ds&uJ9cO3%f7a>g)J?mkrG5Gf<>`GYoR;?8VcPs71}L*Xbg|t zq85n3unr`ksE{bne@ZqINq8C}Vj`3TjVLB4B#0(jH3Sr5{N}QPBqUC#@{FqXX1P3S+N>m26#;Y9@XN-fwaXy8vUoo0{Kp{taKKLk>b45 zC!%7&5i(#be+UrHfz0tvqr6hIg}D;&LxxfSGh_q4tiMHi%4j_+tzwnaq}2{zDF8hb zaAloa_@z;|AfmQ z93Fo!Y~0OuTJ)O7IF^AG9FtSx?6pV%hw^pBS)fGZ^eH0G&&! zh>W;Tm#AhvXU|ziGATty0$!h*qfa`WMu8Qm*6=u!xR*?F-ZPfe9%n(x8laM~!~B&r z^>np$w01KKKk^0-uq~O>gstg7hHFosQ$LOE9{MMpT63f*bHe7r=sNMTu<#b?!-t}u z%eoi15d zW+LN`m(wVM@F4%LS4yv1d7omg7zHoRE3XePh-i@RW}aRkj;*4K-Y_0w*E=f4BNa7C z?+bcqn4R>#7PUynrlfaS)bVb(2m3M)_5X3F%Dl!*iQl7av}D;0ReV1uppk2vs#vc$ zQ*nV}vtpa#3dL8*S?E*t2F1AIHgX>JlF#D+8N?yQXo_l1;I_UDr;%%P^06s1ddZ2# zN}NNTk&O$OYph2x78-9N7u$@@_zj;K@8bl{7z0$lGV&Pz);NMc@e}h;;HGhsg!wt? zF$ZxCmg&Yl=9jd~&F{D*_gu`3;t>kxFof&K6)m)j#bz^Ilw+5f#aX_JC8)wmK5tb# z8R!&T@PjQFh zPQ~MjCloI!ey<4O)&>=)C@xlvDYhbpgZKeL6bZ>Q!PkjwAonXK6pzUU_xo~6IfJsn z8Jk)!e9r3BXUDzlR`6u-)s?*X&bjMUK*({}k5TxUzajo^afn<;qv4bP4&3wNNtuD81<(mu6^Z^0$KJ>kZ#$V+W4;jYB)^h%Mq zXswY>*kA6Q|K##;d$^+~vC&^DoB?|vqbE_gWAgGV(+`&pj<~s|f3?#Y7*hpJ*y*<4 zG9WBFQ!&MpAw(hUOlewL2$micLK=jBrgJJVyspjT(Ji}8N@m;bZYAq|L6K>%5O%Na zPgUivR|wt5kP(!YWtkpnx7)pDkP)YH*uzh}?slB-_2_o5RiH^Xwb(_u5riGvV9<A)njc!q0sRKQ6PHrZt@}{$$>j zLl^5~nGs{;>AfMDXwLKqdk_CA{CgdB?O?n(OAgc|-p*O%B#1{Q19%c(vyr D##nfJ delta 2148 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 Bx7Yvx diff --git a/RestSharp.Build/NuSpecUpdateTask.cs b/RestSharp.Build/NuSpecUpdateTask.cs index 49fe0e0aa..97fe917a6 100644 --- a/RestSharp.Build/NuSpecUpdateTask.cs +++ b/RestSharp.Build/NuSpecUpdateTask.cs @@ -9,7 +9,7 @@ namespace RestSharp.Build { public class NuSpecUpdateTask : Task { - private Assembly _assembly; + private Assembly assembly; public string Id { get; private set; } @@ -27,7 +27,7 @@ public NuSpecUpdateTask() : this(null) { } public NuSpecUpdateTask(Assembly assembly) { - this._assembly = assembly; + this.assembly = assembly; } public override bool Execute() @@ -36,18 +36,18 @@ public override bool Execute() return false; var path = Path.GetFullPath(this.SourceAssemblyFile); - this._assembly = this._assembly ?? Assembly.LoadFile(path); + this.assembly = this.assembly ?? Assembly.LoadFile(path); - var name = this._assembly.GetName(); + var name = this.assembly.GetName(); #if SIGNED this.Id = name.Name + "Signed"; #else this.Id = name.Name; #endif - this.Authors = this.GetAuthors(this._assembly); - this.Description = this.GetDescription(this._assembly); - this.Version = this.GetVersion(this._assembly); + this.Authors = GetAuthors(this.assembly); + this.Description = GetDescription(this.assembly); + this.Version = GetVersion(this.assembly); this.GenerateComputedSpecFile(); @@ -59,16 +59,16 @@ private void GenerateComputedSpecFile() var doc = XDocument.Load(this.SpecFile); var metaNode = doc.Descendants("metadata").First(); - this.ReplaceToken(metaNode, "id", this.Id); - this.ReplaceToken(metaNode, "authors", this.Authors); - this.ReplaceToken(metaNode, "owners", this.Authors); - this.ReplaceToken(metaNode, "description", this.Description); - this.ReplaceToken(metaNode, "version", this.Version); + ReplaceToken(metaNode, "id", this.Id); + ReplaceToken(metaNode, "authors", this.Authors); + ReplaceToken(metaNode, "owners", this.Authors); + ReplaceToken(metaNode, "description", this.Description); + ReplaceToken(metaNode, "version", this.Version); doc.Save(this.SpecFile.Replace(".nuspec", "-computed.nuspec")); } - private void ReplaceToken(XElement metaNode, XName name, string value) + private static void ReplaceToken(XContainer metaNode, XName name, string value) { var node = metaNode.Element(name); var token = string.Format("${0}$", name.ToString().TrimEnd('s')); @@ -78,26 +78,26 @@ private void ReplaceToken(XElement metaNode, XName name, string value) token = "$author$"; } - if (node.Value.Equals(token, StringComparison.OrdinalIgnoreCase)) + if (node != null && node.Value.Equals(token, StringComparison.OrdinalIgnoreCase)) { node.SetValue(value); } } - private string GetDescription(Assembly asm) + private static string GetDescription(ICustomAttributeProvider asm) { - return this.GetAttribute(asm).Description; + return GetAttribute(asm).Description; } - private string GetAuthors(Assembly asm) + private static string GetAuthors(ICustomAttributeProvider asm) { - return this.GetAttribute(asm).Company; + return GetAttribute(asm).Company; } - private string GetVersion(Assembly asm) + private static string GetVersion(Assembly asm) { var version = asm.GetName().Version.ToString(); - var attr = this.GetAttribute(asm); + var attr = GetAttribute(asm); if (attr != null) { @@ -107,7 +107,7 @@ private string GetVersion(Assembly asm) return version; } - private TAttr GetAttribute(Assembly asm) where TAttr : Attribute + private static TAttr GetAttribute(ICustomAttributeProvider asm) where TAttr : Attribute { var attrs = asm.GetCustomAttributes(typeof(TAttr), false); diff --git a/RestSharp.IntegrationTests/AsyncRequestBodyTests.cs b/RestSharp.IntegrationTests/AsyncRequestBodyTests.cs index eb2c564ed..5f6625010 100644 --- a/RestSharp.IntegrationTests/AsyncRequestBodyTests.cs +++ b/RestSharp.IntegrationTests/AsyncRequestBodyTests.cs @@ -44,7 +44,6 @@ public void Can_Have_No_Body_Added_To_POST_Request() { var client = new RestClient(BASE_URL); var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); - var resetEvent = new ManualResetEvent(false); client.ExecuteAsync(request, response => resetEvent.Set()); diff --git a/RestSharp.IntegrationTests/AsyncTests.cs b/RestSharp.IntegrationTests/AsyncTests.cs index 6fe49cd32..98bd0d8ae 100644 --- a/RestSharp.IntegrationTests/AsyncTests.cs +++ b/RestSharp.IntegrationTests/AsyncTests.cs @@ -81,14 +81,14 @@ public void Can_Perform_GET_TaskAsync() public void Can_Handle_Exception_Thrown_By_OnBeforeDeserialization_Handler() { const string baseUrl = "http://localhost:8888/"; - const string ExceptionMessage = "Thrown from OnBeforeDeserialization"; + const string exceptionMessage = "Thrown from OnBeforeDeserialization"; using (SimpleServer.Create(baseUrl, Handlers.Generic())) { var client = new RestClient(baseUrl); var request = new RestRequest("success"); - request.OnBeforeDeserialization += r => { throw new Exception(ExceptionMessage); }; + request.OnBeforeDeserialization += r => { throw new Exception(exceptionMessage); }; var task = client.ExecuteTaskAsync(request); @@ -96,7 +96,7 @@ public void Can_Handle_Exception_Thrown_By_OnBeforeDeserialization_Handler() var response = task.Result; - Assert.AreEqual(ExceptionMessage, response.ErrorMessage); + Assert.AreEqual(exceptionMessage, response.ErrorMessage); Assert.AreEqual(ResponseStatus.Error, response.ResponseStatus); } } @@ -217,7 +217,7 @@ public void Can_Timeout_GET_TaskAsync() var client = new RestClient(baseUrl); var request = new RestRequest("timeout", Method.GET).AddBody("Body_Content"); - //Half the value of ResponseHandler.Timeout + // Half the value of ResponseHandler.Timeout request.Timeout = 500; var task = client.ExecuteTaskAsync(request); @@ -240,7 +240,7 @@ public void Can_Timeout_PUT_TaskAsync() var client = new RestClient(baseUrl); var request = new RestRequest("timeout", Method.PUT).AddBody("Body_Content"); - //Half the value of ResponseHandler.Timeout + // Half the value of ResponseHandler.Timeout request.Timeout = 500; var task = client.ExecuteTaskAsync(request); diff --git a/RestSharp.IntegrationTests/AuthenticationTests.cs b/RestSharp.IntegrationTests/AuthenticationTests.cs index a8d03614f..097879043 100644 --- a/RestSharp.IntegrationTests/AuthenticationTests.cs +++ b/RestSharp.IntegrationTests/AuthenticationTests.cs @@ -4,7 +4,7 @@ using System.Text; using NUnit.Framework; using RestSharp.Authenticators; -using RestSharp.Contrib; +using RestSharp.Extensions.MonoHttp; using RestSharp.IntegrationTests.Helpers; namespace RestSharp.IntegrationTests @@ -17,7 +17,7 @@ public void Can_Authenticate_With_Basic_Http_Auth() { Uri baseUrl = new Uri("http://localhost:8888/"); - using(SimpleServer.Create(baseUrl.AbsoluteUri, UsernamePasswordEchoHandler)) + using (SimpleServer.Create(baseUrl.AbsoluteUri, UsernamePasswordEchoHandler)) { var client = new RestClient(baseUrl) { diff --git a/RestSharp.IntegrationTests/CompressionTests.cs b/RestSharp.IntegrationTests/CompressionTests.cs index e719d594f..18991ee63 100644 --- a/RestSharp.IntegrationTests/CompressionTests.cs +++ b/RestSharp.IntegrationTests/CompressionTests.cs @@ -14,7 +14,7 @@ public void Can_Handle_Gzip_Compressed_Content() { Uri baseUrl = new Uri("http://localhost:8888/"); - using(SimpleServer.Create(baseUrl.AbsoluteUri, GzipEchoValue("This is some gzipped content"))) + using (SimpleServer.Create(baseUrl.AbsoluteUri, GzipEchoValue("This is some gzipped content"))) { var client = new RestClient(baseUrl); var request = new RestRequest(""); @@ -29,7 +29,7 @@ public void Can_Handle_Deflate_Compressed_Content() { Uri baseUrl = new Uri("http://localhost:8888/"); - using(SimpleServer.Create(baseUrl.AbsoluteUri, DeflateEchoValue("This is some deflated content"))) + using (SimpleServer.Create(baseUrl.AbsoluteUri, DeflateEchoValue("This is some deflated content"))) { var client = new RestClient(baseUrl); var request = new RestRequest(""); @@ -44,7 +44,7 @@ public void Can_Handle_Uncompressed_Content() { Uri baseUrl = new Uri("http://localhost:8888/"); - using(SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.EchoValue("This is some sample content"))) + using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.EchoValue("This is some sample content"))) { var client = new RestClient(baseUrl); var request = new RestRequest(""); @@ -57,27 +57,27 @@ public void Can_Handle_Uncompressed_Content() static Action GzipEchoValue(string value) { return context => - { - context.Response.Headers.Add("Content-encoding", "gzip"); + { + context.Response.Headers.Add("Content-encoding", "gzip"); - using (var gzip = new GZipStream(context.Response.OutputStream, CompressionMode.Compress, true)) - { - gzip.WriteStringUtf8(value); - } - }; + using (var gzip = new GZipStream(context.Response.OutputStream, CompressionMode.Compress, true)) + { + gzip.WriteStringUtf8(value); + } + }; } static Action DeflateEchoValue(string value) { return context => - { - context.Response.Headers.Add("Content-encoding", "deflate"); + { + context.Response.Headers.Add("Content-encoding", "deflate"); - using (var gzip = new DeflateStream(context.Response.OutputStream, CompressionMode.Compress, true)) - { - gzip.WriteStringUtf8(value); - } - }; + using (var gzip = new DeflateStream(context.Response.OutputStream, CompressionMode.Compress, true)) + { + gzip.WriteStringUtf8(value); + } + }; } } } diff --git a/RestSharp.IntegrationTests/FileTests.cs b/RestSharp.IntegrationTests/FileTests.cs index b82eb94cd..2dbd3f718 100644 --- a/RestSharp.IntegrationTests/FileTests.cs +++ b/RestSharp.IntegrationTests/FileTests.cs @@ -13,7 +13,7 @@ public void Handles_Binary_File_Download() { Uri baseUrl = new Uri("http://localhost:8888/"); - using(SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.FileHandler)) + using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.FileHandler)) { var client = new RestClient(baseUrl); var request = new RestRequest("Assets/Koala.jpg"); diff --git a/RestSharp.IntegrationTests/Helpers/Handlers.cs b/RestSharp.IntegrationTests/Helpers/Handlers.cs index a47577421..756b073c2 100644 --- a/RestSharp.IntegrationTests/Helpers/Handlers.cs +++ b/RestSharp.IntegrationTests/Helpers/Handlers.cs @@ -57,20 +57,20 @@ public static void FileHandler(HttpListenerContext context) public static Action Generic() where T : new() { return ctx => - { - var methodName = ctx.Request.Url.Segments.Last(); - var method = typeof(T).GetMethod(methodName, - BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + { + var methodName = ctx.Request.Url.Segments.Last(); + var method = typeof(T).GetMethod(methodName, + BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); - if (method.IsStatic) - { - method.Invoke(null, new object[] { ctx }); - } - else - { - method.Invoke(new T(), new object[] { ctx }); - } - }; + if (method.IsStatic) + { + method.Invoke(null, new object[] { ctx }); + } + else + { + method.Invoke(new T(), new object[] { ctx }); + } + }; } } } \ No newline at end of file diff --git a/RestSharp.IntegrationTests/MultipartFormDataTests.cs b/RestSharp.IntegrationTests/MultipartFormDataTests.cs index 08b393da9..2f82b398b 100644 --- a/RestSharp.IntegrationTests/MultipartFormDataTests.cs +++ b/RestSharp.IntegrationTests/MultipartFormDataTests.cs @@ -39,15 +39,23 @@ public void MultipartFormData_WithParameterAndFile_Async() { var client = new RestClient(baseUrl); var request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; - string path = Path.Combine(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName, "Assets\\TestFile.txt"); + var directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()).Parent; + + if (directoryInfo != null) + { + string path = Path.Combine(directoryInfo.FullName, + "Assets\\TestFile.txt"); + + request.AddFile("fileName", path); + } - request.AddFile("fileName", path); request.AddParameter("controlName", "test", "application/json", ParameterType.RequestBody); - var task = client.ExecuteTaskAsync(request).ContinueWith(x => - { - Assert.AreEqual(this.expectedFileAndBodyRequestContent, x.Result.Content); - }); + var task = client.ExecuteTaskAsync(request) + .ContinueWith(x => + { + Assert.AreEqual(this.expectedFileAndBodyRequestContent, x.Result.Content); + }); task.Wait(); } @@ -62,9 +70,16 @@ public void MultipartFormData_WithParameterAndFile() { var client = new RestClient(baseUrl); var request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; - string path = Path.Combine(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName, "Assets\\TestFile.txt"); + var directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()).Parent; + + if (directoryInfo != null) + { + string path = Path.Combine(directoryInfo.FullName, + "Assets\\TestFile.txt"); + + request.AddFile("fileName", path); + } - request.AddFile("fileName", path); request.AddParameter("controlName", "test", "application/json", ParameterType.RequestBody); var response = client.Execute(request); diff --git a/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs b/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs index f016f6d1f..eacfd8ee6 100644 --- a/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs +++ b/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs @@ -32,12 +32,12 @@ public void Task_Handles_Non_Existent_Domain() { var client = new RestClient("http://192.168.1.200:8001"); var request = new RestRequest("/") - { - RequestFormat = DataFormat.Json, - Method = Method.GET - }; - + { + RequestFormat = DataFormat.Json, + Method = Method.GET + }; var task = client.ExecuteTaskAsync(request); + task.Wait(); var response = task.Result; @@ -73,6 +73,7 @@ public void Handles_Server_Timeout_Error() public void Handles_Server_Timeout_Error_Async() { const string baseUrl = "http://localhost:8888/"; + var resetEvent = new ManualResetEvent(false); using (SimpleServer.Create(baseUrl, TimeoutHandler)) @@ -106,7 +107,7 @@ public void Handles_Server_Timeout_Error_AsyncTask() { var client = new RestClient(baseUrl); var request = new RestRequest("404") { Timeout = 500 }; - var task = client.ExecuteTaskAsync(request); + var task = client.ExecuteTaskAsync(request); task.Wait(); diff --git a/RestSharp.IntegrationTests/RequestBodyTests.cs b/RestSharp.IntegrationTests/RequestBodyTests.cs index 93b4af093..b0be84ddc 100644 --- a/RestSharp.IntegrationTests/RequestBodyTests.cs +++ b/RestSharp.IntegrationTests/RequestBodyTests.cs @@ -14,6 +14,7 @@ public class RequestBodyTests public void Can_Not_Be_Added_To_GET_Request() { const Method httpMethod = Method.GET; + using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { var client = new RestClient(BASE_URL); diff --git a/RestSharp.IntegrationTests/RequestHeadTests.cs b/RestSharp.IntegrationTests/RequestHeadTests.cs index 14081de70..07b6fb0c6 100644 --- a/RestSharp.IntegrationTests/RequestHeadTests.cs +++ b/RestSharp.IntegrationTests/RequestHeadTests.cs @@ -21,6 +21,7 @@ public void SetupRequestHeadTests() public void Does_Not_Pass_Default_Credentials_When_Server_Does_Not_Negotiate() { const Method httpMethod = Method.GET; + using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { var client = new RestClient(BASE_URL); @@ -67,12 +68,12 @@ public void Does_Not_Pass_Default_Credentials_When_UseDefaultCredentials_Is_Fals { var client = new RestClient(BASE_URL); var request = new RestRequest(RequestHeadCapturer.RESOURCE, httpMethod) - { - // UseDefaultCredentials is currently false by default, - // but to make the test more robust in case that ever - // changes, it's better to explicitly set it here. - UseDefaultCredentials = false - }; + { + // UseDefaultCredentials is currently false by default, + // but to make the test more robust in case that ever + // changes, it's better to explicitly set it here. + UseDefaultCredentials = false + }; var response = client.Execute(request); Assert.AreEqual(HttpStatusCode.Unauthorized, response.StatusCode); diff --git a/RestSharp.IntegrationTests/RestSharp.IntegrationTests.Signed.csproj b/RestSharp.IntegrationTests/RestSharp.IntegrationTests.Signed.csproj index 74edf6121..7ebf2c9cc 100644 --- a/RestSharp.IntegrationTests/RestSharp.IntegrationTests.Signed.csproj +++ b/RestSharp.IntegrationTests/RestSharp.IntegrationTests.Signed.csproj @@ -74,7 +74,7 @@ - + diff --git a/RestSharp.IntegrationTests/StatusCodeTests.cs b/RestSharp.IntegrationTests/StatusCodeTests.cs index 05f121a2b..ef8405ddf 100644 --- a/RestSharp.IntegrationTests/StatusCodeTests.cs +++ b/RestSharp.IntegrationTests/StatusCodeTests.cs @@ -14,7 +14,7 @@ public void Handles_GET_Request_404_Error() { Uri baseUrl = new Uri("http://localhost:8080/"); - using(SimpleServer.Create(baseUrl.AbsoluteUri, UrlToStatusCodeHandler)) + using (SimpleServer.Create(baseUrl.AbsoluteUri, UrlToStatusCodeHandler)) { var client = new RestClient(baseUrl); var request = new RestRequest("404"); @@ -52,7 +52,7 @@ public void Handles_Different_Root_Element_On_Http_Error() { Uri baseUrl = new Uri("http://localhost:8888/"); - using(SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.Generic())) + using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.Generic())) { var client = new RestClient(baseUrl); var request = new RestRequest("error") { RootElement = "Success" }; @@ -77,7 +77,7 @@ public void Handles_Default_Root_Element_On_No_Error() { Uri baseUrl = new Uri("http://localhost:8888/"); - using(SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.Generic())) + using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.Generic())) { var client = new RestClient(baseUrl); var request = new RestRequest("success") { RootElement = "Success" }; diff --git a/RestSharp.IntegrationTests/oAuth1Tests.cs b/RestSharp.IntegrationTests/oAuth1Tests.cs index 9938a893b..c4a1a4db2 100644 --- a/RestSharp.IntegrationTests/oAuth1Tests.cs +++ b/RestSharp.IntegrationTests/oAuth1Tests.cs @@ -8,7 +8,7 @@ using NUnit.Framework; using RestSharp.Authenticators; using RestSharp.Authenticators.OAuth; -using RestSharp.Contrib; +using RestSharp.Extensions.MonoHttp; using RestSharp.IntegrationTests.Models; namespace RestSharp.IntegrationTests @@ -106,23 +106,27 @@ public void Can_Authenticate_Twitter() Assert.True(File.Exists(@"..\..\config.json")); var config = SimpleJson.DeserializeObject(File.ReadAllText(@"..\..\config.json")) as JsonObject; - var client = new RestClient("https://api.twitter.com/1.1") - { - Authenticator = OAuth1Authenticator.ForProtectedResource( - (string) config["ConsumerKey"], - (string) config["ConsumerSecret"], - (string) config["AccessToken"], - (string) config["AccessSecret"]) - }; - var request = new RestRequest("account/verify_credentials.json"); + if (config != null) + { + var client = new RestClient("https://api.twitter.com/1.1") + { + Authenticator = OAuth1Authenticator.ForProtectedResource( + (string) config["ConsumerKey"], + (string) config["ConsumerSecret"], + (string) config["AccessToken"], + (string) config["AccessSecret"]) + }; - request.AddParameter("include_entities", "true", ParameterType.QueryString); + var request = new RestRequest("account/verify_credentials.json"); - var response = client.Execute(request); + request.AddParameter("include_entities", "true", ParameterType.QueryString); - Assert.NotNull(response); - Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); + var response = client.Execute(request); + + Assert.NotNull(response); + Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); + } } #region Netflix test classes diff --git a/RestSharp.Net4/Extensions/RestClientExtensions.cs b/RestSharp.Net4/Extensions/RestClientExtensions.cs deleted file mode 100644 index 553c6ce78..000000000 --- a/RestSharp.Net4/Extensions/RestClientExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ - -namespace RestSharp.Extensions -{ - public static partial class RestClientExtensions - { - public static RestResponse ExecuteDynamic(this IRestClient client, IRestRequest request) - { - var response = client.Execute(request); - var generic = (RestResponse)response; - dynamic content = SimpleJson.DeserializeObject(response.Content); - - generic.Data = content; - - return generic; - } - } -} diff --git a/RestSharp.Net4/RestSharp.Net4.Signed.csproj b/RestSharp.Net4/RestSharp.Net4.Signed.csproj index 3cab4f2da..648c4a4e5 100644 --- a/RestSharp.Net4/RestSharp.Net4.Signed.csproj +++ b/RestSharp.Net4/RestSharp.Net4.Signed.csproj @@ -277,7 +277,6 @@ Validation\Validate.cs - diff --git a/RestSharp.Net4/RestSharp.Net4.csproj b/RestSharp.Net4/RestSharp.Net4.csproj index beb393491..80a5dc7a5 100644 --- a/RestSharp.Net4/RestSharp.Net4.csproj +++ b/RestSharp.Net4/RestSharp.Net4.csproj @@ -266,7 +266,6 @@ Validation\Validate.cs - diff --git a/RestSharp.Net45/Extensions/RestClientExtensions.cs b/RestSharp.Net45/Extensions/RestClientExtensions.cs deleted file mode 100644 index 553c6ce78..000000000 --- a/RestSharp.Net45/Extensions/RestClientExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ - -namespace RestSharp.Extensions -{ - public static partial class RestClientExtensions - { - public static RestResponse ExecuteDynamic(this IRestClient client, IRestRequest request) - { - var response = client.Execute(request); - var generic = (RestResponse)response; - dynamic content = SimpleJson.DeserializeObject(response.Content); - - generic.Data = content; - - return generic; - } - } -} diff --git a/RestSharp.Net45/RestSharp.Net45.Signed.csproj b/RestSharp.Net45/RestSharp.Net45.Signed.csproj index 31da08e0c..9540e17b3 100644 --- a/RestSharp.Net45/RestSharp.Net45.Signed.csproj +++ b/RestSharp.Net45/RestSharp.Net45.Signed.csproj @@ -280,7 +280,6 @@ Validation\Validate.cs - diff --git a/RestSharp.Net45/RestSharp.Net45.csproj b/RestSharp.Net45/RestSharp.Net45.csproj index 98424a96a..9315d548a 100644 --- a/RestSharp.Net45/RestSharp.Net45.csproj +++ b/RestSharp.Net45/RestSharp.Net45.csproj @@ -269,7 +269,6 @@ Validation\Validate.cs - diff --git a/RestSharp.Net451/Extensions/RestClientExtensions.cs b/RestSharp.Net451/Extensions/RestClientExtensions.cs deleted file mode 100644 index 553c6ce78..000000000 --- a/RestSharp.Net451/Extensions/RestClientExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ - -namespace RestSharp.Extensions -{ - public static partial class RestClientExtensions - { - public static RestResponse ExecuteDynamic(this IRestClient client, IRestRequest request) - { - var response = client.Execute(request); - var generic = (RestResponse)response; - dynamic content = SimpleJson.DeserializeObject(response.Content); - - generic.Data = content; - - return generic; - } - } -} diff --git a/RestSharp.Net451/RestSharp.Net451.Signed.csproj b/RestSharp.Net451/RestSharp.Net451.Signed.csproj index 01b04593e..8674f164d 100644 --- a/RestSharp.Net451/RestSharp.Net451.Signed.csproj +++ b/RestSharp.Net451/RestSharp.Net451.Signed.csproj @@ -280,7 +280,6 @@ Validation\Validate.cs - diff --git a/RestSharp.Net451/RestSharp.Net451.csproj b/RestSharp.Net451/RestSharp.Net451.csproj index 43dc07f28..3a6b282b2 100644 --- a/RestSharp.Net451/RestSharp.Net451.csproj +++ b/RestSharp.Net451/RestSharp.Net451.csproj @@ -269,7 +269,6 @@ Validation\Validate.cs - diff --git a/RestSharp.Net452/Extensions/RestClientExtensions.cs b/RestSharp.Net452/Extensions/RestClientExtensions.cs deleted file mode 100644 index 553c6ce78..000000000 --- a/RestSharp.Net452/Extensions/RestClientExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ - -namespace RestSharp.Extensions -{ - public static partial class RestClientExtensions - { - public static RestResponse ExecuteDynamic(this IRestClient client, IRestRequest request) - { - var response = client.Execute(request); - var generic = (RestResponse)response; - dynamic content = SimpleJson.DeserializeObject(response.Content); - - generic.Data = content; - - return generic; - } - } -} diff --git a/RestSharp.Net452/RestSharp.Net452.Signed.csproj b/RestSharp.Net452/RestSharp.Net452.Signed.csproj index 62974f27e..d0574d9d7 100644 --- a/RestSharp.Net452/RestSharp.Net452.Signed.csproj +++ b/RestSharp.Net452/RestSharp.Net452.Signed.csproj @@ -280,7 +280,6 @@ Validation\Validate.cs - diff --git a/RestSharp.Net452/RestSharp.Net452.csproj b/RestSharp.Net452/RestSharp.Net452.csproj index 03d8c4c0c..47f0faa4b 100644 --- a/RestSharp.Net452/RestSharp.Net452.csproj +++ b/RestSharp.Net452/RestSharp.Net452.csproj @@ -269,7 +269,6 @@ Validation\Validate.cs - diff --git a/RestSharp.Net46/RestSharp.Net46.Signed.csproj b/RestSharp.Net46/RestSharp.Net46.Signed.csproj index f78397fb0..b47f077c9 100644 --- a/RestSharp.Net46/RestSharp.Net46.Signed.csproj +++ b/RestSharp.Net46/RestSharp.Net46.Signed.csproj @@ -238,9 +238,6 @@ RestClient.Sync.cs - - Extensions\RestClientExtensions.cs - RestClientExtensions.cs diff --git a/RestSharp.Net46/RestSharp.Net46.csproj b/RestSharp.Net46/RestSharp.Net46.csproj index 76cf6c6a5..97b7a43d1 100644 --- a/RestSharp.Net46/RestSharp.Net46.csproj +++ b/RestSharp.Net46/RestSharp.Net46.csproj @@ -50,9 +50,6 @@ - - Extensions\RestClientExtensions.cs - Authenticators\HttpBasicAuthenticator.cs diff --git a/RestSharp.Tests/AddRangeTests.cs b/RestSharp.Tests/AddRangeTests.cs index e529f70f2..98d5325c8 100644 --- a/RestSharp.Tests/AddRangeTests.cs +++ b/RestSharp.Tests/AddRangeTests.cs @@ -8,8 +8,8 @@ public class AddRangeTests [Test] public void ShouldParseOutRangeSpecifier() { - var restClient = new RestClient("http://localhost"); - var req = new RestRequest("bob", Method.GET); + RestClient restClient = new RestClient("http://localhost"); + RestRequest req = new RestRequest("bob", Method.GET); req.AddHeader("Range", "pages=1-2"); restClient.Execute(req); diff --git a/RestSharp.Tests/CultureChange.cs b/RestSharp.Tests/CultureChange.cs index 90f04dfd5..1cf9e1e12 100644 --- a/RestSharp.Tests/CultureChange.cs +++ b/RestSharp.Tests/CultureChange.cs @@ -18,8 +18,6 @@ public CultureChange(string culture) Thread.CurrentThread.CurrentCulture = new CultureInfo(culture); } - #region IDisposable Members - public void Dispose() { if (this.PreviousCulture != null) @@ -29,7 +27,5 @@ public void Dispose() this.PreviousCulture = null; } } - - #endregion } } diff --git a/RestSharp.Tests/InterfaceImplementationTests.cs b/RestSharp.Tests/InterfaceImplementationTests.cs index a78c110cc..0775c24fe 100644 --- a/RestSharp.Tests/InterfaceImplementationTests.cs +++ b/RestSharp.Tests/InterfaceImplementationTests.cs @@ -13,19 +13,21 @@ public class InterfaceImplementationTests public void IRestSharp_Has_All_RestSharp_Signatures() { // Arrange - var restClientImplementationType = typeof(RestClient); - var restClientInterfaceType = typeof(IRestClient); + Type restClientImplementationType = typeof(RestClient); + Type restClientInterfaceType = typeof(IRestClient); const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly; // Act - IEnumerable compareResult = CompareTypes(restClientImplementationType, restClientInterfaceType, bindingFlags); - compareResult.ToList().ForEach(x => Console.WriteLine("Method {0} exists in {1} but not in {2}", x, restClientImplementationType.FullName, restClientInterfaceType.FullName)); + List compareResult = CompareTypes(restClientImplementationType, restClientInterfaceType, bindingFlags).ToList(); + + compareResult.ForEach(x => Console.WriteLine("Method {0} exists in {1} but not in {2}", x, + restClientImplementationType.FullName, restClientInterfaceType.FullName)); // Assert Assert.AreEqual(0, compareResult.Count()); } - private static IEnumerable CompareTypes(Type type1, Type type2, BindingFlags bindingFlags) + private static IEnumerable CompareTypes(IReflect type1, IReflect type2, BindingFlags bindingFlags) { MethodInfo[] typeTMethodInfo = type1.GetMethods(bindingFlags); MethodInfo[] typeXMethodInfo = type2.GetMethods(bindingFlags); diff --git a/RestSharp.Tests/JsonTests.cs b/RestSharp.Tests/JsonTests.cs index ab1659b60..1600fc7b3 100644 --- a/RestSharp.Tests/JsonTests.cs +++ b/RestSharp.Tests/JsonTests.cs @@ -37,9 +37,9 @@ public class JsonTests public void Can_Deserialize_Exponential_Notation() { const string content = "{ \"Value\": 4.8e-04 }"; - var json = new JsonDeserializer(); - var output = json.Deserialize(new RestResponse { Content = content }); - var expected = Decimal.Parse("4.8e-04", NumberStyles.Float, CultureInfo.InvariantCulture); + JsonDeserializer json = new JsonDeserializer(); + DecimalNumber output = json.Deserialize(new RestResponse { Content = content }); + decimal expected = decimal.Parse("4.8e-04", NumberStyles.Float, CultureInfo.InvariantCulture); Assert.NotNull(output); Assert.AreEqual(expected, output.Value); @@ -49,8 +49,8 @@ public void Can_Deserialize_Exponential_Notation() public void Can_Deserialize_Into_Struct() { const string content = "{\"one\":\"oneOneOne\", \"two\":\"twoTwoTwo\", \"three\":3}"; - var json = new JsonDeserializer(); - var output = json.Deserialize(new RestResponse { Content = content }); + JsonDeserializer json = new JsonDeserializer(); + SimpleStruct output = json.Deserialize(new RestResponse { Content = content }); Assert.NotNull(output); Assert.AreEqual("oneOneOne", output.One); @@ -61,10 +61,10 @@ public void Can_Deserialize_Into_Struct() [Test] public void Can_Deserialize_Select_Tokens() { - var data = File.ReadAllText(Path.Combine("SampleData", "jsonarray.txt")); - var response = new RestResponse { Content = data }; - var json = new JsonDeserializer(); - var output = json.Deserialize(response); + string data = File.ReadAllText(Path.Combine("SampleData", "jsonarray.txt")); + RestResponse response = new RestResponse { Content = data }; + JsonDeserializer json = new JsonDeserializer(); + StatusComplexList output = json.Deserialize(response); Assert.AreEqual(4, output.Count); } @@ -72,10 +72,9 @@ public void Can_Deserialize_Select_Tokens() [Test] public void Can_Deserialize_4sq_Json_With_Root_Element_Specified() { - var doc = File.ReadAllText(Path.Combine("SampleData", "4sq.txt")); - var json = new JsonDeserializer { RootElement = "response" }; - - var output = json.Deserialize(new RestResponse { Content = doc }); + string doc = File.ReadAllText(Path.Combine("SampleData", "4sq.txt")); + JsonDeserializer json = new JsonDeserializer { RootElement = "response" }; + VenuesResponse output = json.Deserialize(new RestResponse { Content = doc }); Assert.IsNotEmpty(output.Groups); } @@ -83,9 +82,9 @@ public void Can_Deserialize_4sq_Json_With_Root_Element_Specified() [Test] public void Can_Deserialize_Lists_of_Simple_Types() { - var doc = File.ReadAllText(Path.Combine("SampleData", "jsonlists.txt")); - var json = new JsonDeserializer(); - var output = json.Deserialize(new RestResponse { Content = doc }); + string doc = File.ReadAllText(Path.Combine("SampleData", "jsonlists.txt")); + JsonDeserializer json = new JsonDeserializer(); + JsonLists output = json.Deserialize(new RestResponse { Content = doc }); Assert.IsNotEmpty(output.Names); Assert.IsNotEmpty(output.Numbers); @@ -95,8 +94,8 @@ public void Can_Deserialize_Lists_of_Simple_Types() public void Can_Deserialize_Simple_Generic_List_of_Simple_Types() { const string content = "{\"users\":[\"johnsheehan\",\"jagregory\",\"drusellers\",\"structuremap\"]}"; - var json = new JsonDeserializer { RootElement = "users" }; - var output = json.Deserialize>(new RestResponse { Content = content }); + JsonDeserializer json = new JsonDeserializer { RootElement = "users" }; + List output = json.Deserialize>(new RestResponse { Content = content }); Assert.IsNotEmpty(output); } @@ -105,8 +104,8 @@ public void Can_Deserialize_Simple_Generic_List_of_Simple_Types() public void Can_Deserialize_Simple_Generic_List_of_Simple_Types_With_Nulls() { const string content = "{\"users\":[\"johnsheehan\",\"jagregory\",null,\"drusellers\",\"structuremap\"]}"; - var json = new JsonDeserializer { RootElement = "users" }; - var output = json.Deserialize>(new RestResponse { Content = content }); + JsonDeserializer json = new JsonDeserializer { RootElement = "users" }; + List output = json.Deserialize>(new RestResponse { Content = content }); Assert.IsNotEmpty(output); Assert.AreEqual(null, output[2]); @@ -117,8 +116,8 @@ public void Can_Deserialize_Simple_Generic_List_of_Simple_Types_With_Nulls() public void Can_Deserialize_Simple_Generic_List_Given_Item_Without_Array() { const string content = "{\"users\":\"johnsheehan\"}"; - var json = new JsonDeserializer { RootElement = "users" }; - var output = json.Deserialize>(new RestResponse { Content = content }); + JsonDeserializer json = new JsonDeserializer { RootElement = "users" }; + List output = json.Deserialize>(new RestResponse { Content = content }); Assert.True(output.SequenceEqual(new[] { "johnsheehan" })); } @@ -127,8 +126,8 @@ public void Can_Deserialize_Simple_Generic_List_Given_Item_Without_Array() public void Can_Deserialize_Simple_Generic_List_Given_Toplevel_Item_Without_Array() { const string content = "\"johnsheehan\""; - var json = new JsonDeserializer(); - var output = json.Deserialize>(new RestResponse { Content = content }); + JsonDeserializer json = new JsonDeserializer(); + List output = json.Deserialize>(new RestResponse { Content = content }); Assert.True(output.SequenceEqual(new[] { "johnsheehan" })); } @@ -136,10 +135,9 @@ public void Can_Deserialize_Simple_Generic_List_Given_Toplevel_Item_Without_Arra [Test] public void Can_Deserialize_From_Root_Element() { - var doc = File.ReadAllText(Path.Combine("SampleData", "sojson.txt")); - var json = new JsonDeserializer { RootElement = "User" }; - - var output = json.Deserialize(new RestResponse { Content = doc }); + string doc = File.ReadAllText(Path.Combine("SampleData", "sojson.txt")); + JsonDeserializer json = new JsonDeserializer { RootElement = "User" }; + SOUser output = json.Deserialize(new RestResponse { Content = doc }); Assert.AreEqual("John Sheehan", output.DisplayName); } @@ -147,13 +145,13 @@ public void Can_Deserialize_From_Root_Element() [Test] public void Can_Deserialize_To_Dictionary_String_Object() { - var doc = File.ReadAllText(Path.Combine("SampleData", "jsondictionary.txt")); - var json = new JsonDeserializer(); - var output = json.Deserialize>(new RestResponse { Content = doc }); + string doc = File.ReadAllText(Path.Combine("SampleData", "jsondictionary.txt")); + JsonDeserializer json = new JsonDeserializer(); + Dictionary output = json.Deserialize>(new RestResponse { Content = doc }); Assert.AreEqual(output.Keys.Count, 3); - var firstKeysVal = output.FirstOrDefault().Value; + object firstKeysVal = output.FirstOrDefault().Value; Assert.IsInstanceOf(firstKeysVal); } @@ -161,13 +159,13 @@ public void Can_Deserialize_To_Dictionary_String_Object() [Test] public void Can_Deserialize_To_Dictionary_Int_Object() { - var doc = File.ReadAllText(Path.Combine("SampleData", "jsondictionary_KeysType.txt")); - var json = new JsonDeserializer(); - var output = json.Deserialize>(new RestResponse { Content = doc }); + string doc = File.ReadAllText(Path.Combine("SampleData", "jsondictionary_KeysType.txt")); + JsonDeserializer json = new JsonDeserializer(); + Dictionary output = json.Deserialize>(new RestResponse { Content = doc }); Assert.AreEqual(output.Keys.Count, 2); - var firstKeysVal = output.FirstOrDefault().Value; + object firstKeysVal = output.FirstOrDefault().Value; Assert.IsInstanceOf(firstKeysVal); } @@ -175,9 +173,9 @@ public void Can_Deserialize_To_Dictionary_Int_Object() [Test] public void Can_Deserialize_Generic_Members() { - var doc = File.ReadAllText(Path.Combine("SampleData", "GenericWithList.txt")); - var json = new JsonDeserializer(); - var output = json.Deserialize>>(new RestResponse { Content = doc }); + string doc = File.ReadAllText(Path.Combine("SampleData", "GenericWithList.txt")); + JsonDeserializer json = new JsonDeserializer(); + Generic> output = json.Deserialize>>(new RestResponse { Content = doc }); Assert.AreEqual("Foe sho", output.Data.Items[0].Nickname); } @@ -187,13 +185,13 @@ public void Can_Deserialize_List_of_Guid() { Guid id1 = new Guid("b0e5c11f-e944-478c-aadd-753b956d0c8c"); Guid id2 = new Guid("809399fa-21c4-4dca-8dcd-34cb697fbca0"); - var data = new JsonObject(); + JsonObject data = new JsonObject(); data["Ids"] = new JsonArray { id1, id2 }; - var d = new JsonDeserializer(); - var response = new RestResponse { Content = data.ToString() }; - var p = d.Deserialize(response); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = data.ToString() }; + GuidList p = d.Deserialize(response); Assert.AreEqual(2, p.Ids.Count); Assert.AreEqual(id1, p.Ids[0]); @@ -205,13 +203,13 @@ public void Can_Deserialize_Generic_List_of_DateTime() { DateTime item1 = new DateTime(2010, 2, 8, 11, 11, 11); DateTime item2 = item1.AddSeconds(12345); - var data = new JsonObject(); + JsonObject data = new JsonObject(); data["Items"] = new JsonArray { item1.ToString("u"), item2.ToString("u") }; - var d = new JsonDeserializer(); - var response = new RestResponse { Content = data.ToString() }; - var p = d.Deserialize>(response); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = data.ToString() }; + GenericWithList p = d.Deserialize>(response); Assert.AreEqual(2, p.Items.Count); Assert.AreEqual(item1, p.Items[0]); @@ -224,7 +222,7 @@ public void Can_Deserialize_DateTime_With_DateTimeStyles() DateTime item0 = new DateTime(2010, 2, 8, 11, 11, 11, DateTimeKind.Local); DateTime item1 = new DateTime(2011, 2, 8, 11, 11, 11, DateTimeKind.Utc); DateTime item2 = new DateTime(2012, 2, 8, 11, 11, 11, DateTimeKind.Unspecified); - var data = new JsonObject(); + JsonObject data = new JsonObject(); data["Items"] = new JsonArray { @@ -234,9 +232,9 @@ public void Can_Deserialize_DateTime_With_DateTimeStyles() "/Date(1309421746929+0000)/" }; - var d = new JsonDeserializer(); - var response = new RestResponse { Content = data.ToString() }; - var p = d.Deserialize>(response); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = data.ToString() }; + GenericWithList p = d.Deserialize>(response); Assert.AreNotEqual(item0.Kind, p.Items[0].Kind); Assert.AreEqual(item1.Kind, p.Items[1].Kind); @@ -247,9 +245,9 @@ public void Can_Deserialize_DateTime_With_DateTimeStyles() [Test] public void Can_Deserialize_Null_Elements_to_Nullable_Values() { - var doc = this.CreateJsonWithNullValues(); - var json = new JsonDeserializer(); - var output = json.Deserialize(new RestResponse { Content = doc }); + string doc = CreateJsonWithNullValues(); + JsonDeserializer json = new JsonDeserializer(); + NullableValues output = json.Deserialize(new RestResponse { Content = doc }); Assert.Null(output.Id); Assert.Null(output.StartDate); @@ -259,9 +257,9 @@ public void Can_Deserialize_Null_Elements_to_Nullable_Values() [Test] public void Can_Deserialize_Empty_Elements_to_Nullable_Values() { - var doc = this.CreateJsonWithEmptyValues(); - var json = new JsonDeserializer(); - var output = json.Deserialize(new RestResponse { Content = doc }); + string doc = CreateJsonWithEmptyValues(); + JsonDeserializer json = new JsonDeserializer(); + NullableValues output = json.Deserialize(new RestResponse { Content = doc }); Assert.Null(output.Id); Assert.Null(output.StartDate); @@ -271,9 +269,9 @@ public void Can_Deserialize_Empty_Elements_to_Nullable_Values() [Test] public void Can_Deserialize_Elements_to_Nullable_Values() { - var doc = this.CreateJsonWithoutEmptyValues(); - var json = new JsonDeserializer(); - var output = json.Deserialize(new RestResponse { Content = doc }); + string doc = CreateJsonWithoutEmptyValues(); + JsonDeserializer json = new JsonDeserializer(); + NullableValues output = json.Deserialize(new RestResponse { Content = doc }); Assert.NotNull(output.Id); Assert.NotNull(output.StartDate); @@ -291,8 +289,8 @@ public void Can_Deserialize_Elements_to_Nullable_Values() public void Can_Deserialize_Json_Using_DeserializeAs_Attribute() { const string content = "{\"sid\":\"asdasdasdasdasdasdasda\",\"friendlyName\":\"VeryNiceName\",\"oddballPropertyName\":\"blahblah\"}"; - var json = new JsonDeserializer { RootElement = "users" }; - var output = json.Deserialize(new RestResponse { Content = content }); + JsonDeserializer json = new JsonDeserializer { RootElement = "users" }; + Oddball output = json.Deserialize(new RestResponse { Content = content }); Assert.NotNull(output); Assert.AreEqual("blahblah", output.GoodPropertyName); @@ -301,14 +299,14 @@ public void Can_Deserialize_Json_Using_DeserializeAs_Attribute() [Test] public void Can_Deserialize_Custom_Formatted_Date() { - var culture = CultureInfo.InvariantCulture; + CultureInfo culture = CultureInfo.InvariantCulture; const string format = "dd yyyy MMM, hh:mm ss tt"; - var date = new DateTime(2010, 2, 8, 11, 11, 11); + DateTime date = new DateTime(2010, 2, 8, 11, 11, 11); var formatted = new { StartDate = date.ToString(format, culture) }; - var data = SimpleJson.SerializeObject(formatted); - var response = new RestResponse { Content = data }; - var json = new JsonDeserializer { DateFormat = format, Culture = culture }; - var output = json.Deserialize(response); + string data = SimpleJson.SerializeObject(formatted); + RestResponse response = new RestResponse { Content = data }; + JsonDeserializer json = new JsonDeserializer { DateFormat = format, Culture = culture }; + PersonForJson output = json.Deserialize(response); Assert.AreEqual(date, output.StartDate); } @@ -316,10 +314,10 @@ public void Can_Deserialize_Custom_Formatted_Date() [Test] public void Can_Deserialize_Root_Json_Array_To_List() { - var data = File.ReadAllText(Path.Combine("SampleData", "jsonarray.txt")); - var response = new RestResponse { Content = data }; - var json = new JsonDeserializer(); - var output = json.Deserialize>(response); + string data = File.ReadAllText(Path.Combine("SampleData", "jsonarray.txt")); + RestResponse response = new RestResponse { Content = data }; + JsonDeserializer json = new JsonDeserializer(); + List output = json.Deserialize>(response); Assert.AreEqual(4, output.Count); } @@ -327,10 +325,10 @@ public void Can_Deserialize_Root_Json_Array_To_List() [Test] public void Can_Deserialize_Root_Json_Array_To_Inherited_List() { - var data = File.ReadAllText(Path.Combine("SampleData", "jsonarray.txt")); - var response = new RestResponse { Content = data }; - var json = new JsonDeserializer(); - var output = json.Deserialize(response); + string data = File.ReadAllText(Path.Combine("SampleData", "jsonarray.txt")); + RestResponse response = new RestResponse { Content = data }; + JsonDeserializer json = new JsonDeserializer(); + StatusList output = json.Deserialize(response); Assert.AreEqual(4, output.Count); } @@ -338,10 +336,10 @@ public void Can_Deserialize_Root_Json_Array_To_Inherited_List() [Test] public void Can_Deserialize_Various_Enum_Values() { - var data = File.ReadAllText(Path.Combine("SampleData", "jsonenums.txt")); - var response = new RestResponse { Content = data }; - var json = new JsonDeserializer(); - var output = json.Deserialize(response); + string data = File.ReadAllText(Path.Combine("SampleData", "jsonenums.txt")); + RestResponse response = new RestResponse { Content = data }; + JsonDeserializer json = new JsonDeserializer(); + JsonEnumsTestStructure output = json.Deserialize(response); Assert.AreEqual(Disposition.Friendly, output.Upper); Assert.AreEqual(Disposition.Friendly, output.Lower); @@ -356,10 +354,10 @@ public void Can_Deserialize_Various_Enum_Values() [Test] public void Can_Deserialize_Various_Enum_Types() { - var data = File.ReadAllText(Path.Combine("SampleData", "jsonenumtypes.txt")); - var response = new RestResponse { Content = data }; - var json = new JsonDeserializer(); - var output = json.Deserialize(response); + string data = File.ReadAllText(Path.Combine("SampleData", "jsonenumtypes.txt")); + RestResponse response = new RestResponse { Content = data }; + JsonDeserializer json = new JsonDeserializer(); + JsonEnumTypesTestStructure output = json.Deserialize(response); Assert.AreEqual(ByteEnum.EnumMin, output.ByteEnumType); Assert.AreEqual(SByteEnum.EnumMin, output.SByteEnumType); @@ -375,9 +373,9 @@ public void Can_Deserialize_Various_Enum_Types() public void Deserialization_Of_Undefined_Int_Value_Returns_Enum_Default() { const string data = @"{ ""Integer"" : 1024 }"; - var response = new RestResponse { Content = data }; - var json = new JsonDeserializer(); - var result = json.Deserialize(response); + RestResponse response = new RestResponse { Content = data }; + JsonDeserializer json = new JsonDeserializer(); + JsonEnumsTestStructure result = json.Deserialize(response); Assert.AreEqual(Disposition.Friendly, result.Integer); } @@ -385,13 +383,13 @@ public void Deserialization_Of_Undefined_Int_Value_Returns_Enum_Default() [Test] public void Can_Deserialize_Guid_String_Fields() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["Guid"] = GUID_STRING; - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc.ToString() }; - var p = d.Deserialize(response); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = doc.ToString() }; + PersonForJson p = d.Deserialize(response); Assert.AreEqual(new Guid(GUID_STRING), p.Guid); } @@ -399,13 +397,13 @@ public void Can_Deserialize_Guid_String_Fields() [Test] public void Can_Deserialize_Quoted_Primitive() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["Age"] = "28"; - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc.ToString() }; - var p = d.Deserialize(response); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = doc.ToString() }; + PersonForJson p = d.Deserialize(response); Assert.AreEqual(28, p.Age); } @@ -413,13 +411,13 @@ public void Can_Deserialize_Quoted_Primitive() [Test] public void Can_Deserialize_Int_to_Bool() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["IsCool"] = 1; - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc.ToString() }; - var p = d.Deserialize(response); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = doc.ToString() }; + PersonForJson p = d.Deserialize(response); Assert.True(p.IsCool); } @@ -427,10 +425,10 @@ public void Can_Deserialize_Int_to_Bool() [Test] public void Can_Deserialize_With_Default_Root() { - var doc = this.CreateJson(); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var p = d.Deserialize(response); + string doc = CreateJson(); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = doc }; + PersonForJson p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1, DateTimeKind.Utc), p.StartDate); @@ -466,11 +464,10 @@ public void Can_Deserialize_With_Default_Root_Alternative_Culture() [Test] public void Can_Deserialize_Names_With_Underscore_Prefix() { - var data = File.ReadAllText(Path.Combine("SampleData", "underscore_prefix.txt")); - var response = new RestResponse { Content = data }; - var json = new JsonDeserializer { RootElement = "User" }; - - var output = json.Deserialize(response); + string data = File.ReadAllText(Path.Combine("SampleData", "underscore_prefix.txt")); + RestResponse response = new RestResponse { Content = data }; + JsonDeserializer json = new JsonDeserializer { RootElement = "User" }; + SOUser output = json.Deserialize(response); Assert.AreEqual("John Sheehan", output.DisplayName); Assert.AreEqual(1786, output.Id); @@ -479,10 +476,10 @@ public void Can_Deserialize_Names_With_Underscore_Prefix() [Test] public void Can_Deserialize_Names_With_Underscores_With_Default_Root() { - var doc = this.CreateJsonWithUnderscores(); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var p = d.Deserialize(response); + string doc = CreateJsonWithUnderscores(); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = doc }; + PersonForJson p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -514,10 +511,10 @@ public void Can_Deserialize_Names_With_Underscores_With_Default_Root_Alternative [Test] public void Can_Deserialize_Names_With_Dashes_With_Default_Root() { - var doc = this.CreateJsonWithDashes(); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var p = d.Deserialize(response); + string doc = CreateJsonWithDashes(); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = doc }; + PersonForJson p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); //Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1, DateTimeKind.Utc), p.StartDate); @@ -549,10 +546,10 @@ public void Can_Deserialize_Names_With_Dashes_With_Default_Root_Alternative_Cult [Test] public void Ignore_Protected_Property_That_Exists_In_Data() { - var doc = this.CreateJson(); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var p = d.Deserialize(response); + string doc = CreateJson(); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = doc }; + PersonForJson p = d.Deserialize(response); Assert.Null(p.IgnoreProxy); } @@ -560,10 +557,10 @@ public void Ignore_Protected_Property_That_Exists_In_Data() [Test] public void Ignore_ReadOnly_Property_That_Exists_In_Data() { - var doc = this.CreateJson(); - var response = new RestResponse { Content = doc }; - var d = new JsonDeserializer(); - var p = d.Deserialize(response); + string doc = CreateJson(); + RestResponse response = new RestResponse { Content = doc }; + JsonDeserializer d = new JsonDeserializer(); + PersonForJson p = d.Deserialize(response); Assert.Null(p.ReadOnlyProxy); } @@ -571,7 +568,7 @@ public void Ignore_ReadOnly_Property_That_Exists_In_Data() [Test] public void Can_Deserialize_TimeSpan() { - var payload = this.GetPayLoad("timespans.txt"); + TimeSpanTestStructure payload = GetPayLoad("timespans.txt"); Assert.AreEqual(new TimeSpan(468006), payload.Tick); Assert.AreEqual(new TimeSpan(0, 0, 0, 0, 125), payload.Millisecond); @@ -594,10 +591,10 @@ public void Can_Deserialize_TimeSpan() [Test] public void Can_Deserialize_Iso_Json_Dates() { - var doc = this.CreateIsoDateJson(); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var bd = d.Deserialize(response); + string doc = CreateIsoDateJson(); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = doc }; + Birthdate bd = d.Deserialize(response); Assert.AreEqual(new DateTime(1910, 9, 25, 9, 30, 25, DateTimeKind.Utc), bd.Value); } @@ -605,10 +602,10 @@ public void Can_Deserialize_Iso_Json_Dates() [Test] public void Can_Deserialize_Unix_Json_Dates() { - var doc = this.CreateUnixDateJson(); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var bd = d.Deserialize(response); + string doc = CreateUnixDateJson(); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = doc }; + Birthdate bd = d.Deserialize(response); Assert.AreEqual(new DateTime(2011, 6, 30, 8, 15, 46, DateTimeKind.Utc), bd.Value); } @@ -616,7 +613,7 @@ public void Can_Deserialize_Unix_Json_Dates() [Test] public void Can_Deserialize_JsonNet_Dates() { - var person = this.GetPayLoad("person.json.txt"); + PersonForJson person = GetPayLoad("person.json.txt"); Assert.AreEqual( new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc), @@ -626,7 +623,7 @@ public void Can_Deserialize_JsonNet_Dates() [Test] public void Can_Deserialize_DateTime() { - var payload = this.GetPayLoad("datetimes.txt"); + DateTimeTestStructure payload = GetPayLoad("datetimes.txt"); Assert.AreEqual( new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc), @@ -636,7 +633,7 @@ public void Can_Deserialize_DateTime() [Test] public void Can_Deserialize_Nullable_DateTime_With_Value() { - var payload = this.GetPayLoad("datetimes.txt"); + DateTimeTestStructure payload = GetPayLoad("datetimes.txt"); Assert.NotNull(payload.NullableDateTimeWithValue); Assert.AreEqual( @@ -647,7 +644,7 @@ public void Can_Deserialize_Nullable_DateTime_With_Value() [Test] public void Can_Deserialize_Nullable_DateTime_With_Null() { - var payload = this.GetPayLoad("datetimes.txt"); + DateTimeTestStructure payload = GetPayLoad("datetimes.txt"); Assert.Null(payload.NullableDateTimeWithNull); } @@ -655,7 +652,7 @@ public void Can_Deserialize_Nullable_DateTime_With_Null() [Test] public void Can_Deserialize_DateTimeOffset() { - var payload = this.GetPayLoad("datetimes.txt"); + DateTimeTestStructure payload = GetPayLoad("datetimes.txt"); Assert.AreEqual( new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc).ToString("yyyy-MM-dd HH:mm:ss.fff"), @@ -665,7 +662,7 @@ public void Can_Deserialize_DateTimeOffset() [Test] public void Can_Deserialize_Iso8601DateTimeLocal() { - var payload = this.GetPayLoad("iso8601datetimes.txt"); + Iso8601DateTimeTestStructure payload = GetPayLoad("iso8601datetimes.txt"); Assert.AreEqual( new DateTime(2012, 7, 19, 10, 23, 25, DateTimeKind.Utc), @@ -675,7 +672,7 @@ public void Can_Deserialize_Iso8601DateTimeLocal() [Test] public void Can_Deserialize_Iso8601DateTimeZulu() { - var payload = this.GetPayLoad("iso8601datetimes.txt"); + Iso8601DateTimeTestStructure payload = GetPayLoad("iso8601datetimes.txt"); Assert.AreEqual( new DateTime(2012, 7, 19, 10, 23, 25, 544, DateTimeKind.Utc), @@ -685,7 +682,7 @@ public void Can_Deserialize_Iso8601DateTimeZulu() [Test] public void Can_Deserialize_Iso8601DateTimeWithOffset() { - var payload = this.GetPayLoad("iso8601datetimes.txt"); + Iso8601DateTimeTestStructure payload = GetPayLoad("iso8601datetimes.txt"); Assert.AreEqual( new DateTime(2012, 7, 19, 10, 23, 25, 544, DateTimeKind.Utc), @@ -695,7 +692,7 @@ public void Can_Deserialize_Iso8601DateTimeWithOffset() [Test] public void Can_Deserialize_Nullable_DateTimeOffset_With_Value() { - var payload = this.GetPayLoad("datetimes.txt"); + DateTimeTestStructure payload = GetPayLoad("datetimes.txt"); Assert.NotNull(payload.NullableDateTimeOffsetWithValue); Assert.AreEqual( @@ -706,7 +703,7 @@ public void Can_Deserialize_Nullable_DateTimeOffset_With_Value() [Test] public void Can_Deserialize_Nullable_DateTimeOffset_With_Null() { - var payload = this.GetPayLoad("datetimes.txt"); + DateTimeTestStructure payload = GetPayLoad("datetimes.txt"); Assert.Null(payload.NullableDateTimeOffsetWithNull); } @@ -714,10 +711,10 @@ public void Can_Deserialize_Nullable_DateTimeOffset_With_Null() [Test] public void Can_Deserialize_To_Dictionary_String_String() { - var doc = this.CreateJsonStringDictionary(); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var bd = d.Deserialize>(response); + string doc = this.CreateJsonStringDictionary(); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = doc }; + Dictionary bd = d.Deserialize>(response); Assert.AreEqual(bd["Thing1"], "Thing1"); Assert.AreEqual(bd["Thing2"], "Thing2"); @@ -728,10 +725,10 @@ public void Can_Deserialize_To_Dictionary_String_String() [Test] public void Can_Deserialize_To_Dictionary_String_String_With_Dynamic_Values() { - var doc = this.CreateDynamicJsonStringDictionary(); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var bd = d.Deserialize>(response); + string doc = this.CreateDynamicJsonStringDictionary(); + JsonDeserializer d = new JsonDeserializer(); + RestResponse response = new RestResponse { Content = doc }; + Dictionary bd = d.Deserialize>(response); Assert.AreEqual("[\"Value1\",\"Value2\"]", bd["Thing1"]); Assert.AreEqual("Thing2", bd["Thing2"]); @@ -743,9 +740,9 @@ public void Can_Deserialize_To_Dictionary_String_String_With_Dynamic_Values() public void Can_Deserialize_Decimal_With_Four_Zeros_After_Floating_Point() { const string json = "{\"Value\":0.00005557}"; - var response = new RestResponse { Content = json }; - var d = new JsonDeserializer(); - var result = d.Deserialize(response); + RestResponse response = new RestResponse { Content = json }; + JsonDeserializer d = new JsonDeserializer(); + DecimalNumber result = d.Deserialize(response); Assert.AreEqual(result.Value, .00005557m); } @@ -753,7 +750,7 @@ public void Can_Deserialize_Decimal_With_Four_Zeros_After_Floating_Point() [Test] public void Can_Deserialize_Object_Type_Property_With_Primitive_Vale() { - var payload = this.GetPayLoad("objectproperty.txt"); + ObjectProperties payload = GetPayLoad("objectproperty.txt"); Assert.AreEqual(42L, payload.ObjectProperty); } @@ -761,19 +758,19 @@ public void Can_Deserialize_Object_Type_Property_With_Primitive_Vale() [Test] public void Can_Deserialize_Dictionary_of_Lists() { - var doc = File.ReadAllText(Path.Combine("SampleData", "jsondictionary.txt")); - var json = new JsonDeserializer { RootElement = "response" }; + string doc = File.ReadAllText(Path.Combine("SampleData", "jsondictionary.txt")); + JsonDeserializer json = new JsonDeserializer { RootElement = "response" }; - var output = json.Deserialize(new RestResponse { Content = doc }); + EmployeeTracker output = json.Deserialize(new RestResponse { Content = doc }); Assert.IsNotEmpty(output.EmployeesMail); Assert.IsNotEmpty(output.EmployeesTime); Assert.IsNotEmpty(output.EmployeesPay); } - private string CreateJsonWithUnderscores() + private static string CreateJsonWithUnderscores() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["name"] = "John Sheehan"; doc["start_date"] = new DateTime(2009, 9, 25, 0, 6, 1, DateTimeKind.Utc); @@ -786,38 +783,38 @@ private string CreateJsonWithUnderscores() doc["url"] = "http://example.com"; doc["url_path"] = "/foo/bar"; doc["best_friend"] = new JsonObject - { - {"name", "The Fonz"}, - {"since", 1952} - }; + { + { "name", "The Fonz" }, + { "since", 1952 } + }; - var friendsArray = new JsonArray(); + JsonArray friendsArray = new JsonArray(); for (int i = 0; i < 10; i++) { friendsArray.Add(new JsonObject - { - {"name", "Friend" + i}, - {"since", DateTime.Now.Year - i} - }); + { + { "name", "Friend" + i }, + { "since", DateTime.Now.Year - i } + }); } doc["friends"] = friendsArray; - var foesArray = new JsonObject - { - {"dict1", new JsonObject {{"nickname", "Foe 1"}}}, - {"dict2", new JsonObject {{"nickname", "Foe 2"}}} - }; + JsonObject foesArray = new JsonObject + { + { "dict1", new JsonObject { { "nickname", "Foe 1" } } }, + { "dict2", new JsonObject { { "nickname", "Foe 2" } } } + }; doc["foes"] = foesArray; return doc.ToString(); } - private string CreateJsonWithDashes() + private static string CreateJsonWithDashes() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["name"] = "John Sheehan"; doc["start-date"] = new DateTime(2009, 9, 25, 0, 6, 1, DateTimeKind.Utc); @@ -829,59 +826,55 @@ private string CreateJsonWithDashes() doc["read-only"] = "dummy"; doc["url"] = "http://example.com"; doc["url-path"] = "/foo/bar"; - doc["best-friend"] = new JsonObject - { - {"name", "The Fonz"}, - {"since", 1952} - }; + { + { "name", "The Fonz" }, + { "since", 1952 } + }; - var friendsArray = new JsonArray(); + JsonArray friendsArray = new JsonArray(); for (int i = 0; i < 10; i++) { friendsArray.Add(new JsonObject - { - {"name", "Friend" + i}, - {"since", DateTime.Now.Year - i} - }); + { + { "name", "Friend" + i }, + { "since", DateTime.Now.Year - i } + }); } doc["friends"] = friendsArray; - var foesArray = new JsonObject - { - {"dict1", new JsonObject {{"nickname", "Foe 1"}}}, - {"dict2", new JsonObject {{"nickname", "Foe 2"}}} - }; + JsonObject foesArray = new JsonObject + { + { "dict1", new JsonObject { { "nickname", "Foe 1" } } }, + { "dict2", new JsonObject { { "nickname", "Foe 2" } } } + }; doc["foes"] = foesArray; return doc.ToString(); } - private string CreateIsoDateJson() + private static string CreateIsoDateJson() { - var bd = new Birthdate - { - Value = new DateTime(1910, 9, 25, 9, 30, 25, DateTimeKind.Utc) - }; + Birthdate bd = new Birthdate { Value = new DateTime(1910, 9, 25, 9, 30, 25, DateTimeKind.Utc) }; return SimpleJson.SerializeObject(bd); } - private string CreateUnixDateJson() + private static string CreateUnixDateJson() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["Value"] = 1309421746; return doc.ToString(); } - private string CreateJson() + private static string CreateJson() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["Name"] = "John Sheehan"; doc["StartDate"] = new DateTime(2009, 9, 25, 0, 6, 1, DateTimeKind.Utc); @@ -898,38 +891,38 @@ private string CreateJson() doc["Guid"] = new Guid(GUID_STRING).ToString(); doc["EmptyGuid"] = ""; doc["BestFriend"] = new JsonObject - { - {"Name", "The Fonz"}, - {"Since", 1952} - }; + { + { "Name", "The Fonz" }, + { "Since", 1952 } + }; - var friendsArray = new JsonArray(); + JsonArray friendsArray = new JsonArray(); for (int i = 0; i < 10; i++) { friendsArray.Add(new JsonObject - { - {"Name", "Friend" + i}, - {"Since", DateTime.Now.Year - i} - }); + { + { "Name", "Friend" + i }, + { "Since", DateTime.Now.Year - i } + }); } doc["Friends"] = friendsArray; - var foesArray = new JsonObject - { - {"dict1", new JsonObject {{"Nickname", "Foe 1"}}}, - {"dict2", new JsonObject {{"Nickname", "Foe 2"}}} - }; + JsonObject foesArray = new JsonObject + { + { "dict1", new JsonObject { { "Nickname", "Foe 1" } } }, + {"dict2", new JsonObject { { "Nickname", "Foe 2" } } } + }; doc["Foes"] = foesArray; return doc.ToString(); } - private string CreateJsonWithNullValues() + private static string CreateJsonWithNullValues() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["Id"] = null; doc["StartDate"] = null; @@ -938,9 +931,9 @@ private string CreateJsonWithNullValues() return doc.ToString(); } - private string CreateJsonWithEmptyValues() + private static string CreateJsonWithEmptyValues() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["Id"] = ""; doc["StartDate"] = ""; @@ -949,9 +942,9 @@ private string CreateJsonWithEmptyValues() return doc.ToString(); } - private string CreateJsonWithoutEmptyValues() + private static string CreateJsonWithoutEmptyValues() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["Id"] = 123; doc["StartDate"] = new DateTime(2010, 2, 21, 9, 35, 00, DateTimeKind.Utc); @@ -962,7 +955,7 @@ private string CreateJsonWithoutEmptyValues() public string CreateJsonStringDictionary() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["Thing1"] = "Thing1"; doc["Thing2"] = "Thing2"; @@ -974,7 +967,7 @@ public string CreateJsonStringDictionary() public string CreateDynamicJsonStringDictionary() { - var doc = new JsonObject(); + JsonObject doc = new JsonObject(); doc["Thing1"] = new JsonArray { "Value1", "Value2" }; doc["Thing2"] = "Thing2"; @@ -984,11 +977,11 @@ public string CreateDynamicJsonStringDictionary() return doc.ToString(); } - private T GetPayLoad(string fileName) + private static T GetPayLoad(string fileName) { - var doc = File.ReadAllText(Path.Combine("SampleData", fileName)); - var response = new RestResponse { Content = doc }; - var d = new JsonDeserializer(); + string doc = File.ReadAllText(Path.Combine("SampleData", fileName)); + RestResponse response = new RestResponse { Content = doc }; + JsonDeserializer d = new JsonDeserializer(); return d.Deserialize(response); } diff --git a/RestSharp.Tests/JwtAuthTests.cs b/RestSharp.Tests/JwtAuthTests.cs index d5f803d69..705a556c6 100644 --- a/RestSharp.Tests/JwtAuthTests.cs +++ b/RestSharp.Tests/JwtAuthTests.cs @@ -1,7 +1,10 @@ using System; +using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Threading; using NUnit.Framework; +using RestSharp.Authenticators; namespace RestSharp.Tests { @@ -13,21 +16,21 @@ public class JwtAuthTests public JwtAuthTests() { - System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; - System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.InstalledUICulture; + Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; + Thread.CurrentThread.CurrentUICulture = CultureInfo.InstalledUICulture; this.testJwt = "eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9" + "." + "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQo" + "gImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ" + "." + "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"; - this.expectedAuthHeaderContent = String.Format("Bearer {0}", this.testJwt); + this.expectedAuthHeaderContent = string.Format("Bearer {0}", this.testJwt); } [Test] public void Throw_Argument_Null_Exception() { - var exception = Assert.Throws(() => new JwtAuthenticator(null)); + ArgumentNullException exception = Assert.Throws(() => new JwtAuthenticator(null)); Assert.AreEqual("accessToken", exception.ParamName); } @@ -35,13 +38,13 @@ public void Throw_Argument_Null_Exception() [Test] public void Can_Set_ValidFormat_Auth_Header() { - var client = new RestClient { Authenticator = new JwtAuthenticator(this.testJwt) }; - var request = new RestRequest(); + RestClient client = new RestClient { Authenticator = new JwtAuthenticator(this.testJwt) }; + RestRequest request = new RestRequest(); //In real case client.Execute(request) will invoke Authenticate method client.Authenticator.Authenticate(client, request); - var authParam = request.Parameters.Single(p => p.Name.Equals("Authorization", StringComparison.OrdinalIgnoreCase)); + Parameter authParam = request.Parameters.Single(p => p.Name.Equals("Authorization", StringComparison.OrdinalIgnoreCase)); Assert.True(authParam.Type == ParameterType.HttpHeader); Assert.AreEqual(this.expectedAuthHeaderContent, authParam.Value); @@ -50,8 +53,8 @@ public void Can_Set_ValidFormat_Auth_Header() [Test] public void Check_Only_Header_Authorization() { - var client = new RestClient { Authenticator = new JwtAuthenticator(this.testJwt) }; - var request = new RestRequest(); + RestClient client = new RestClient { Authenticator = new JwtAuthenticator(this.testJwt) }; + RestRequest request = new RestRequest(); //Paranoic server needs "two-factor authentication": jwt header and query param key for example request.AddParameter("Authorization", "manualAuth", ParameterType.QueryString); @@ -59,12 +62,12 @@ public void Check_Only_Header_Authorization() //In real case client.Execute(request) will invoke Authenticate method client.Authenticator.Authenticate(client, request); - var paramList = request.Parameters.FindAll(p => p.Name.Equals("Authorization")); + List paramList = request.Parameters.FindAll(p => p.Name.Equals("Authorization")); Assert.AreEqual(2, paramList.Count); - var queryAuthParam = paramList.Single(p => p.Type.Equals(ParameterType.QueryString)); - var headerAuthParam = paramList.Single(p => p.Type.Equals(ParameterType.HttpHeader)); + Parameter queryAuthParam = paramList.Single(p => p.Type.Equals(ParameterType.QueryString)); + Parameter headerAuthParam = paramList.Single(p => p.Type.Equals(ParameterType.HttpHeader)); Assert.AreEqual("manualAuth", queryAuthParam.Value); Assert.AreEqual(this.expectedAuthHeaderContent, headerAuthParam.Value); @@ -73,8 +76,8 @@ public void Check_Only_Header_Authorization() [Test] public void Set_Auth_Header_Only_Once() { - var client = new RestClient(); - var request = new RestRequest(); + RestClient client = new RestClient(); + RestRequest request = new RestRequest(); request.AddHeader("Authorization", this.expectedAuthHeaderContent); @@ -83,11 +86,11 @@ public void Set_Auth_Header_Only_Once() //In real case client.Execute(...) will invoke Authenticate method client.Authenticator.Authenticate(client, request); - var paramList = request.Parameters.FindAll(p => p.Name.Equals("Authorization")); + List paramList = request.Parameters.FindAll(p => p.Name.Equals("Authorization")); Assert.AreEqual(1, paramList.Count); - var authParam = paramList[0]; + Parameter authParam = paramList[0]; Assert.True(authParam.Type == ParameterType.HttpHeader); Assert.AreEqual(this.expectedAuthHeaderContent, authParam.Value); diff --git a/RestSharp.Tests/NamespacedXmlTests.cs b/RestSharp.Tests/NamespacedXmlTests.cs index 66eb1baff..8284ae227 100644 --- a/RestSharp.Tests/NamespacedXmlTests.cs +++ b/RestSharp.Tests/NamespacedXmlTests.cs @@ -19,6 +19,7 @@ using System.Xml.Linq; using NUnit.Framework; using RestSharp.Deserializers; +using RestSharp.Tests.SampleClasses; using RestSharp.Tests.SampleClasses.Lastfm; namespace RestSharp.Tests @@ -31,10 +32,10 @@ public class NamespacedXmlTests [Test] public void Can_Deserialize_Elements_With_Namespace() { - var doc = CreateElementsXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer { Namespace = "http://restsharp.org" }; - var p = d.Deserialize(response); + string doc = CreateElementsXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer { Namespace = "http://restsharp.org" }; + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -55,10 +56,10 @@ public void Can_Deserialize_Elements_With_Namespace() [Test] public void Can_Deserialize_Elements_With_Namespace_Autodetect_Namespace() { - var doc = CreateElementsXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer(); - var p = d.Deserialize(response); + string doc = CreateElementsXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -79,10 +80,10 @@ public void Can_Deserialize_Elements_With_Namespace_Autodetect_Namespace() [Test] public void Can_Deserialize_Attributes_With_Namespace() { - var doc = CreateAttributesXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer { Namespace = "http://restsharp.org" }; - var p = d.Deserialize(response); + string doc = CreateAttributesXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer { Namespace = "http://restsharp.org" }; + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -101,10 +102,10 @@ public void Can_Deserialize_Attributes_With_Namespace() [Test] public void Ignore_Protected_Property_That_Exists_In_Data() { - var doc = CreateElementsXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer { Namespace = "http://restsharp.org" }; - var p = d.Deserialize(response); + string doc = CreateElementsXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer { Namespace = "http://restsharp.org" }; + PersonForXml p = d.Deserialize(response); Assert.Null(p.IgnoreProxy); } @@ -112,10 +113,10 @@ public void Ignore_Protected_Property_That_Exists_In_Data() [Test] public void Ignore_ReadOnly_Property_That_Exists_In_Data() { - var doc = CreateElementsXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer { Namespace = "http://restsharp.org" }; - var p = d.Deserialize(response); + string doc = CreateElementsXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer { Namespace = "http://restsharp.org" }; + PersonForXml p = d.Deserialize(response); Assert.Null(p.ReadOnlyProxy); } @@ -123,10 +124,10 @@ public void Ignore_ReadOnly_Property_That_Exists_In_Data() [Test] public void Can_Deserialize_Names_With_Underscores_With_Namespace() { - var doc = CreateUnderscoresXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer { Namespace = "http://restsharp.org" }; - var p = d.Deserialize(response); + string doc = CreateUnderscoresXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer { Namespace = "http://restsharp.org" }; + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -150,10 +151,10 @@ public void Can_Deserialize_Names_With_Underscores_With_Namespace() [Test] public void Can_Deserialize_List_Of_Primitives_With_Namespace() { - var doc = CreateListOfPrimitivesXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer { Namespace = "http://restsharp.org" }; - var a = d.Deserialize>(response); + string doc = CreateListOfPrimitivesXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer { Namespace = "http://restsharp.org" }; + List a = d.Deserialize>(response); Assert.AreEqual(2, a.Count); Assert.AreEqual("first", a[0].Value); @@ -162,9 +163,9 @@ public void Can_Deserialize_List_Of_Primitives_With_Namespace() private static string CreateListOfPrimitivesXml() { - var doc = new XDocument(); - var ns = XNamespace.Get("http://restsharp.org"); - var root = new XElement(ns + "artists"); + XDocument doc = new XDocument(); + XNamespace ns = XNamespace.Get("http://restsharp.org"); + XElement root = new XElement(ns + "artists"); root.Add(new XElement(ns + "artist", "first")); root.Add(new XElement(ns + "artist", "second")); @@ -175,9 +176,9 @@ private static string CreateListOfPrimitivesXml() private static string CreateUnderscoresXml() { - var doc = new XDocument(); - var ns = XNamespace.Get("http://restsharp.org"); - var root = new XElement(ns + "Person"); + XDocument doc = new XDocument(); + XNamespace ns = XNamespace.Get("http://restsharp.org"); + XElement root = new XElement(ns + "Person"); root.Add(new XElement(ns + "Name", "John Sheehan")); root.Add(new XElement(ns + "Start_Date", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -194,7 +195,7 @@ private static string CreateUnderscoresXml() new XElement(ns + "Name", "The Fonz"), new XAttribute(ns + "Since", 1952))); - var friends = new XElement(ns + "Friends"); + XElement friends = new XElement(ns + "Friends"); for (int i = 0; i < 10; i++) { @@ -205,7 +206,7 @@ private static string CreateUnderscoresXml() root.Add(friends); - var foes = new XElement(ns + "Foes"); + XElement foes = new XElement(ns + "Foes"); foes.Add(new XAttribute(ns + "Team", "Yankees")); @@ -222,9 +223,9 @@ private static string CreateUnderscoresXml() private static string CreateElementsXml() { - var doc = new XDocument(); - var ns = XNamespace.Get("http://restsharp.org"); - var root = new XElement(ns + "Person"); + XDocument doc = new XDocument(); + XNamespace ns = XNamespace.Get("http://restsharp.org"); + XElement root = new XElement(ns + "Person"); root.Add(new XElement(ns + "Name", "John Sheehan")); root.Add(new XElement(ns + "StartDate", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -241,7 +242,7 @@ private static string CreateElementsXml() new XElement(ns + "Name", "The Fonz"), new XElement(ns + "Since", 1952))); - var friends = new XElement(ns + "Friends"); + XElement friends = new XElement(ns + "Friends"); for (int i = 0; i < 10; i++) { @@ -255,14 +256,15 @@ private static string CreateElementsXml() new XElement(ns + "Name", "Goldfinger"))); doc.Add(root); + return doc.ToString(); } private static string CreateAttributesXml() { - var doc = new XDocument(); - var ns = XNamespace.Get("http://restsharp.org"); - var root = new XElement(ns + "Person"); + XDocument doc = new XDocument(); + XNamespace ns = XNamespace.Get("http://restsharp.org"); + XElement root = new XElement(ns + "Person"); root.Add(new XAttribute(ns + "Name", "John Sheehan")); root.Add(new XAttribute(ns + "StartDate", new DateTime(2009, 9, 25, 0, 6, 1))); diff --git a/RestSharp.Tests/NuSpecUpdateTask.cs b/RestSharp.Tests/NuSpecUpdateTask.cs index 61aaebe35..ff1841df1 100644 --- a/RestSharp.Tests/NuSpecUpdateTask.cs +++ b/RestSharp.Tests/NuSpecUpdateTask.cs @@ -34,7 +34,8 @@ public class WhenSpecFileNotSpecified [Test] public void ReturnsFalse() { - var task = new Build.NuSpecUpdateTask(); + Build.NuSpecUpdateTask task = new Build.NuSpecUpdateTask(); + Assert.False(task.Execute()); } } @@ -47,7 +48,7 @@ protected override void Setup() { } [Test] public void PullsVersionAttributeInstead() { - var task = new Build.NuSpecUpdateTask + Build.NuSpecUpdateTask task = new Build.NuSpecUpdateTask { SpecFile = FileName, SourceAssemblyFile = "RestSharp.Tests.dll" @@ -115,7 +116,7 @@ public void PullsAuthorsFromAssemblyInfo() [Test] public void UpdatesSpecFile() { - var doc = XDocument.Load(ComputedFileName); + XDocument doc = XDocument.Load(ComputedFileName); Assert.AreEqual(EXPECTED_ID, doc.Descendants("id").First().Value); Assert.AreEqual(EXPECTED_DESCRIPTION, doc.Descendants("description").First().Value); diff --git a/RestSharp.Tests/OAuthTests.cs b/RestSharp.Tests/OAuthTests.cs index d64f27f29..1b3595fea 100644 --- a/RestSharp.Tests/OAuthTests.cs +++ b/RestSharp.Tests/OAuthTests.cs @@ -28,7 +28,8 @@ public OAuthTests() [TestCase("\x00\x01\a\b\f\n\r\t\v", @"%00%01%07%08%0C%0A%0D%09%0B")] public void UrlStrictEncode_Encodes_Correctly(string value, string expected) { - var actual = OAuthTools.UrlEncodeStrict(value); + string actual = OAuthTools.UrlEncodeStrict(value); + Assert.AreEqual(expected, actual); } @@ -38,7 +39,8 @@ public void UrlStrictEncode_Encodes_Correctly(string value, string expected) [TestCase("\r\n\t", "%0D%0A%09")] public void PercentEncode_Encodes_Correctly(string value, string expected) { - var actual = value.PercentEncode(); + string actual = value.PercentEncode(); + Assert.AreEqual(expected, actual); } } diff --git a/RestSharp.Tests/RestRequestTests.cs b/RestSharp.Tests/RestRequestTests.cs index 71eff1182..bce7489f3 100644 --- a/RestSharp.Tests/RestRequestTests.cs +++ b/RestSharp.Tests/RestRequestTests.cs @@ -16,15 +16,16 @@ public RestRequestTests() [Test] public void Can_Add_Object_With_IntegerArray_property() { - var request = new RestRequest(); + RestRequest request = new RestRequest(); + request.AddObject(new { Items = new [] { 2, 3, 4 } }); } [Test] public void Cannot_Set_Empty_Host_Header() { - var request = new RestRequest(); - var exception = Assert.Throws(() => request.AddHeader("Host", string.Empty)); + RestRequest request = new RestRequest(); + ArgumentException exception = Assert.Throws(() => request.AddHeader("Host", string.Empty)); Assert.AreEqual("value", exception.ParamName); } @@ -45,8 +46,8 @@ public void Cannot_Set_Empty_Host_Header() [TestCase("foo:bar:baz")] public void Cannot_Set_Invalid_Host_Header(string value) { - var request = new RestRequest(); - var exception = Assert.Throws(() => request.AddHeader("Host", value)); + RestRequest request = new RestRequest(); + ArgumentException exception = Assert.Throws(() => request.AddHeader("Host", value)); Assert.AreEqual("value", exception.ParamName); } @@ -66,7 +67,7 @@ public void Cannot_Set_Invalid_Host_Header(string value) [TestCase("multi--hyphens")] public void Can_Set_Valid_Host_Header(string value) { - var request = new RestRequest(); + RestRequest request = new RestRequest(); Assert.DoesNotThrow(() => request.AddHeader("Host", value)); } diff --git a/RestSharp.Tests/SampleClasses/EmployeeTracker.cs b/RestSharp.Tests/SampleClasses/EmployeeTracker.cs index 84fcf7e19..17abe5434 100644 --- a/RestSharp.Tests/SampleClasses/EmployeeTracker.cs +++ b/RestSharp.Tests/SampleClasses/EmployeeTracker.cs @@ -9,26 +9,26 @@ public class EmployeeTracker /// Key: Employee name. /// Value: Messages sent to employee. /// - public Dictionary> EmployeesMail { get; set; } + public Dictionary> EmployeesMail { get; set; } /// /// Key: Employee name. /// Value: Hours worked this each week. /// - public Dictionary>> EmployeesTime { get; set; } + public Dictionary>> EmployeesTime { get; set; } /// /// Key: Employee name. /// Value: Payments made to employee /// - public Dictionary> EmployeesPay { get; set; } + public Dictionary> EmployeesPay { get; set; } } public class Payment { public PaymentType Type { get; set; } - public Int32 Amount { get; set; } + public int Amount { get; set; } } public enum PaymentType diff --git a/RestSharp.Tests/SampleClasses/EnumTest.cs b/RestSharp.Tests/SampleClasses/EnumTest.cs index b3d821f71..fca070ca4 100644 --- a/RestSharp.Tests/SampleClasses/EnumTest.cs +++ b/RestSharp.Tests/SampleClasses/EnumTest.cs @@ -24,7 +24,7 @@ public enum UShortEnum : ushort EnumMax = 65535 } - public enum IntEnum : int + public enum IntEnum { EnumMin = -2147483648, EnumMax = 2147483647 diff --git a/RestSharp.Tests/SampleClasses/Goodreads.cs b/RestSharp.Tests/SampleClasses/Goodreads.cs index 796a4ad6c..7f0109d0a 100644 --- a/RestSharp.Tests/SampleClasses/Goodreads.cs +++ b/RestSharp.Tests/SampleClasses/Goodreads.cs @@ -5,14 +5,18 @@ namespace RestSharp.Tests.SampleClasses public class GoodReadsReviewCollection { public int Start { get; set; } + public int End { get; set; } + public int Total { get; set; } + public List Reviews { get; set; } } public class GoodReadsReview { public string Id { get; set; } + public GoodReadsBook Book { get; set; } } diff --git a/RestSharp.Tests/SampleClasses/misc.cs b/RestSharp.Tests/SampleClasses/misc.cs index e90cfe626..a78905fe9 100644 --- a/RestSharp.Tests/SampleClasses/misc.cs +++ b/RestSharp.Tests/SampleClasses/misc.cs @@ -18,7 +18,7 @@ using System.Collections.Generic; using RestSharp.Serializers; -namespace RestSharp.Tests +namespace RestSharp.Tests.SampleClasses { public class PersonForXml { @@ -40,11 +40,11 @@ public class PersonForXml protected string Ignore { get; set; } - public string IgnoreProxy { get { return Ignore; } } + public string IgnoreProxy { get { return this.Ignore; } } protected string ReadOnly { get { return null; } } - public string ReadOnlyProxy { get { return ReadOnly; } } + public string ReadOnlyProxy { get { return this.ReadOnly; } } public FoeList Foes { get; set; } @@ -102,11 +102,11 @@ public class PersonForJson protected string Ignore { get; set; } - public string IgnoreProxy { get { return Ignore; } } + public string IgnoreProxy { get { return this.Ignore; } } protected string ReadOnly { get { return null; } } - public string ReadOnlyProxy { get { return ReadOnly; } } + public string ReadOnlyProxy { get { return this.ReadOnly; } } public Dictionary Foes { get; set; } diff --git a/RestSharp.Tests/SampleClasses/nullables.cs b/RestSharp.Tests/SampleClasses/nullables.cs index 4a42de607..4865a56d9 100644 --- a/RestSharp.Tests/SampleClasses/nullables.cs +++ b/RestSharp.Tests/SampleClasses/nullables.cs @@ -1,6 +1,6 @@ using System; -namespace RestSharp.Tests +namespace RestSharp.Tests.SampleClasses { public class NullableValues { diff --git a/RestSharp.Tests/SerializerTests.cs b/RestSharp.Tests/SerializerTests.cs index ac5cfcae9..e72aa05b7 100644 --- a/RestSharp.Tests/SerializerTests.cs +++ b/RestSharp.Tests/SerializerTests.cs @@ -21,6 +21,7 @@ using System.Xml.Linq; using NUnit.Framework; using RestSharp.Serializers; +using RestSharp.Tests.SampleClasses; namespace RestSharp.Tests { @@ -36,16 +37,15 @@ public SerializerTests() [Test] public void Serializes_Properties_In_Specified_Order() { - var ordered = new OrderedProperties - { - Name = "Name", - Age = 99, - StartDate = new DateTime(2010, 1, 1) - }; - - var xml = new XmlSerializer(); - var doc = xml.Serialize(ordered); - var expected = GetSortedPropsXDoc(); + OrderedProperties ordered = new OrderedProperties + { + Name = "Name", + Age = 99, + StartDate = new DateTime(2010, 1, 1) + }; + XmlSerializer xml = new XmlSerializer(); + string doc = xml.Serialize(ordered); + XDocument expected = GetSortedPropsXDoc(); Assert.AreEqual(expected.ToString(), doc); } @@ -53,22 +53,22 @@ public void Serializes_Properties_In_Specified_Order() [Test] public void Can_serialize_simple_POCO() { - var poco = new Person - { - Name = "Foo", - Age = 50, - Price = 19.95m, - StartDate = new DateTime(2009, 12, 18, 10, 2, 23), - Items = new List - { - new Item { Name = "One", Value = 1 }, - new Item { Name = "Two", Value = 2 }, - new Item { Name = "Three", Value = 3 } - } - }; - var xml = new XmlSerializer(); - var doc = xml.Serialize(poco); - var expected = GetSimplePocoXDoc(); + Person poco = new Person + { + Name = "Foo", + Age = 50, + Price = 19.95m, + StartDate = new DateTime(2009, 12, 18, 10, 2, 23), + Items = new List + { + new Item { Name = "One", Value = 1 }, + new Item { Name = "Two", Value = 2 }, + new Item { Name = "Three", Value = 3 } + } + }; + XmlSerializer xml = new XmlSerializer(); + string doc = xml.Serialize(poco); + XDocument expected = GetSimplePocoXDoc(); Assert.AreEqual(expected.ToString(), doc); } @@ -76,11 +76,11 @@ public void Can_serialize_simple_POCO() [Test] public void Can_serialize_Enum() { - var enumClass = new ClassWithEnum { Color = Color.Red }; - var xml = new XmlSerializer(); - var doc = xml.Serialize(enumClass); - var expected = new XDocument(); - var root = new XElement("ClassWithEnum"); + ClassWithEnum enumClass = new ClassWithEnum { Color = Color.Red }; + XmlSerializer xml = new XmlSerializer(); + string doc = xml.Serialize(enumClass); + XDocument expected = new XDocument(); + XElement root = new XElement("ClassWithEnum"); root.Add(new XElement("Color", "Red")); expected.Add(root); @@ -91,16 +91,16 @@ public void Can_serialize_Enum() [Test] public void Can_serialize_simple_POCO_With_DateFormat_Specified() { - var poco = new Person - { - Name = "Foo", - Age = 50, - Price = 19.95m, - StartDate = new DateTime(2009, 12, 18, 10, 2, 23) - }; - var xml = new XmlSerializer { DateFormat = DateFormat.Iso8601 }; - var doc = xml.Serialize(poco); - var expected = GetSimplePocoXDocWithIsoDate(); + Person poco = new Person + { + Name = "Foo", + Age = 50, + Price = 19.95m, + StartDate = new DateTime(2009, 12, 18, 10, 2, 23) + }; + XmlSerializer xml = new XmlSerializer { DateFormat = DateFormat.ISO_8601 }; + string doc = xml.Serialize(poco); + XDocument expected = GetSimplePocoXDocWithIsoDate(); Assert.AreEqual(expected.ToString(), doc); } @@ -108,17 +108,17 @@ public void Can_serialize_simple_POCO_With_DateFormat_Specified() [Test] public void Can_serialize_simple_POCO_With_XmlFormat_Specified() { - var poco = new Person - { - Name = "Foo", - Age = 50, - Price = 19.95m, - StartDate = new DateTime(2009, 12, 18, 10, 2, 23), - IsCool = false - }; - var xml = new XmlSerializer { DateFormat = DateFormat.Iso8601 }; - var doc = xml.Serialize(poco); - var expected = GetSimplePocoXDocWithXmlProperty(); + Person poco = new Person + { + Name = "Foo", + Age = 50, + Price = 19.95m, + StartDate = new DateTime(2009, 12, 18, 10, 2, 23), + IsCool = false + }; + XmlSerializer xml = new XmlSerializer { DateFormat = DateFormat.ISO_8601 }; + string doc = xml.Serialize(poco); + XDocument expected = GetSimplePocoXDocWithXmlProperty(); Assert.AreEqual(expected.ToString(), doc); } @@ -126,16 +126,16 @@ public void Can_serialize_simple_POCO_With_XmlFormat_Specified() [Test] public void Can_serialize_simple_POCO_With_Different_Root_Element() { - var poco = new Person - { - Name = "Foo", - Age = 50, - Price = 19.95m, - StartDate = new DateTime(2009, 12, 18, 10, 2, 23) - }; - var xml = new XmlSerializer {RootElement = "Result"}; - var doc = xml.Serialize(poco); - var expected = GetSimplePocoXDocWithRoot(); + Person poco = new Person + { + Name = "Foo", + Age = 50, + Price = 19.95m, + StartDate = new DateTime(2009, 12, 18, 10, 2, 23) + }; + XmlSerializer xml = new XmlSerializer {RootElement = "Result"}; + string doc = xml.Serialize(poco); + XDocument expected = GetSimplePocoXDocWithRoot(); Assert.AreEqual(expected.ToString(), doc); } @@ -143,16 +143,16 @@ public void Can_serialize_simple_POCO_With_Different_Root_Element() [Test] public void Can_serialize_simple_POCO_With_Attribute_Options_Defined() { - var poco = new WackyPerson - { - Name = "Foo", - Age = 50, - Price = 19.95m, - StartDate = new DateTime(2009, 12, 18, 10, 2, 23) - }; - var xml = new XmlSerializer(); - var doc = xml.Serialize(poco); - var expected = GetSimplePocoXDocWackyNames(); + WackyPerson poco = new WackyPerson + { + Name = "Foo", + Age = 50, + Price = 19.95m, + StartDate = new DateTime(2009, 12, 18, 10, 2, 23) + }; + XmlSerializer xml = new XmlSerializer(); + string doc = xml.Serialize(poco); + XDocument expected = GetSimplePocoXDocWackyNames(); Assert.AreEqual(expected.ToString(), doc); } @@ -160,27 +160,27 @@ public void Can_serialize_simple_POCO_With_Attribute_Options_Defined() [Test] public void Can_serialize_simple_POCO_With_Attribute_Options_Defined_And_Property_Containing_IList_Elements() { - var poco = new WackyPerson - { - Name = "Foo", - Age = 50, - Price = 19.95m, - StartDate = new DateTime(2009, 12, 18, 10, 2, 23), - ContactData = new ContactData - { - EmailAddresses = new List - { - new EmailAddress - { - Address = "test@test.com", - Location = "Work" - } - } - } - }; - var xml = new XmlSerializer(); - var doc = xml.Serialize(poco); - var expected = GetSimplePocoXDocWackyNamesWithIListProperty(); + WackyPerson poco = new WackyPerson + { + Name = "Foo", + Age = 50, + Price = 19.95m, + StartDate = new DateTime(2009, 12, 18, 10, 2, 23), + ContactData = new ContactData + { + EmailAddresses = new List + { + new EmailAddress + { + Address = "test@test.com", + Location = "Work" + } + } + } + }; + XmlSerializer xml = new XmlSerializer(); + string doc = xml.Serialize(poco); + XDocument expected = GetSimplePocoXDocWackyNamesWithIListProperty(); Assert.AreEqual(expected.ToString(), doc); } @@ -188,38 +188,38 @@ public void Can_serialize_simple_POCO_With_Attribute_Options_Defined_And_Propert [Test] public void Can_serialize_a_list_which_is_the_root_element() { - var pocoList = new PersonList - { - new Person - { - Name = "Foo", - Age = 50, - Price = 19.95m, - StartDate = new DateTime(2009, 12, 18, 10, 2, 23), - Items = new List - { - new Item { Name = "One", Value = 1 }, - new Item { Name = "Two", Value = 2 }, - new Item { Name = "Three", Value = 3 } - } - }, - new Person - { - Name = "Bar", - Age = 23, - Price = 23.23m, - StartDate = new DateTime(2009, 12, 23, 10, 23, 23), - Items = new List - { - new Item { Name = "One", Value = 1 }, - new Item { Name = "Two", Value = 2 }, - new Item { Name = "Three", Value = 3 } - } - } - }; - var xml = new XmlSerializer(); - var doc = xml.Serialize(pocoList); - var expected = GetPeopleXDoc(CultureInfo.InvariantCulture); + PersonList pocoList = new PersonList + { + new Person + { + Name = "Foo", + Age = 50, + Price = 19.95m, + StartDate = new DateTime(2009, 12, 18, 10, 2, 23), + Items = new List + { + new Item { Name = "One", Value = 1 }, + new Item { Name = "Two", Value = 2 }, + new Item { Name = "Three", Value = 3 } + } + }, + new Person + { + Name = "Bar", + Age = 23, + Price = 23.23m, + StartDate = new DateTime(2009, 12, 23, 10, 23, 23), + Items = new List + { + new Item { Name = "One", Value = 1 }, + new Item { Name = "Two", Value = 2 }, + new Item { Name = "Three", Value = 3 } + } + } + }; + XmlSerializer xml = new XmlSerializer(); + string doc = xml.Serialize(pocoList); + XDocument expected = GetPeopleXDoc(CultureInfo.InvariantCulture); Assert.AreEqual(expected.ToString(), doc); } @@ -302,15 +302,15 @@ private class EmailAddress private static XDocument GetSimplePocoXDoc() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("Name", "Foo"), new XElement("Age", 50), new XElement("Price", 19.95m), new XElement("StartDate", new DateTime(2009, 12, 18, 10, 2, 23).ToString(CultureInfo.InvariantCulture))); - var items = new XElement("Items"); + XElement items = new XElement("Items"); items.Add(new XElement("Item", new XElement("Name", "One"), new XElement("Value", 1))); items.Add(new XElement("Item", new XElement("Name", "Two"), new XElement("Value", 2))); @@ -324,8 +324,8 @@ private static XDocument GetSimplePocoXDoc() private static XDocument GetSimplePocoXDocWithIsoDate() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("Name", "Foo"), new XElement("Age", 50), @@ -339,8 +339,8 @@ private static XDocument GetSimplePocoXDocWithIsoDate() private static XDocument GetSimplePocoXDocWithXmlProperty() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("Name", "Foo"), new XElement("Age", 50), @@ -355,9 +355,9 @@ private static XDocument GetSimplePocoXDocWithXmlProperty() private static XDocument GetSimplePocoXDocWithRoot() { - var doc = new XDocument(); - var root = new XElement("Result"); - var start = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Result"); + XElement start = new XElement("Person"); start.Add(new XElement("Name", "Foo"), new XElement("Age", 50), @@ -372,8 +372,8 @@ private static XDocument GetSimplePocoXDocWithRoot() private static XDocument GetSimplePocoXDocWackyNames() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XAttribute("WackyName", "Foo"), new XElement("Age", 50), @@ -387,8 +387,8 @@ private static XDocument GetSimplePocoXDocWackyNames() private static XDocument GetSimplePocoXDocWackyNamesWithIListProperty() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XAttribute("WackyName", "Foo"), new XElement("Age", 50), @@ -408,8 +408,8 @@ private static XDocument GetSimplePocoXDocWackyNamesWithIListProperty() private static XDocument GetSortedPropsXDoc() { - var doc = new XDocument(); - var root = new XElement("OrderedProperties"); + XDocument doc = new XDocument(); + XElement root = new XElement("OrderedProperties"); root.Add(new XElement("StartDate", new DateTime(2010, 1, 1).ToString(CultureInfo.InvariantCulture))); root.Add(new XElement("Name", "Name")); @@ -422,10 +422,10 @@ private static XDocument GetSortedPropsXDoc() private static XDocument GetPeopleXDoc(IFormatProvider culture) { - var doc = new XDocument(); - var root = new XElement("People"); - var element = new XElement("Person"); - var items = new XElement("Items"); + XDocument doc = new XDocument(); + XElement root = new XElement("People"); + XElement element = new XElement("Person"); + XElement items = new XElement("Items"); items.Add(new XElement("Item", new XElement("Name", "One"), new XElement("Value", 1))); items.Add(new XElement("Item", new XElement("Name", "Two"), new XElement("Value", 2))); diff --git a/RestSharp.Tests/UrlBuilderTests.cs b/RestSharp.Tests/UrlBuilderTests.cs index 063bea48f..9be921c28 100644 --- a/RestSharp.Tests/UrlBuilderTests.cs +++ b/RestSharp.Tests/UrlBuilderTests.cs @@ -12,13 +12,13 @@ public class UrlBuilderTests [Test] public void Should_not_duplicate_question_mark() { - var request = new RestRequest(); + RestRequest request = new RestRequest(); request.AddParameter("param2", "value2"); - var client = new RestClient("http://example.com/resource?param1=value1"); - var expected = new Uri("http://example.com/resource?param1=value1¶m2=value2"); - var output = client.BuildUri(request); + RestClient client = new RestClient("http://example.com/resource?param1=value1"); + Uri expected = new Uri("http://example.com/resource?param1=value1¶m2=value2"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -26,10 +26,10 @@ public void Should_not_duplicate_question_mark() [Test] public void GET_with_leading_slash() { - var request = new RestRequest("/resource"); - var client = new RestClient(new Uri("http://example.com")); - var expected = new Uri("http://example.com/resource"); - var output = client.BuildUri(request); + RestRequest request = new RestRequest("/resource"); + RestClient client = new RestClient(new Uri("http://example.com")); + Uri expected = new Uri("http://example.com/resource"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -37,10 +37,10 @@ public void GET_with_leading_slash() [Test] public void POST_with_leading_slash() { - var request = new RestRequest("/resource", Method.POST); - var client = new RestClient(new Uri("http://example.com")); - var expected = new Uri("http://example.com/resource"); - var output = client.BuildUri(request); + RestRequest request = new RestRequest("/resource", Method.POST); + RestClient client = new RestClient(new Uri("http://example.com")); + Uri expected = new Uri("http://example.com/resource"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -48,13 +48,13 @@ public void POST_with_leading_slash() [Test] public void GET_with_leading_slash_and_baseurl_trailing_slash() { - var request = new RestRequest("/resource"); + RestRequest request = new RestRequest("/resource"); request.AddParameter("foo", "bar"); - var client = new RestClient(new Uri("http://example.com")); - var expected = new Uri("http://example.com/resource?foo=bar"); - var output = client.BuildUri(request); + RestClient client = new RestClient(new Uri("http://example.com")); + Uri expected = new Uri("http://example.com/resource?foo=bar"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -62,13 +62,13 @@ public void GET_with_leading_slash_and_baseurl_trailing_slash() [Test] public void GET_wth_trailing_slash_and_query_parameters() { - var request = new RestRequest("/resource/"); - var client = new RestClient("http://example.com"); + RestRequest request = new RestRequest("/resource/"); + RestClient client = new RestClient("http://example.com"); request.AddParameter("foo", "bar"); - var expected = new Uri("http://example.com/resource/?foo=bar"); - var output = client.BuildUri(request); + Uri expected = new Uri("http://example.com/resource/?foo=bar"); + Uri output = client.BuildUri(request); client.Execute(request); @@ -78,10 +78,10 @@ public void GET_wth_trailing_slash_and_query_parameters() [Test] public void POST_with_leading_slash_and_baseurl_trailing_slash() { - var request = new RestRequest("/resource", Method.POST); - var client = new RestClient(new Uri("http://example.com")); - var expected = new Uri("http://example.com/resource"); - var output = client.BuildUri(request); + RestRequest request = new RestRequest("/resource", Method.POST); + RestClient client = new RestClient(new Uri("http://example.com")); + Uri expected = new Uri("http://example.com/resource"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -89,10 +89,10 @@ public void POST_with_leading_slash_and_baseurl_trailing_slash() [Test] public void GET_with_resource_containing_slashes() { - var request = new RestRequest("resource/foo"); - var client = new RestClient(new Uri("http://example.com")); - var expected = new Uri("http://example.com/resource/foo"); - var output = client.BuildUri(request); + RestRequest request = new RestRequest("resource/foo"); + RestClient client = new RestClient(new Uri("http://example.com")); + Uri expected = new Uri("http://example.com/resource/foo"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -100,10 +100,10 @@ public void GET_with_resource_containing_slashes() [Test] public void POST_with_resource_containing_slashes() { - var request = new RestRequest("resource/foo", Method.POST); - var client = new RestClient(new Uri("http://example.com")); - var expected = new Uri("http://example.com/resource/foo"); - var output = client.BuildUri(request); + RestRequest request = new RestRequest("resource/foo", Method.POST); + RestClient client = new RestClient(new Uri("http://example.com")); + Uri expected = new Uri("http://example.com/resource/foo"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -111,13 +111,13 @@ public void POST_with_resource_containing_slashes() [Test] public void GET_with_resource_containing_tokens() { - var request = new RestRequest("resource/{foo}"); + RestRequest request = new RestRequest("resource/{foo}"); request.AddUrlSegment("foo", "bar"); - var client = new RestClient(new Uri("http://example.com")); - var expected = new Uri("http://example.com/resource/bar"); - var output = client.BuildUri(request); + RestClient client = new RestClient(new Uri("http://example.com")); + Uri expected = new Uri("http://example.com/resource/bar"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -125,12 +125,12 @@ public void GET_with_resource_containing_tokens() [Test] public void GET_with_resource_containing_null_token() { - var request = new RestRequest("/resource/{foo}", Method.GET); + RestRequest request = new RestRequest("/resource/{foo}", Method.GET); request.AddUrlSegment("foo", null); - var client = new RestClient("http://example.com/api/1.0"); - var exception = Assert.Throws(() => client.BuildUri(request)); + RestClient client = new RestClient("http://example.com/api/1.0"); + ArgumentException exception = Assert.Throws(() => client.BuildUri(request)); Assert.IsNotNull(exception); Assert.IsNotNullOrEmpty(exception.Message); @@ -140,13 +140,13 @@ public void GET_with_resource_containing_null_token() [Test] public void POST_with_resource_containing_tokens() { - var request = new RestRequest("resource/{foo}", Method.POST); + RestRequest request = new RestRequest("resource/{foo}", Method.POST); request.AddUrlSegment("foo", "bar"); - var client = new RestClient(new Uri("http://example.com")); - var expected = new Uri("http://example.com/resource/bar"); - var output = client.BuildUri(request); + RestClient client = new RestClient(new Uri("http://example.com")); + Uri expected = new Uri("http://example.com/resource/bar"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -154,10 +154,10 @@ public void POST_with_resource_containing_tokens() [Test] public void GET_with_empty_request() { - var request = new RestRequest(); - var client = new RestClient(new Uri("http://example.com")); - var expected = new Uri("http://example.com/"); - var output = client.BuildUri(request); + RestRequest request = new RestRequest(); + RestClient client = new RestClient(new Uri("http://example.com")); + Uri expected = new Uri("http://example.com/"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -165,10 +165,10 @@ public void GET_with_empty_request() [Test] public void GET_with_empty_request_and_bare_hostname() { - var request = new RestRequest(); - var client = new RestClient(new Uri("http://example.com")); - var expected = new Uri("http://example.com/"); - var output = client.BuildUri(request); + RestRequest request = new RestRequest(); + RestClient client = new RestClient(new Uri("http://example.com")); + Uri expected = new Uri("http://example.com/"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -176,13 +176,13 @@ public void GET_with_empty_request_and_bare_hostname() [Test] public void POST_with_querystring_containing_tokens() { - var request = new RestRequest("resource", Method.POST); + RestRequest request = new RestRequest("resource", Method.POST); request.AddParameter("foo", "bar", ParameterType.QueryString); - var client = new RestClient("http://example.com"); - var expected = new Uri("http://example.com/resource?foo=bar"); - var output = client.BuildUri(request); + RestClient client = new RestClient("http://example.com"); + Uri expected = new Uri("http://example.com/resource?foo=bar"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -190,16 +190,16 @@ public void POST_with_querystring_containing_tokens() [Test] public void GET_with_multiple_instances_of_same_key() { - var request = new RestRequest("v1/people/~/network/updates", Method.GET); + RestRequest request = new RestRequest("v1/people/~/network/updates", Method.GET); request.AddParameter("type", "STAT"); request.AddParameter("type", "PICT"); request.AddParameter("count", "50"); request.AddParameter("start", "50"); - var client = new RestClient("http://api.linkedin.com"); - var expected = new Uri("http://api.linkedin.com/v1/people/~/network/updates?type=STAT&type=PICT&count=50&start=50"); - var output = client.BuildUri(request); + RestClient client = new RestClient("http://api.linkedin.com"); + Uri expected = new Uri("http://api.linkedin.com/v1/people/~/network/updates?type=STAT&type=PICT&count=50&start=50"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -207,13 +207,13 @@ public void GET_with_multiple_instances_of_same_key() [Test] public void GET_with_Uri_containing_tokens() { - var request = new RestRequest(); + RestRequest request = new RestRequest(); request.AddUrlSegment("foo", "bar"); - var client = new RestClient(new Uri("http://example.com/{foo}")); - var expected = new Uri("http://example.com/bar"); - var output = client.BuildUri(request); + RestClient client = new RestClient(new Uri("http://example.com/{foo}")); + Uri expected = new Uri("http://example.com/bar"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -221,13 +221,13 @@ public void GET_with_Uri_containing_tokens() [Test] public void GET_with_Url_string_containing_tokens() { - var request = new RestRequest(); + RestRequest request = new RestRequest(); request.AddUrlSegment("foo", "bar"); - var client = new RestClient("http://example.com/{foo}"); - var expected = new Uri("http://example.com/bar"); - var output = client.BuildUri(request); + RestClient client = new RestClient("http://example.com/{foo}"); + Uri expected = new Uri("http://example.com/bar"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -235,14 +235,14 @@ public void GET_with_Url_string_containing_tokens() [Test] public void GET_with_Uri_and_resource_containing_tokens() { - var request = new RestRequest("resource/{baz}"); + RestRequest request = new RestRequest("resource/{baz}"); request.AddUrlSegment("foo", "bar"); request.AddUrlSegment("baz", "bat"); - var client = new RestClient(new Uri("http://example.com/{foo}")); - var expected = new Uri("http://example.com/bar/resource/bat"); - var output = client.BuildUri(request); + RestClient client = new RestClient(new Uri("http://example.com/{foo}")); + Uri expected = new Uri("http://example.com/bar/resource/bat"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } @@ -250,14 +250,14 @@ public void GET_with_Uri_and_resource_containing_tokens() [Test] public void GET_with_Url_string_and_resource_containing_tokens() { - var request = new RestRequest("resource/{baz}"); + RestRequest request = new RestRequest("resource/{baz}"); request.AddUrlSegment("foo", "bar"); request.AddUrlSegment("baz", "bat"); - var client = new RestClient("http://example.com/{foo}"); - var expected = new Uri("http://example.com/bar/resource/bat"); - var output = client.BuildUri(request); + RestClient client = new RestClient("http://example.com/{foo}"); + Uri expected = new Uri("http://example.com/bar/resource/bat"); + Uri output = client.BuildUri(request); Assert.AreEqual(expected, output); } diff --git a/RestSharp.Tests/XmlAttributeDeserializerTests.cs b/RestSharp.Tests/XmlAttributeDeserializerTests.cs index 90c2dd587..02b14360b 100644 --- a/RestSharp.Tests/XmlAttributeDeserializerTests.cs +++ b/RestSharp.Tests/XmlAttributeDeserializerTests.cs @@ -23,6 +23,7 @@ using NUnit.Framework; using RestSharp.Deserializers; using RestSharp.Tests.SampleClasses; +using Event = RestSharp.Tests.SampleClasses.Lastfm.Event; namespace RestSharp.Tests { @@ -39,10 +40,10 @@ private string PathFor(string sampleFile) [Test] public void Can_Deserialize_Lists_of_Simple_Types() { - var xmlpath = this.PathFor("xmllists.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("xmllists.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + SimpleTypesListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.Names); Assert.IsNotEmpty(output.Numbers); @@ -53,10 +54,10 @@ public void Can_Deserialize_Lists_of_Simple_Types() [Test] public void Can_Deserialize_To_List_Inheritor_From_Custom_Root_With_Attributes() { - var xmlpath = this.PathFor("ListWithAttributes.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlAttributeDeserializer { RootElement = "Calls" }; - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("ListWithAttributes.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer { RootElement = "Calls" }; + TwilioCallList output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.AreEqual(3, output.NumPages); Assert.IsNotEmpty(output); @@ -66,10 +67,10 @@ public void Can_Deserialize_To_List_Inheritor_From_Custom_Root_With_Attributes() [Test] public void Can_Deserialize_To_Standalone_List_Without_Matching_Class_Case() { - var xmlpath = this.PathFor("InlineListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("InlineListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + List output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output); Assert.AreEqual(4, output.Count); @@ -78,10 +79,10 @@ public void Can_Deserialize_To_Standalone_List_Without_Matching_Class_Case() [Test] public void Can_Deserialize_To_Standalone_List_With_Matching_Class_Case() { - var xmlpath = this.PathFor("InlineListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("InlineListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + List output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output); Assert.AreEqual(4, output.Count); @@ -90,10 +91,10 @@ public void Can_Deserialize_To_Standalone_List_With_Matching_Class_Case() [Test] public void Can_Deserialize_Directly_To_Lists_Off_Root_Element() { - var xmlpath = this.PathFor("directlists.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("directlists.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + List output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output); Assert.AreEqual(2, output.Count); @@ -102,10 +103,10 @@ public void Can_Deserialize_Directly_To_Lists_Off_Root_Element() [Test] public void Can_Deserialize_Parentless_aka_Inline_List_Items_Without_Matching_Class_Name() { - var xmlpath = this.PathFor("InlineListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("InlineListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + InlineListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.Images); Assert.AreEqual(4, output.Images.Count); @@ -114,10 +115,10 @@ public void Can_Deserialize_Parentless_aka_Inline_List_Items_Without_Matching_Cl [Test] public void Can_Deserialize_Parentless_aka_Inline_List_Items_With_Matching_Class_Name() { - var xmlpath = this.PathFor("InlineListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("InlineListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + InlineListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.images); Assert.AreEqual(4, output.images.Count); @@ -126,10 +127,10 @@ public void Can_Deserialize_Parentless_aka_Inline_List_Items_With_Matching_Class [Test] public void Can_Deserialize_Parentless_aka_Inline_List_Items_With_Matching_Class_Name_With_Additional_Property() { - var xmlpath = this.PathFor("InlineListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("InlineListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + InlineListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.AreEqual(4, output.Count); } @@ -137,10 +138,10 @@ public void Can_Deserialize_Parentless_aka_Inline_List_Items_With_Matching_Class [Test] public void Can_Deserialize_Nested_List_Items_Without_Matching_Class_Name() { - var xmlpath = this.PathFor("NestedListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("NestedListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + InlineListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.Images); Assert.AreEqual(4, output.Images.Count); @@ -149,10 +150,10 @@ public void Can_Deserialize_Nested_List_Items_Without_Matching_Class_Name() [Test] public void Can_Deserialize_Nested_List_Items_With_Matching_Class_Name() { - var xmlpath = this.PathFor("NestedListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("NestedListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + InlineListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.images); Assert.AreEqual(4, output.images.Count); @@ -161,9 +162,9 @@ public void Can_Deserialize_Nested_List_Items_With_Matching_Class_Name() [Test] public void Can_Deserialize_Nested_List_Without_Elements_To_Empty_List() { - var doc = CreateXmlWithEmptyNestedList(); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc }); + string doc = CreateXmlWithEmptyNestedList(); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + EmptyListSample output = xml.Deserialize(new RestResponse { Content = doc }); Assert.NotNull(output.images); Assert.NotNull(output.Images); @@ -174,9 +175,9 @@ public void Can_Deserialize_Nested_List_Without_Elements_To_Empty_List() [Test] public void Can_Deserialize_Inline_List_Without_Elements_To_Empty_List() { - var doc = CreateXmlWithEmptyInlineList(); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc }); + string doc = CreateXmlWithEmptyInlineList(); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + EmptyListSample output = xml.Deserialize(new RestResponse { Content = doc }); Assert.NotNull(output.images); Assert.NotNull(output.Images); @@ -187,9 +188,9 @@ public void Can_Deserialize_Inline_List_Without_Elements_To_Empty_List() [Test] public void Can_Deserialize_Empty_Elements_to_Nullable_Values() { - var doc = CreateXmlWithNullValues(); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc }); + string doc = CreateXmlWithNullValues(); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + NullableValues output = xml.Deserialize(new RestResponse { Content = doc }); Assert.Null(output.Id); Assert.Null(output.StartDate); @@ -199,10 +200,10 @@ public void Can_Deserialize_Empty_Elements_to_Nullable_Values() [Test] public void Can_Deserialize_Elements_to_Nullable_Values() { - var culture = CultureInfo.InvariantCulture; - var doc = CreateXmlWithoutEmptyValues(culture); - var xml = new XmlAttributeDeserializer { Culture = culture }; - var output = xml.Deserialize(new RestResponse { Content = doc }); + CultureInfo culture = CultureInfo.InvariantCulture; + string doc = CreateXmlWithoutEmptyValues(culture); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer { Culture = culture }; + NullableValues output = xml.Deserialize(new RestResponse { Content = doc }); Assert.NotNull(output.Id); Assert.NotNull(output.StartDate); @@ -215,13 +216,13 @@ public void Can_Deserialize_Elements_to_Nullable_Values() [Test] public void Can_Deserialize_TimeSpan() { - var culture = CultureInfo.InvariantCulture; - var doc = new XDocument(culture); + CultureInfo culture = CultureInfo.InvariantCulture; + XDocument doc = new XDocument(culture); TimeSpan? nullTimespan = null; TimeSpan? nullValueTimeSpan = new TimeSpan(21, 30, 7); - var root = new XElement("Person"); + XElement root = new XElement("Person"); root.Add(new XElement("Tick", new TimeSpan(468006))); root.Add(new XElement("Millisecond", new TimeSpan(0, 0, 0, 0, 125))); @@ -233,9 +234,9 @@ public void Can_Deserialize_TimeSpan() doc.Add(root); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlAttributeDeserializer { Culture = culture }; - var payload = d.Deserialize(response); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer { Culture = culture }; + TimeSpanTestStructure payload = d.Deserialize(response); Assert.AreEqual(new TimeSpan(468006), payload.Tick); Assert.AreEqual(new TimeSpan(0, 0, 0, 0, 125), payload.Millisecond); @@ -250,33 +251,29 @@ public void Can_Deserialize_TimeSpan() [Test] public void Can_Deserialize_Custom_Formatted_Date() { - var culture = CultureInfo.InvariantCulture; - var format = "dd yyyy MMM, hh:mm ss tt zzz"; - var date = new DateTime(2010, 2, 8, 11, 11, 11); - var doc = new XDocument(); - var root = new XElement("Person"); + CultureInfo culture = CultureInfo.InvariantCulture; + const string format = "dd yyyy MMM, hh:mm ss tt zzz"; + DateTime date = new DateTime(2010, 2, 8, 11, 11, 11); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("StartDate", date.ToString(format, culture))); doc.Add(root); - var xml = new XmlAttributeDeserializer - { - DateFormat = format, - Culture = culture - }; - var response = new RestResponse { Content = doc.ToString() }; - var output = xml.Deserialize(response); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer { DateFormat = format, Culture = culture }; + RestResponse response = new RestResponse { Content = doc.ToString() }; + PersonForXml output = xml.Deserialize(response); Assert.AreEqual(date, output.StartDate); } [Test] public void Can_Deserialize_Nested_Class() { - var doc = CreateElementsXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlAttributeDeserializer(); - var p = d.Deserialize(response); + string doc = CreateElementsXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.NotNull(p.FavoriteBand); Assert.AreEqual("Goldfinger", p.FavoriteBand.Name); @@ -284,10 +281,10 @@ public void Can_Deserialize_Nested_Class() [Test] public void Can_Deserialize_Elements_On_Default_Root() { - var doc = CreateElementsXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlAttributeDeserializer(); - var p = d.Deserialize(response); + string doc = CreateElementsXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -311,10 +308,10 @@ public void Can_Deserialize_Elements_On_Default_Root() [Test] public void Can_Deserialize_Attributes_On_Default_Root() { - var doc = CreateAttributesXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlAttributeDeserializer(); - var p = d.Deserialize(response); + string doc = CreateAttributesXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -333,10 +330,10 @@ public void Can_Deserialize_Attributes_On_Default_Root() [Test] public void Ignore_Protected_Property_That_Exists_In_Data() { - var doc = CreateElementsXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlAttributeDeserializer(); - var p = d.Deserialize(response); + string doc = CreateElementsXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.Null(p.IgnoreProxy); } @@ -344,10 +341,10 @@ public void Ignore_Protected_Property_That_Exists_In_Data() [Test] public void Ignore_ReadOnly_Property_That_Exists_In_Data() { - var doc = CreateElementsXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlAttributeDeserializer(); - var p = d.Deserialize(response); + string doc = CreateElementsXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.Null(p.ReadOnlyProxy); } @@ -355,10 +352,10 @@ public void Ignore_ReadOnly_Property_That_Exists_In_Data() [Test] public void Can_Deserialize_Names_With_Underscores_On_Default_Root() { - var doc = CreateUnderscoresXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlAttributeDeserializer(); - var p = d.Deserialize(response); + string doc = CreateUnderscoresXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -382,10 +379,10 @@ public void Can_Deserialize_Names_With_Underscores_On_Default_Root() [Test] public void Can_Deserialize_Names_With_Dashes_On_Default_Root() { - var doc = CreateDashesXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlAttributeDeserializer(); - var p = d.Deserialize(response); + string doc = CreateDashesXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -409,10 +406,10 @@ public void Can_Deserialize_Names_With_Dashes_On_Default_Root() [Test] public void Can_Deserialize_Names_With_Underscores_Without_Matching_Case_On_Default_Root() { - var doc = CreateLowercaseUnderscoresXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlAttributeDeserializer(); - var p = d.Deserialize(response); + string doc = CreateLowercaseUnderscoresXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -436,10 +433,10 @@ public void Can_Deserialize_Names_With_Underscores_Without_Matching_Case_On_Defa [Test] public void Can_Deserialize_Lower_Cased_Root_Elements_With_Dashes() { - var doc = CreateDashesXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlAttributeDeserializer(); - var p = d.Deserialize(response); + string doc = CreateDashesXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -463,10 +460,10 @@ public void Can_Deserialize_Lower_Cased_Root_Elements_With_Dashes() [Test] public void Can_Deserialize_Root_Elements_Without_Matching_Case_And_Dashes() { - var doc = CreateLowerCasedRootElementWithDashesXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlAttributeDeserializer(); - var p = d.Deserialize>(response); + string doc = CreateLowerCasedRootElementWithDashesXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + List p = d.Deserialize>(response); Assert.NotNull(p); Assert.AreEqual(1, p.Count); @@ -477,11 +474,11 @@ public void Can_Deserialize_Root_Elements_Without_Matching_Case_And_Dashes() [Test] public void Can_Deserialize_Eventful_Xml() { - var xmlpath = this.PathFor("eventful.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlAttributeDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("eventful.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + VenueSearch output = d.Deserialize(response); Assert.IsNotEmpty(output.venues); Assert.AreEqual(3, output.venues.Count); @@ -493,11 +490,11 @@ public void Can_Deserialize_Eventful_Xml() [Test] public void Can_Deserialize_Lastfm_Xml() { - var xmlpath = this.PathFor("Lastfm.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlAttributeDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("Lastfm.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + Event output = d.Deserialize(response); //Assert.IsNotEmpty(output.artists); Assert.AreEqual("http://www.last.fm/event/328799+Philip+Glass+at+Barbican+Centre+on+12+June+2008", output.url); @@ -507,11 +504,11 @@ public void Can_Deserialize_Lastfm_Xml() [Test] public void Can_Deserialize_Google_Weather_Xml() { - var xmlpath = this.PathFor("GoogleWeather.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlAttributeDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("GoogleWeather.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + xml_api_reply output = d.Deserialize(response); Assert.IsNotEmpty(output.weather); Assert.AreEqual(4, output.weather.Count); @@ -521,11 +518,11 @@ public void Can_Deserialize_Google_Weather_Xml() [Test] public void Can_Deserialize_Google_Weather_Xml_WithDeserializeAs() { - var xmlpath = this.PathFor("GoogleWeather.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlAttributeDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("GoogleWeather.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + GoogleWeatherApi output = d.Deserialize(response); Assert.IsNotEmpty(output.Weather); Assert.AreEqual(4, output.Weather.Count); @@ -535,11 +532,11 @@ public void Can_Deserialize_Google_Weather_Xml_WithDeserializeAs() [Test] public void Can_Deserialize_Boolean_From_Number() { - var xmlpath = this.PathFor("boolean_from_number.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlAttributeDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("boolean_from_number.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + BooleanTest output = d.Deserialize(response); Assert.True(output.Value); } @@ -547,11 +544,11 @@ public void Can_Deserialize_Boolean_From_Number() [Test] public void Can_Deserialize_Boolean_From_String() { - var xmlpath = this.PathFor("boolean_from_string.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlAttributeDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("boolean_from_string.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer(); + BooleanTest output = d.Deserialize(response); Assert.True(output.Value); } @@ -559,9 +556,9 @@ public void Can_Deserialize_Boolean_From_String() [Test] public void Can_Deserialize_Empty_Elements_With_Attributes_to_Nullable_Values() { - var doc = CreateXmlWithAttributesAndNullValues(); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc }); + string doc = CreateXmlWithAttributesAndNullValues(); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + NullableValues output = xml.Deserialize(new RestResponse { Content = doc }); Assert.Null(output.Id); Assert.Null(output.StartDate); @@ -571,9 +568,9 @@ public void Can_Deserialize_Empty_Elements_With_Attributes_to_Nullable_Values() [Test] public void Can_Deserialize_Mixture_Of_Empty_Elements_With_Attributes_And_Populated_Elements() { - var doc = CreateXmlWithAttributesAndNullValuesAndPopulatedValues(); - var xml = new XmlAttributeDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc }); + string doc = CreateXmlWithAttributesAndNullValuesAndPopulatedValues(); + XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); + NullableValues output = xml.Deserialize(new RestResponse { Content = doc }); Assert.Null(output.Id); Assert.Null(output.StartDate); @@ -583,13 +580,13 @@ public void Can_Deserialize_Mixture_Of_Empty_Elements_With_Attributes_And_Popula [Test] public void Can_Deserialize_DateTimeOffset() { - var culture = CultureInfo.InvariantCulture; - var doc = new XDocument(culture); + CultureInfo culture = CultureInfo.InvariantCulture; + XDocument doc = new XDocument(culture); DateTimeOffset dateTimeOffset = new DateTimeOffset(2013, 02, 08, 9, 18, 22, TimeSpan.FromHours(10)); DateTimeOffset? nullableDateTimeOffsetWithValue = new DateTimeOffset(2013, 02, 08, 9, 18, 23, TimeSpan.FromHours(10)); - var root = new XElement("Dates"); + XElement root = new XElement("Dates"); root.Add(new XElement("DateTimeOffset", dateTimeOffset)); root.Add(new XElement("NullableDateTimeOffsetWithNull", string.Empty)); @@ -598,9 +595,9 @@ public void Can_Deserialize_DateTimeOffset() doc.Add(root); //var xml = new XmlAttributeDeserializer { Culture = culture }; - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlAttributeDeserializer { Culture = culture }; - var payload = d.Deserialize(response); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlAttributeDeserializer d = new XmlAttributeDeserializer { Culture = culture }; + DateTimeTestStructure payload = d.Deserialize(response); Assert.AreEqual(dateTimeOffset, payload.DateTimeOffset); Assert.Null(payload.NullableDateTimeOffsetWithNull); @@ -610,8 +607,8 @@ public void Can_Deserialize_DateTimeOffset() private static string CreateUnderscoresXml() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("Name", "John Sheehan")); root.Add(new XElement("Start_Date", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -628,7 +625,7 @@ private static string CreateUnderscoresXml() new XElement("Name", "The Fonz"), new XAttribute("Since", 1952))); - var friends = new XElement("Friends"); + XElement friends = new XElement("Friends"); for (int i = 0; i < 10; i++) { @@ -639,7 +636,7 @@ private static string CreateUnderscoresXml() root.Add(friends); - var foes = new XElement("Foes"); + XElement foes = new XElement("Foes"); foes.Add(new XAttribute("Team", "Yankees")); @@ -656,8 +653,8 @@ private static string CreateUnderscoresXml() private static string CreateLowercaseUnderscoresXml() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("Name", "John Sheehan")); root.Add(new XElement("start_date", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -674,7 +671,7 @@ private static string CreateLowercaseUnderscoresXml() new XElement("name", "The Fonz"), new XAttribute("Since", 1952))); - var friends = new XElement("Friends"); + XElement friends = new XElement("Friends"); for (int i = 0; i < 10; i++) { @@ -685,7 +682,7 @@ private static string CreateLowercaseUnderscoresXml() root.Add(friends); - var foes = new XElement("Foes"); + XElement foes = new XElement("Foes"); foes.Add(new XAttribute("Team", "Yankees")); @@ -702,8 +699,8 @@ private static string CreateLowercaseUnderscoresXml() private static string CreateDashesXml() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("Name", "John Sheehan")); root.Add(new XElement("Start_Date", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -720,7 +717,7 @@ private static string CreateDashesXml() new XElement("Name", "The Fonz"), new XAttribute("Since", 1952))); - var friends = new XElement("Friends"); + XElement friends = new XElement("Friends"); for (int i = 0; i < 10; i++) { @@ -731,7 +728,7 @@ private static string CreateDashesXml() root.Add(friends); - var foes = new XElement("Foes"); + XElement foes = new XElement("Foes"); foes.Add(new XAttribute("Team", "Yankees")); @@ -748,8 +745,8 @@ private static string CreateDashesXml() private static string CreateLowerCasedRootElementWithDashesXml() { - var doc = new XDocument(); - var root = new XElement("incoming-invoices", + XDocument doc = new XDocument(); + XElement root = new XElement("incoming-invoices", new XElement("incoming-invoice", new XElement("concept-id", 45))); @@ -760,8 +757,8 @@ private static string CreateLowerCasedRootElementWithDashesXml() private static string CreateElementsXml() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("Name", "John Sheehan")); root.Add(new XElement("StartDate", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -781,7 +778,7 @@ private static string CreateElementsXml() new XElement("Name", "The Fonz"), new XElement("Since", 1952))); - var friends = new XElement("Friends"); + XElement friends = new XElement("Friends"); for (int i = 0; i < 10; i++) { @@ -801,8 +798,8 @@ private static string CreateElementsXml() private static string CreateAttributesXml() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XAttribute("Name", "John Sheehan")); root.Add(new XAttribute("StartDate", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -826,8 +823,8 @@ private static string CreateAttributesXml() private static string CreateXmlWithNullValues() { - var doc = new XDocument(); - var root = new XElement("NullableValues"); + XDocument doc = new XDocument(); + XElement root = new XElement("NullableValues"); root.Add(new XElement("Id", null), new XElement("StartDate", null), @@ -840,8 +837,8 @@ private static string CreateXmlWithNullValues() private static string CreateXmlWithoutEmptyValues(CultureInfo culture) { - var doc = new XDocument(); - var root = new XElement("NullableValues"); + XDocument doc = new XDocument(); + XElement root = new XElement("NullableValues"); root.Add(new XElement("Id", 123), new XElement("StartDate", new DateTime(2010, 2, 21, 9, 35, 00).ToString(culture)), @@ -854,8 +851,8 @@ private static string CreateXmlWithoutEmptyValues(CultureInfo culture) private static string CreateXmlWithEmptyNestedList() { - var doc = new XDocument(); - var root = new XElement("EmptyListSample"); + XDocument doc = new XDocument(); + XElement root = new XElement("EmptyListSample"); root.Add(new XElement("Images")); doc.Add(root); @@ -865,8 +862,8 @@ private static string CreateXmlWithEmptyNestedList() private static string CreateXmlWithEmptyInlineList() { - var doc = new XDocument(); - var root = new XElement("EmptyListSample"); + XDocument doc = new XDocument(); + XElement root = new XElement("EmptyListSample"); doc.Add(root); @@ -875,9 +872,9 @@ private static string CreateXmlWithEmptyInlineList() private static string CreateXmlWithAttributesAndNullValues() { - var doc = new XDocument(); - var root = new XElement("NullableValues"); - var idElement = new XElement("Id", null); + XDocument doc = new XDocument(); + XElement root = new XElement("NullableValues"); + XElement idElement = new XElement("Id", null); idElement.SetAttributeValue("SomeAttribute", "SomeAttribute_Value"); root.Add(idElement, @@ -891,9 +888,9 @@ private static string CreateXmlWithAttributesAndNullValues() private static string CreateXmlWithAttributesAndNullValuesAndPopulatedValues() { - var doc = new XDocument(); - var root = new XElement("NullableValues"); - var idElement = new XElement("Id", null); + XDocument doc = new XDocument(); + XElement root = new XElement("NullableValues"); + XElement idElement = new XElement("Id", null); idElement.SetAttributeValue("SomeAttribute", "SomeAttribute_Value"); root.Add(idElement, diff --git a/RestSharp.Tests/XmlDeserializerTests.cs b/RestSharp.Tests/XmlDeserializerTests.cs index 4df10d80f..a77dc8c7b 100644 --- a/RestSharp.Tests/XmlDeserializerTests.cs +++ b/RestSharp.Tests/XmlDeserializerTests.cs @@ -23,6 +23,7 @@ using NUnit.Framework; using RestSharp.Deserializers; using RestSharp.Tests.SampleClasses; +using Event = RestSharp.Tests.SampleClasses.Lastfm.Event; namespace RestSharp.Tests { @@ -42,8 +43,8 @@ public void Can_Use_DeserializeAs_Attribute() { const string content = "1Jacksonoddball"; - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = content }); + XmlDeserializer xml = new XmlDeserializer(); + Oddball output = xml.Deserialize(new RestResponse { Content = content }); Assert.NotNull(output); Assert.AreEqual("1", output.Sid); @@ -56,7 +57,7 @@ public void Can_Use_DeserializeAs_Attribute_for_List() { const string content = "1Jacksonoddball1Jacksonevenball"; - var xml = new XmlDeserializer(); + XmlDeserializer xml = new XmlDeserializer(); List output = xml.Deserialize>(new RestResponse { Content = content }); Assert.NotNull(output); @@ -67,8 +68,8 @@ public void Can_Use_DeserializeAs_Attribute_for_List() public void Can_Deserialize_Into_Struct() { const string content = "oneOneOnetwoTwoTwo3"; - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = content }); + XmlDeserializer xml = new XmlDeserializer(); + SimpleStruct output = xml.Deserialize(new RestResponse { Content = content }); Assert.NotNull(output); Assert.AreEqual("oneOneOne", output.One); @@ -79,10 +80,10 @@ public void Can_Deserialize_Into_Struct() [Test] public void Can_Deserialize_Lists_of_Simple_Types() { - var xmlpath = this.PathFor("xmllists.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("xmllists.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlDeserializer xml = new XmlDeserializer(); + SimpleTypesListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.Names); Assert.IsNotEmpty(output.Numbers); @@ -93,10 +94,10 @@ public void Can_Deserialize_Lists_of_Simple_Types() [Test] public void Can_Deserialize_To_List_Inheritor_From_Custom_Root_With_Attributes() { - var xmlpath = this.PathFor("ListWithAttributes.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlDeserializer { RootElement = "Calls" }; - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("ListWithAttributes.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlDeserializer xml = new XmlDeserializer { RootElement = "Calls" }; + TwilioCallList output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.AreEqual(3, output.NumPages); Assert.IsNotEmpty(output); @@ -106,10 +107,10 @@ public void Can_Deserialize_To_List_Inheritor_From_Custom_Root_With_Attributes() [Test] public void Can_Deserialize_To_Standalone_List_Without_Matching_Class_Case() { - var xmlpath = this.PathFor("InlineListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlDeserializer(); - var output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("InlineListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlDeserializer xml = new XmlDeserializer(); + List output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output); Assert.AreEqual(4, output.Count); @@ -118,10 +119,10 @@ public void Can_Deserialize_To_Standalone_List_Without_Matching_Class_Case() [Test] public void Can_Deserialize_To_Standalone_List_With_Matching_Class_Case() { - var xmlpath = this.PathFor("InlineListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlDeserializer(); - var output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("InlineListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlDeserializer xml = new XmlDeserializer(); + List output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output); Assert.AreEqual(4, output.Count); @@ -130,10 +131,10 @@ public void Can_Deserialize_To_Standalone_List_With_Matching_Class_Case() [Test] public void Can_Deserialize_Directly_To_Lists_Off_Root_Element() { - var xmlpath = this.PathFor("directlists.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlDeserializer(); - var output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("directlists.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlDeserializer xml = new XmlDeserializer(); + List output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output); Assert.AreEqual(2, output.Count); @@ -142,10 +143,10 @@ public void Can_Deserialize_Directly_To_Lists_Off_Root_Element() [Test] public void Can_Deserialize_Parentless_aka_Inline_List_Items_Without_Matching_Class_Name() { - var xmlpath = this.PathFor("InlineListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("InlineListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlDeserializer xml = new XmlDeserializer(); + InlineListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.Images); Assert.AreEqual(4, output.Images.Count); @@ -154,10 +155,10 @@ public void Can_Deserialize_Parentless_aka_Inline_List_Items_Without_Matching_Cl [Test] public void Can_Deserialize_Parentless_aka_Inline_List_Items_With_Matching_Class_Name() { - var xmlpath = this.PathFor("InlineListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("InlineListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlDeserializer xml = new XmlDeserializer(); + InlineListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.images); Assert.AreEqual(4, output.images.Count); @@ -166,10 +167,10 @@ public void Can_Deserialize_Parentless_aka_Inline_List_Items_With_Matching_Class [Test] public void Can_Deserialize_Parentless_aka_Inline_List_Items_With_Matching_Class_Name_With_Additional_Property() { - var xmlpath = this.PathFor("InlineListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("InlineListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlDeserializer xml = new XmlDeserializer(); + InlineListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.AreEqual(4, output.Count); } @@ -177,10 +178,10 @@ public void Can_Deserialize_Parentless_aka_Inline_List_Items_With_Matching_Class [Test] public void Can_Deserialize_Nested_List_Items_Without_Matching_Class_Name() { - var xmlpath = this.PathFor("NestedListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("NestedListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlDeserializer xml = new XmlDeserializer(); + InlineListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.Images); Assert.AreEqual(4, output.Images.Count); @@ -190,10 +191,10 @@ public void Can_Deserialize_Nested_List_Items_Without_Matching_Class_Name() [Test] public void Can_Deserialize_Nested_List_Items_With_Matching_Class_Name() { - var xmlpath = this.PathFor("NestedListSample.xml"); - var doc = XDocument.Load(xmlpath); - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + string xmlpath = this.PathFor("NestedListSample.xml"); + XDocument doc = XDocument.Load(xmlpath); + XmlDeserializer xml = new XmlDeserializer(); + InlineListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.images); Assert.AreEqual(4, output.images.Count); @@ -202,9 +203,9 @@ public void Can_Deserialize_Nested_List_Items_With_Matching_Class_Name() [Test] public void Can_Deserialize_Nested_List_Without_Elements_To_Empty_List() { - var doc = CreateXmlWithEmptyNestedList(); - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc }); + string doc = CreateXmlWithEmptyNestedList(); + XmlDeserializer xml = new XmlDeserializer(); + EmptyListSample output = xml.Deserialize(new RestResponse { Content = doc }); Assert.NotNull(output.images); Assert.NotNull(output.Images); @@ -215,9 +216,9 @@ public void Can_Deserialize_Nested_List_Without_Elements_To_Empty_List() [Test] public void Can_Deserialize_Inline_List_Without_Elements_To_Empty_List() { - var doc = CreateXmlWithEmptyInlineList(); - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc }); + string doc = CreateXmlWithEmptyInlineList(); + XmlDeserializer xml = new XmlDeserializer(); + EmptyListSample output = xml.Deserialize(new RestResponse { Content = doc }); Assert.NotNull(output.images); Assert.NotNull(output.Images); @@ -228,9 +229,9 @@ public void Can_Deserialize_Inline_List_Without_Elements_To_Empty_List() [Test] public void Can_Deserialize_Empty_Elements_to_Nullable_Values() { - var doc = CreateXmlWithNullValues(); - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc }); + string doc = CreateXmlWithNullValues(); + XmlDeserializer xml = new XmlDeserializer(); + NullableValues output = xml.Deserialize(new RestResponse { Content = doc }); Assert.Null(output.Id); Assert.Null(output.StartDate); @@ -240,10 +241,10 @@ public void Can_Deserialize_Empty_Elements_to_Nullable_Values() [Test] public void Can_Deserialize_Elements_to_Nullable_Values() { - var culture = CultureInfo.InvariantCulture; - var doc = CreateXmlWithoutEmptyValues(culture); - var xml = new XmlDeserializer { Culture = culture }; - var output = xml.Deserialize(new RestResponse { Content = doc }); + CultureInfo culture = CultureInfo.InvariantCulture; + string doc = CreateXmlWithoutEmptyValues(culture); + XmlDeserializer xml = new XmlDeserializer { Culture = culture }; + NullableValues output = xml.Deserialize(new RestResponse { Content = doc }); Assert.NotNull(output.Id); Assert.NotNull(output.StartDate); @@ -256,11 +257,11 @@ public void Can_Deserialize_Elements_to_Nullable_Values() [Test] public void Can_Deserialize_TimeSpan() { - var culture = CultureInfo.InvariantCulture; - var doc = new XDocument(culture); + CultureInfo culture = CultureInfo.InvariantCulture; + XDocument doc = new XDocument(culture); TimeSpan? nullTimespan = null; TimeSpan? nullValueTimeSpan = new TimeSpan(21, 30, 7); - var root = new XElement("Person"); + XElement root = new XElement("Person"); root.Add(new XElement("Tick", new TimeSpan(468006))); root.Add(new XElement("Millisecond", new TimeSpan(0, 0, 0, 0, 125))); @@ -272,9 +273,9 @@ public void Can_Deserialize_TimeSpan() doc.Add(root); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlDeserializer { Culture = culture, }; - var payload = d.Deserialize(response); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlDeserializer d = new XmlDeserializer { Culture = culture, }; + TimeSpanTestStructure payload = d.Deserialize(response); Assert.AreEqual(new TimeSpan(468006), payload.Tick); Assert.AreEqual(new TimeSpan(0, 0, 0, 0, 125), payload.Millisecond); @@ -289,22 +290,22 @@ public void Can_Deserialize_TimeSpan() [Test] public void Can_Deserialize_Custom_Formatted_Date() { - var culture = CultureInfo.InvariantCulture; - var format = "dd yyyy MMM, hh:mm ss tt zzz"; - var date = new DateTime(2010, 2, 8, 11, 11, 11); - var doc = new XDocument(); - var root = new XElement("Person"); + CultureInfo culture = CultureInfo.InvariantCulture; + string format = "dd yyyy MMM, hh:mm ss tt zzz"; + DateTime date = new DateTime(2010, 2, 8, 11, 11, 11); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("StartDate", date.ToString(format, culture))); doc.Add(root); - var xml = new XmlDeserializer + XmlDeserializer xml = new XmlDeserializer { DateFormat = format, Culture = culture }; - var response = new RestResponse { Content = doc.ToString() }; - var output = xml.Deserialize(response); + RestResponse response = new RestResponse { Content = doc.ToString() }; + PersonForXml output = xml.Deserialize(response); Assert.AreEqual(date, output.StartDate); } @@ -312,10 +313,10 @@ public void Can_Deserialize_Custom_Formatted_Date() [Test] public void Can_Deserialize_Elements_On_Default_Root() { - var doc = CreateElementsXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer(); - var p = d.Deserialize(response); + string doc = CreateElementsXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -339,10 +340,10 @@ public void Can_Deserialize_Elements_On_Default_Root() [Test] public void Can_Deserialize_Attributes_On_Default_Root() { - var doc = CreateAttributesXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer(); - var p = d.Deserialize(response); + string doc = CreateAttributesXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -361,10 +362,10 @@ public void Can_Deserialize_Attributes_On_Default_Root() [Test] public void Ignore_Protected_Property_That_Exists_In_Data() { - var doc = CreateElementsXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer(); - var p = d.Deserialize(response); + string doc = CreateElementsXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.Null(p.IgnoreProxy); } @@ -372,10 +373,10 @@ public void Ignore_Protected_Property_That_Exists_In_Data() [Test] public void Ignore_ReadOnly_Property_That_Exists_In_Data() { - var doc = CreateElementsXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer(); - var p = d.Deserialize(response); + string doc = CreateElementsXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.Null(p.ReadOnlyProxy); } @@ -383,10 +384,10 @@ public void Ignore_ReadOnly_Property_That_Exists_In_Data() [Test] public void Can_Deserialize_Names_With_Underscores_On_Default_Root() { - var doc = CreateUnderscoresXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer(); - var p = d.Deserialize(response); + string doc = CreateUnderscoresXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -410,10 +411,10 @@ public void Can_Deserialize_Names_With_Underscores_On_Default_Root() [Test] public void Can_Deserialize_Names_With_Dashes_On_Default_Root() { - var doc = CreateDashesXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer(); - var p = d.Deserialize(response); + string doc = CreateDashesXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -437,10 +438,10 @@ public void Can_Deserialize_Names_With_Dashes_On_Default_Root() [Test] public void Can_Deserialize_Names_With_Underscores_Without_Matching_Case_On_Default_Root() { - var doc = CreateLowercaseUnderscoresXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer(); - var p = d.Deserialize(response); + string doc = CreateLowercaseUnderscoresXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -464,10 +465,10 @@ public void Can_Deserialize_Names_With_Underscores_Without_Matching_Case_On_Defa [Test] public void Can_Deserialize_Lower_Cased_Root_Elements_With_Dashes() { - var doc = CreateDashesXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer(); - var p = d.Deserialize(response); + string doc = CreateDashesXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer(); + PersonForXml p = d.Deserialize(response); Assert.AreEqual("John Sheehan", p.Name); Assert.AreEqual(new DateTime(2009, 9, 25, 0, 6, 1), p.StartDate); @@ -491,10 +492,10 @@ public void Can_Deserialize_Lower_Cased_Root_Elements_With_Dashes() [Test] public void Can_Deserialize_Root_Elements_Without_Matching_Case_And_Dashes() { - var doc = CreateLowerCasedRootElementWithDashesXml(); - var response = new RestResponse { Content = doc }; - var d = new XmlDeserializer(); - var p = d.Deserialize>(response); + string doc = CreateLowerCasedRootElementWithDashesXml(); + RestResponse response = new RestResponse { Content = doc }; + XmlDeserializer d = new XmlDeserializer(); + List p = d.Deserialize>(response); Assert.NotNull(p); Assert.AreEqual(1, p.Count); @@ -504,11 +505,11 @@ public void Can_Deserialize_Root_Elements_Without_Matching_Case_And_Dashes() [Test] public void Can_Deserialize_Eventful_Xml() { - var xmlpath = this.PathFor("eventful.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("eventful.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlDeserializer d = new XmlDeserializer(); + VenueSearch output = d.Deserialize(response); Assert.IsNotEmpty(output.venues); Assert.AreEqual(3, output.venues.Count); @@ -520,11 +521,11 @@ public void Can_Deserialize_Eventful_Xml() [Test] public void Can_Deserialize_Lastfm_Xml() { - var xmlpath = this.PathFor("Lastfm.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("Lastfm.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlDeserializer d = new XmlDeserializer(); + Event output = d.Deserialize(response); //Assert.IsNotEmpty(output.artists); Assert.AreEqual("http://www.last.fm/event/328799+Philip+Glass+at+Barbican+Centre+on+12+June+2008", output.url); @@ -534,11 +535,11 @@ public void Can_Deserialize_Lastfm_Xml() [Test] public void Can_Deserialize_Google_Weather_Xml() { - var xmlpath = this.PathFor("GoogleWeather.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("GoogleWeather.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlDeserializer d = new XmlDeserializer(); + xml_api_reply output = d.Deserialize(response); Assert.IsNotEmpty(output.weather); Assert.AreEqual(4, output.weather.Count); @@ -548,11 +549,11 @@ public void Can_Deserialize_Google_Weather_Xml() [Test] public void Can_Deserialize_Goodreads_Xml() { - var xmlpath = this.PathFor("Goodreads.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("Goodreads.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlDeserializer d = new XmlDeserializer(); + GoodReadsReviewCollection output = d.Deserialize(response); Assert.AreEqual(2, output.Reviews.Count); Assert.AreEqual("1208943892", output.Reviews[0].Id); // This fails without fixing the XmlDeserializer @@ -562,11 +563,11 @@ public void Can_Deserialize_Goodreads_Xml() [Test] public void Can_Deserialize_Boolean_From_Number() { - var xmlpath = this.PathFor("boolean_from_number.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("boolean_from_number.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlDeserializer d = new XmlDeserializer(); + BooleanTest output = d.Deserialize(response); Assert.True(output.Value); } @@ -574,11 +575,11 @@ public void Can_Deserialize_Boolean_From_Number() [Test] public void Can_Deserialize_Boolean_From_String() { - var xmlpath = this.PathFor("boolean_from_string.xml"); - var doc = XDocument.Load(xmlpath); - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlDeserializer(); - var output = d.Deserialize(response); + string xmlpath = this.PathFor("boolean_from_string.xml"); + XDocument doc = XDocument.Load(xmlpath); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlDeserializer d = new XmlDeserializer(); + BooleanTest output = d.Deserialize(response); Assert.True(output.Value); } @@ -586,9 +587,9 @@ public void Can_Deserialize_Boolean_From_String() [Test] public void Can_Deserialize_Empty_Elements_With_Attributes_to_Nullable_Values() { - var doc = CreateXmlWithAttributesAndNullValues(); - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc }); + string doc = CreateXmlWithAttributesAndNullValues(); + XmlDeserializer xml = new XmlDeserializer(); + NullableValues output = xml.Deserialize(new RestResponse { Content = doc }); Assert.Null(output.Id); Assert.Null(output.StartDate); @@ -598,9 +599,9 @@ public void Can_Deserialize_Empty_Elements_With_Attributes_to_Nullable_Values() [Test] public void Can_Deserialize_Mixture_Of_Empty_Elements_With_Attributes_And_Populated_Elements() { - var doc = CreateXmlWithAttributesAndNullValuesAndPopulatedValues(); - var xml = new XmlDeserializer(); - var output = xml.Deserialize(new RestResponse { Content = doc }); + string doc = CreateXmlWithAttributesAndNullValuesAndPopulatedValues(); + XmlDeserializer xml = new XmlDeserializer(); + NullableValues output = xml.Deserialize(new RestResponse { Content = doc }); Assert.Null(output.Id); Assert.Null(output.StartDate); @@ -610,11 +611,11 @@ public void Can_Deserialize_Mixture_Of_Empty_Elements_With_Attributes_And_Popula [Test] public void Can_Deserialize_DateTimeOffset() { - var culture = CultureInfo.InvariantCulture; - var doc = new XDocument(culture); + CultureInfo culture = CultureInfo.InvariantCulture; + XDocument doc = new XDocument(culture); DateTimeOffset dateTimeOffset = new DateTimeOffset(2013, 02, 08, 9, 18, 22, TimeSpan.FromHours(10)); DateTimeOffset? nullableDateTimeOffsetWithValue = new DateTimeOffset(2013, 02, 08, 9, 18, 23, TimeSpan.FromHours(10)); - var root = new XElement("Dates"); + XElement root = new XElement("Dates"); root.Add(new XElement("DateTimeOffset", dateTimeOffset)); root.Add(new XElement("NullableDateTimeOffsetWithNull", string.Empty)); @@ -623,9 +624,9 @@ public void Can_Deserialize_DateTimeOffset() doc.Add(root); //var xml = new XmlDeserializer { Culture = culture, }; - var response = new RestResponse { Content = doc.ToString() }; - var d = new XmlDeserializer { Culture = culture, }; - var payload = d.Deserialize(response); + RestResponse response = new RestResponse { Content = doc.ToString() }; + XmlDeserializer d = new XmlDeserializer { Culture = culture, }; + DateTimeTestStructure payload = d.Deserialize(response); Assert.AreEqual(dateTimeOffset, payload.DateTimeOffset); Assert.Null(payload.NullableDateTimeOffsetWithNull); @@ -635,8 +636,8 @@ public void Can_Deserialize_DateTimeOffset() private static string CreateUnderscoresXml() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("Name", "John Sheehan")); root.Add(new XElement("Start_Date", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -653,7 +654,7 @@ private static string CreateUnderscoresXml() new XElement("Name", "The Fonz"), new XAttribute("Since", 1952))); - var friends = new XElement("Friends"); + XElement friends = new XElement("Friends"); for (int i = 0; i < 10; i++) { @@ -664,7 +665,7 @@ private static string CreateUnderscoresXml() root.Add(friends); - var foes = new XElement("Foes"); + XElement foes = new XElement("Foes"); foes.Add(new XAttribute("Team", "Yankees")); @@ -681,8 +682,8 @@ private static string CreateUnderscoresXml() private static string CreateLowercaseUnderscoresXml() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("Name", "John Sheehan")); root.Add(new XElement("start_date", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -699,7 +700,7 @@ private static string CreateLowercaseUnderscoresXml() new XElement("name", "The Fonz"), new XAttribute("Since", 1952))); - var friends = new XElement("Friends"); + XElement friends = new XElement("Friends"); for (int i = 0; i < 10; i++) { @@ -710,7 +711,7 @@ private static string CreateLowercaseUnderscoresXml() root.Add(friends); - var foes = new XElement("Foes"); + XElement foes = new XElement("Foes"); foes.Add(new XAttribute("Team", "Yankees")); @@ -727,8 +728,8 @@ private static string CreateLowercaseUnderscoresXml() private static string CreateDashesXml() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("Name", "John Sheehan")); root.Add(new XElement("Start_Date", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -745,7 +746,7 @@ private static string CreateDashesXml() new XElement("Name", "The Fonz"), new XAttribute("Since", 1952))); - var friends = new XElement("Friends"); + XElement friends = new XElement("Friends"); for (int i = 0; i < 10; i++) { @@ -756,7 +757,7 @@ private static string CreateDashesXml() root.Add(friends); - var foes = new XElement("Foes"); + XElement foes = new XElement("Foes"); foes.Add(new XAttribute("Team", "Yankees")); @@ -773,8 +774,8 @@ private static string CreateDashesXml() private static string CreateLowerCasedRootElementWithDashesXml() { - var doc = new XDocument(); - var root = new XElement("incoming-invoices", + XDocument doc = new XDocument(); + XElement root = new XElement("incoming-invoices", new XElement("incoming-invoice", new XElement("concept-id", 45))); doc.Add(root); @@ -784,8 +785,8 @@ private static string CreateLowerCasedRootElementWithDashesXml() private static string CreateElementsXml() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XElement("Name", "John Sheehan")); root.Add(new XElement("StartDate", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -805,7 +806,7 @@ private static string CreateElementsXml() new XElement("Name", "The Fonz"), new XElement("Since", 1952))); - var friends = new XElement("Friends"); + XElement friends = new XElement("Friends"); for (int i = 0; i < 10; i++) { @@ -822,8 +823,8 @@ private static string CreateElementsXml() private static string CreateAttributesXml() { - var doc = new XDocument(); - var root = new XElement("Person"); + XDocument doc = new XDocument(); + XElement root = new XElement("Person"); root.Add(new XAttribute("Name", "John Sheehan")); root.Add(new XAttribute("StartDate", new DateTime(2009, 9, 25, 0, 6, 1))); @@ -847,8 +848,8 @@ private static string CreateAttributesXml() private static string CreateXmlWithNullValues() { - var doc = new XDocument(); - var root = new XElement("NullableValues"); + XDocument doc = new XDocument(); + XElement root = new XElement("NullableValues"); root.Add(new XElement("Id", null), new XElement("StartDate", null), @@ -861,8 +862,8 @@ private static string CreateXmlWithNullValues() private static string CreateXmlWithoutEmptyValues(CultureInfo culture) { - var doc = new XDocument(); - var root = new XElement("NullableValues"); + XDocument doc = new XDocument(); + XElement root = new XElement("NullableValues"); root.Add(new XElement("Id", 123), new XElement("StartDate", new DateTime(2010, 2, 21, 9, 35, 00).ToString(culture)), @@ -875,8 +876,8 @@ private static string CreateXmlWithoutEmptyValues(CultureInfo culture) private static string CreateXmlWithEmptyNestedList() { - var doc = new XDocument(); - var root = new XElement("EmptyListSample"); + XDocument doc = new XDocument(); + XElement root = new XElement("EmptyListSample"); root.Add(new XElement("Images")); doc.Add(root); @@ -886,8 +887,8 @@ private static string CreateXmlWithEmptyNestedList() private static string CreateXmlWithEmptyInlineList() { - var doc = new XDocument(); - var root = new XElement("EmptyListSample"); + XDocument doc = new XDocument(); + XElement root = new XElement("EmptyListSample"); doc.Add(root); @@ -896,9 +897,9 @@ private static string CreateXmlWithEmptyInlineList() private static string CreateXmlWithAttributesAndNullValues() { - var doc = new XDocument(); - var root = new XElement("NullableValues"); - var idElement = new XElement("Id", null); + XDocument doc = new XDocument(); + XElement root = new XElement("NullableValues"); + XElement idElement = new XElement("Id", null); idElement.SetAttributeValue("SomeAttribute", "SomeAttribute_Value"); @@ -913,9 +914,9 @@ private static string CreateXmlWithAttributesAndNullValues() private static string CreateXmlWithAttributesAndNullValuesAndPopulatedValues() { - var doc = new XDocument(); - var root = new XElement("NullableValues"); - var idElement = new XElement("Id", null); + XDocument doc = new XDocument(); + XElement root = new XElement("NullableValues"); + XElement idElement = new XElement("Id", null); idElement.SetAttributeValue("SomeAttribute", "SomeAttribute_Value"); diff --git a/RestSharp/Authenticators/HttpBasicAuthenticator.cs b/RestSharp/Authenticators/HttpBasicAuthenticator.cs index 0b254c517..8c5bb5f39 100644 --- a/RestSharp/Authenticators/HttpBasicAuthenticator.cs +++ b/RestSharp/Authenticators/HttpBasicAuthenticator.cs @@ -18,16 +18,17 @@ using System.Linq; using System.Text; -namespace RestSharp +namespace RestSharp.Authenticators { public class HttpBasicAuthenticator : IAuthenticator { - private readonly string _authHeader; + private readonly string authHeader; public HttpBasicAuthenticator(string username, string password) { var token = Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", username, password))); - _authHeader = string.Format("Basic {0}", token); + + this.authHeader = string.Format("Basic {0}", token); } public void Authenticate(IRestClient client, IRestRequest request) @@ -42,7 +43,7 @@ public void Authenticate(IRestClient client, IRestRequest request) // only add the Authorization parameter if it hasn't been added by a previous Execute if (!request.Parameters.Any(p => p.Name.Equals("Authorization", StringComparison.OrdinalIgnoreCase))) { - request.AddParameter("Authorization", _authHeader, ParameterType.HttpHeader); + request.AddParameter("Authorization", this.authHeader, ParameterType.HttpHeader); } } } diff --git a/RestSharp/Authenticators/IAuthenticator.cs b/RestSharp/Authenticators/IAuthenticator.cs index 2177418d3..272288c25 100644 --- a/RestSharp/Authenticators/IAuthenticator.cs +++ b/RestSharp/Authenticators/IAuthenticator.cs @@ -14,7 +14,7 @@ // limitations under the License. #endregion -namespace RestSharp +namespace RestSharp.Authenticators { public interface IAuthenticator { diff --git a/RestSharp/Authenticators/JwtAuthenticator.cs b/RestSharp/Authenticators/JwtAuthenticator.cs index 0e704d1a6..0c397c6c9 100644 --- a/RestSharp/Authenticators/JwtAuthenticator.cs +++ b/RestSharp/Authenticators/JwtAuthenticator.cs @@ -16,10 +16,9 @@ #endregion using System; -using RestSharp; using System.Linq; -namespace RestSharp +namespace RestSharp.Authenticators { /// /// JSON WEB TOKEN (JWT) Authenticator class. @@ -36,7 +35,7 @@ public JwtAuthenticator(string accessToken) throw new ArgumentNullException("accessToken"); } - authHeader = string.Format("Bearer {0}", accessToken); + this.authHeader = string.Format("Bearer {0}", accessToken); } public void Authenticate(IRestClient client, IRestRequest request) @@ -45,7 +44,7 @@ public void Authenticate(IRestClient client, IRestRequest request) if (!request.Parameters.Any(p => p.Type.Equals(ParameterType.HttpHeader) && p.Name.Equals("Authorization", StringComparison.OrdinalIgnoreCase))) { - request.AddParameter("Authorization", authHeader, ParameterType.HttpHeader); + request.AddParameter("Authorization", this.authHeader, ParameterType.HttpHeader); } } } diff --git a/RestSharp/Authenticators/NtlmAuthenticator.cs b/RestSharp/Authenticators/NtlmAuthenticator.cs index 22d1676e3..cdd3d10e5 100644 --- a/RestSharp/Authenticators/NtlmAuthenticator.cs +++ b/RestSharp/Authenticators/NtlmAuthenticator.cs @@ -18,8 +18,7 @@ using System.Net; #if FRAMEWORK - -namespace RestSharp +namespace RestSharp.Authenticators { /// /// Tries to Authenticate with the credentials of the currently logged in user, or impersonate a user @@ -31,7 +30,7 @@ public class NtlmAuthenticator : IAuthenticator /// /// Authenticate with the credentials of the currently logged in user /// - public NtlmAuthenticator() + public NtlmAuthenticator() : this(CredentialCache.DefaultCredentials) { } /// @@ -56,9 +55,8 @@ public NtlmAuthenticator(ICredentials credentials) public void Authenticate(IRestClient client, IRestRequest request) { - request.Credentials = credentials; + request.Credentials = this.credentials; } } } - -#endif \ No newline at end of file +#endif diff --git a/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs index a54360455..b1a421868 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.Linq; using System.Text; namespace RestSharp.Authenticators.OAuth.Extensions @@ -27,18 +28,14 @@ public static IEnumerable And(this IEnumerable items, T item) yield return item; } - public static K TryWithKey(this IDictionary dictionary, T key) + public static TK TryWithKey(this IDictionary dictionary, T key) { - return dictionary.ContainsKey(key) ? dictionary[key] : default(K); + return dictionary.ContainsKey(key) ? dictionary[key] : default(TK); } public static IEnumerable ToEnumerable(this object[] items) where T : class { - foreach (var item in items) - { - var record = item as T; - yield return record; - } + return items.Select(item => item as T); } public static void ForEach(this IEnumerable items, Action action) @@ -50,7 +47,6 @@ public static void ForEach(this IEnumerable items, Action action) } #if !WINDOWS_PHONE && !SILVERLIGHT - public static void AddRange(this IDictionary collection, NameValueCollection range) { foreach (var key in range.AllKeys) @@ -62,12 +58,14 @@ public static void AddRange(this IDictionary collection, NameVal public static string ToQueryString(this NameValueCollection collection) { var sb = new StringBuilder(); + if (collection.Count > 0) { sb.Append("?"); } var count = 0; + foreach (var key in collection.AllKeys) { sb.AppendFormat("{0}={1}", key, collection[key].UrlEncode()); @@ -77,17 +75,17 @@ public static string ToQueryString(this NameValueCollection collection) { continue; } + sb.Append("&"); } + return sb.ToString(); } - #endif public static string Concatenate(this WebParameterCollection collection, string separator, string spacer) { var sb = new StringBuilder(); - var total = collection.Count; var count = 0; @@ -98,6 +96,7 @@ public static string Concatenate(this WebParameterCollection collection, string sb.Append(item.Value); count++; + if (count < total) { sb.Append(spacer); diff --git a/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs index a6c02f6d5..d5b1c1456 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs @@ -10,6 +10,7 @@ public static string ToRequestValue(this OAuthSignatureMethod signatureMethod) { var value = signatureMethod.ToString().ToUpper(); var shaIndex = value.IndexOf("SHA1"); + return shaIndex > -1 ? value.Insert(shaIndex, "-") : value; } @@ -19,8 +20,10 @@ public static OAuthSignatureMethod FromRequestValue(this string signatureMethod) { case "HMAC-SHA1": return OAuthSignatureMethod.HmacSha1; + case "RSA-SHA1": return OAuthSignatureMethod.RsaSha1; + default: return OAuthSignatureMethod.PlainText; } @@ -30,6 +33,7 @@ public static string HashWith(this string input, HashAlgorithm algorithm) { var data = Encoding.UTF8.GetBytes(input); var hash = algorithm.ComputeHash(data); + return Convert.ToBase64String(hash); } } diff --git a/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs index 724b4f293..c9d656885 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs @@ -3,7 +3,6 @@ using System.Globalization; using System.Linq; using System.Text; -using System.Text.RegularExpressions; namespace RestSharp.Authenticators.OAuth.Extensions { @@ -11,13 +10,13 @@ internal static class StringExtensions { public static bool IsNullOrBlank(this string value) { - return String.IsNullOrEmpty(value) || - (!String.IsNullOrEmpty(value) && value.Trim() == String.Empty); + return string.IsNullOrEmpty(value) || + (!string.IsNullOrEmpty(value) && value.Trim() == string.Empty); } public static bool EqualsIgnoreCase(this string left, string right) { - return String.Compare(left, right, StringComparison.OrdinalIgnoreCase) == 0; + return string.Compare(left, right, StringComparison.OrdinalIgnoreCase) == 0; } public static bool EqualsAny(this string input, params string[] args) @@ -27,17 +26,17 @@ public static bool EqualsAny(this string input, params string[] args) public static string FormatWith(this string format, params object[] args) { - return String.Format(format, args); + return string.Format(format, args); } public static string FormatWithInvariantCulture(this string format, params object[] args) { - return String.Format(CultureInfo.InvariantCulture, format, args); + return string.Format(CultureInfo.InvariantCulture, format, args); } public static string Then(this string input, string value) { - return String.Concat(input, value); + return string.Concat(input, value); } public static string UrlEncode(this string value) @@ -70,10 +69,12 @@ public static string PercentEncode(this string s) { var bytes = s.GetBytes(); var sb = new StringBuilder(); + foreach (var b in bytes) { - sb.Append(String.Format("%{0:X2}", b)); + sb.Append(string.Format("%{0:X2}", b)); } + return sb.ToString(); } @@ -87,19 +88,10 @@ public static IDictionary ParseQueryString(this string query) return new Dictionary(); } - var parts = query.Split(new[] { '&' }); + var parts = query.Split('&'); - return parts.Select( - part => part.Split(new[] { '=' })).ToDictionary( - pair => pair[0], pair => pair[1] - ); + return parts.Select(part => part.Split('=')) + .ToDictionary(pair => pair[0], pair => pair[1]); } - - private const RegexOptions Options = -#if !WINDOWS_PHONE && !SILVERLIGHT - RegexOptions.Compiled | RegexOptions.IgnoreCase; -#else - RegexOptions.IgnoreCase; -#endif } } diff --git a/RestSharp/Authenticators/OAuth/Extensions/TimeExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/TimeExtensions.cs index 948b9f024..0dbe54f78 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/TimeExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/TimeExtensions.cs @@ -12,6 +12,7 @@ public static DateTime FromNow(this TimeSpan value) public static DateTime FromUnixTime(this long seconds) { var time = new DateTime(1970, 1, 1); + time = time.AddSeconds(seconds); return time.ToLocalTime(); @@ -20,7 +21,7 @@ public static DateTime FromUnixTime(this long seconds) public static long ToUnixTime(this DateTime dateTime) { var timeSpan = (dateTime - new DateTime(1970, 1, 1)); - var timestamp = (long)timeSpan.TotalSeconds; + var timestamp = (long) timeSpan.TotalSeconds; return timestamp; } diff --git a/RestSharp/Authenticators/OAuth/HttpPostParameter.cs b/RestSharp/Authenticators/OAuth/HttpPostParameter.cs index 332aabf0e..405054065 100644 --- a/RestSharp/Authenticators/OAuth/HttpPostParameter.cs +++ b/RestSharp/Authenticators/OAuth/HttpPostParameter.cs @@ -4,7 +4,8 @@ namespace RestSharp.Authenticators.OAuth { internal class HttpPostParameter : WebParameter { - public HttpPostParameter(string name, string value) : base(name, value) { } + public HttpPostParameter(string name, string value) + : base(name, value) { } public virtual HttpPostParameterType Type { get; private set; } @@ -19,24 +20,25 @@ public HttpPostParameter(string name, string value) : base(name, value) { } public static HttpPostParameter CreateFile(string name, string fileName, string filePath, string contentType) { var parameter = new HttpPostParameter(name, string.Empty) - { - Type = HttpPostParameterType.File, - FileName = fileName, - FilePath = filePath, - ContentType = contentType, - }; + { + Type = HttpPostParameterType.File, + FileName = fileName, + FilePath = filePath, + ContentType = contentType, + }; + return parameter; } public static HttpPostParameter CreateFile(string name, string fileName, Stream fileStream, string contentType) { var parameter = new HttpPostParameter(name, string.Empty) - { - Type = HttpPostParameterType.File, - FileName = fileName, - FileStream = fileStream, - ContentType = contentType, - }; + { + Type = HttpPostParameterType.File, + FileName = fileName, + FileStream = fileStream, + ContentType = contentType, + }; return parameter; } diff --git a/RestSharp/Authenticators/OAuth/OAuthTools.cs b/RestSharp/Authenticators/OAuth/OAuthTools.cs index b1ee24a46..ca797a0a2 100644 --- a/RestSharp/Authenticators/OAuth/OAuthTools.cs +++ b/RestSharp/Authenticators/OAuth/OAuthTools.cs @@ -11,27 +11,28 @@ namespace RestSharp.Authenticators.OAuth #endif internal static class OAuthTools { - private const string AlphaNumeric = Upper + Lower + Digit; - private const string Digit = "1234567890"; - private const string Lower = "abcdefghijklmnopqrstuvwxyz"; - private const string Unreserved = AlphaNumeric + "-._~"; - private const string Upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private const string ALPHA_NUMERIC = UPPER + LOWER + DIGIT; + private const string DIGIT = "1234567890"; + private const string LOWER = "abcdefghijklmnopqrstuvwxyz"; + private const string UNRESERVED = ALPHA_NUMERIC + "-._~"; + private const string UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - private static readonly Random _random; - private static readonly object _randomLock = new object(); + private static readonly Random random; + private static readonly object randomLock = new object(); #if !SILVERLIGHT && !WINDOWS_PHONE - private static readonly RandomNumberGenerator _rng = RandomNumberGenerator.Create(); + private static readonly RandomNumberGenerator rng = RandomNumberGenerator.Create(); #endif static OAuthTools() { #if !SILVERLIGHT && !WINDOWS_PHONE var bytes = new byte[4]; - _rng.GetNonZeroBytes(bytes); - _random = new Random(BitConverter.ToInt32(bytes, 0)); + + rng.GetNonZeroBytes(bytes); + random = new Random(BitConverter.ToInt32(bytes, 0)); #else - _random = new Random(); + random = new Random(); #endif } @@ -39,7 +40,7 @@ static OAuthTools() /// All text parameters are UTF-8 encoded (per section 5.1). /// /// - private static readonly Encoding _encoding = Encoding.UTF8; + private static readonly Encoding encoding = Encoding.UTF8; /// /// Generates a random 16-byte lowercase alphanumeric string. @@ -48,14 +49,15 @@ static OAuthTools() /// public static string GetNonce() { - const string chars = (Lower + Digit); + const string chars = (LOWER + DIGIT); + var nonce = new char[16]; - lock (_randomLock) + lock (randomLock) { for (var i = 0; i < nonce.Length; i++) { - nonce[i] = chars[_random.Next(0, chars.Length)]; + nonce[i] = chars[random.Next(0, chars.Length)]; } } @@ -88,9 +90,9 @@ public static string GetTimestamp(DateTime dateTime) /// The set of characters that are unreserved in RFC 2396 but are NOT unreserved in RFC 3986. /// /// - private static readonly string[] UriRfc3986CharsToEscape = new[] { "!", "*", "'", "(", ")" }; + private static readonly string[] uriRfc3986CharsToEscape = { "!", "*", "'", "(", ")" }; - private static readonly string[] UriRfc3968EscapedHex = new[] { "%21", "%2A", "%27", "%28", "%29" }; + private static readonly string[] uriRfc3968EscapedHex = { "%21", "%2A", "%27", "%28", "%29" }; /// /// URL encodes a string based on section 5.1 of the OAuth spec. @@ -116,10 +118,11 @@ public static string UrlEncodeRelaxed(string value) StringBuilder escaped = new StringBuilder(Uri.EscapeDataString(value)); // Upgrade the escaping to RFC 3986, if necessary. - for (int i = 0; i < UriRfc3986CharsToEscape.Length; i++) + for (int i = 0; i < uriRfc3986CharsToEscape.Length; i++) { - string t = UriRfc3986CharsToEscape[i]; - escaped.Replace(t, UriRfc3968EscapedHex[i]); + string t = uriRfc3986CharsToEscape[i]; + + escaped.Replace(t, uriRfc3968EscapedHex[i]); } // Return the fully-RFC3986-escaped string. @@ -141,13 +144,16 @@ public static string UrlEncodeStrict(string value) // Generic Syntax," .) section 2.3) MUST be encoded. // ... // unreserved = ALPHA, DIGIT, '-', '.', '_', '~' - String result = ""; + string result = ""; + value.ForEach(c => - { - result += Unreserved.Contains(c) - ? c.ToString() - : c.ToString().PercentEncode(); - }); + { + result += UNRESERVED.Contains(c) + ? c.ToString() + : c.ToString() + .PercentEncode(); + }); + return result; } @@ -163,6 +169,7 @@ public static string NormalizeRequestParameters(WebParameterCollection parameter { var copy = SortParametersExcludingSignature(parameters); var concatenated = copy.Concatenate("=", "&"); + return concatenated; } @@ -178,11 +185,10 @@ public static WebParameterCollection SortParametersExcludingSignature(WebParamet copy.RemoveAll(exclusions); copy.ForEach(p => { p.Name = UrlEncodeStrict(p.Name); p.Value = UrlEncodeStrict(p.Value); }); - copy.Sort( - (x, y) => - string.CompareOrdinal(x.Name, y.Name) != 0 - ? string.CompareOrdinal(x.Name, y.Name) - : string.CompareOrdinal(x.Value, y.Value)); + copy.Sort((x, y) => string.CompareOrdinal(x.Name, y.Name) != 0 + ? string.CompareOrdinal(x.Name, y.Name) + : string.CompareOrdinal(x.Value, y.Value)); + return copy; } @@ -202,7 +208,6 @@ public static string ConstructRequestUrl(Uri url) } var sb = new StringBuilder(); - var requestUrl = "{0}://{1}".FormatWith(url.Scheme, url.Host); var qualified = ":{0}".FormatWith(url.Port); var basic = url.Scheme == "http" && url.Port == 80; @@ -265,7 +270,8 @@ public static string GetSignature(OAuthSignatureMethod signatureMethod, string s /// The signature base /// The consumer key /// - public static string GetSignature(OAuthSignatureMethod signatureMethod, OAuthSignatureTreatment signatureTreatment, string signatureBase, string consumerSecret) + public static string GetSignature(OAuthSignatureMethod signatureMethod, OAuthSignatureTreatment signatureTreatment, + string signatureBase, string consumerSecret) { return GetSignature(signatureMethod, signatureTreatment, signatureBase, consumerSecret, null); } @@ -279,7 +285,8 @@ public static string GetSignature(OAuthSignatureMethod signatureMethod, OAuthSig /// The consumer secret /// The token secret /// - public static string GetSignature(OAuthSignatureMethod signatureMethod, string signatureBase, string consumerSecret, string tokenSecret) + public static string GetSignature(OAuthSignatureMethod signatureMethod, string signatureBase, string consumerSecret, + string tokenSecret) { return GetSignature(signatureMethod, OAuthSignatureTreatment.Escaped, consumerSecret, tokenSecret); } @@ -294,15 +301,12 @@ public static string GetSignature(OAuthSignatureMethod signatureMethod, string s /// The consumer secret /// The token secret /// - public static string GetSignature(OAuthSignatureMethod signatureMethod, - OAuthSignatureTreatment signatureTreatment, - string signatureBase, - string consumerSecret, - string tokenSecret) + public static string GetSignature(OAuthSignatureMethod signatureMethod, OAuthSignatureTreatment signatureTreatment, + string signatureBase, string consumerSecret, string tokenSecret) { if (tokenSecret.IsNullOrBlank()) { - tokenSecret = String.Empty; + tokenSecret = string.Empty; } consumerSecret = UrlEncodeRelaxed(consumerSecret); @@ -317,7 +321,7 @@ public static string GetSignature(OAuthSignatureMethod signatureMethod, var crypto = new HMACSHA1(); var key = "{0}&{1}".FormatWith(consumerSecret, tokenSecret); - crypto.Key = _encoding.GetBytes(key); + crypto.Key = encoding.GetBytes(key); signature = signatureBase.HashWith(crypto); break; diff --git a/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs b/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs index 7b3741b4a..b2251023d 100644 --- a/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs +++ b/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; using RestSharp.Authenticators.OAuth.Extensions; -#if !WINDOWS_PHONE && !SILVERLIGHT -using RestSharp.Contrib; + +#if !SILVERLIGHT && !WINDOWS_PHONE +using RestSharp.Extensions.MonoHttp; #endif namespace RestSharp.Authenticators.OAuth @@ -88,20 +89,20 @@ public virtual OAuthWebQueryInfo BuildRequestTokenInfo(string method, WebParamet var signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret); var info = new OAuthWebQueryInfo - { - WebMethod = method, - ParameterHandling = ParameterHandling, - ConsumerKey = ConsumerKey, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, - Signature = signature, - Timestamp = timestamp, - Nonce = nonce, - Version = Version ?? "1.0", - Callback = OAuthTools.UrlEncodeRelaxed(CallbackUrl ?? ""), - TokenSecret = TokenSecret, - ConsumerSecret = ConsumerSecret - }; + { + WebMethod = method, + ParameterHandling = ParameterHandling, + ConsumerKey = ConsumerKey, + SignatureMethod = SignatureMethod.ToRequestValue(), + SignatureTreatment = SignatureTreatment, + Signature = signature, + Timestamp = timestamp, + Nonce = nonce, + Version = Version ?? "1.0", + Callback = OAuthTools.UrlEncodeRelaxed(CallbackUrl ?? ""), + TokenSecret = TokenSecret, + ConsumerSecret = ConsumerSecret + }; return info; } @@ -145,22 +146,22 @@ public virtual OAuthWebQueryInfo BuildAccessTokenInfo(string method, WebParamete var signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret, TokenSecret); var info = new OAuthWebQueryInfo - { - WebMethod = method, - ParameterHandling = ParameterHandling, - ConsumerKey = ConsumerKey, - Token = Token, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, - Signature = signature, - Timestamp = timestamp, - Nonce = nonce, - Version = Version ?? "1.0", - Verifier = Verifier, - Callback = CallbackUrl, - TokenSecret = TokenSecret, - ConsumerSecret = ConsumerSecret, - }; + { + WebMethod = method, + ParameterHandling = ParameterHandling, + ConsumerKey = ConsumerKey, + Token = Token, + SignatureMethod = SignatureMethod.ToRequestValue(), + SignatureTreatment = SignatureTreatment, + Signature = signature, + Timestamp = timestamp, + Nonce = nonce, + Version = Version ?? "1.0", + Verifier = Verifier, + Callback = CallbackUrl, + TokenSecret = TokenSecret, + ConsumerSecret = ConsumerSecret, + }; return info; } @@ -192,27 +193,28 @@ public virtual OAuthWebQueryInfo BuildClientAuthAccessTokenInfo(string method, W var signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret); var info = new OAuthWebQueryInfo - { - WebMethod = method, - ParameterHandling = ParameterHandling, - ClientMode = "client_auth", - ClientUsername = ClientUsername, - ClientPassword = ClientPassword, - ConsumerKey = ConsumerKey, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, - Signature = signature, - Timestamp = timestamp, - Nonce = nonce, - Version = Version ?? "1.0", - TokenSecret = TokenSecret, - ConsumerSecret = ConsumerSecret - }; + { + WebMethod = method, + ParameterHandling = ParameterHandling, + ClientMode = "client_auth", + ClientUsername = ClientUsername, + ClientPassword = ClientPassword, + ConsumerKey = ConsumerKey, + SignatureMethod = SignatureMethod.ToRequestValue(), + SignatureTreatment = SignatureTreatment, + Signature = signature, + Timestamp = timestamp, + Nonce = nonce, + Version = Version ?? "1.0", + TokenSecret = TokenSecret, + ConsumerSecret = ConsumerSecret + }; return info; } - public virtual OAuthWebQueryInfo BuildProtectedResourceInfo(string method, WebParameterCollection parameters, string url) + public virtual OAuthWebQueryInfo BuildProtectedResourceInfo(string method, WebParameterCollection parameters, + string url) { ValidateProtectedResourceState(); @@ -232,7 +234,7 @@ public virtual OAuthWebQueryInfo BuildProtectedResourceInfo(string method, WebPa #if !SILVERLIGHT && !WINDOWS_PHONE foreach (var parameter in urlParameters.AllKeys) #else - foreach (var parameter in urlParameters.Keys) + foreach (var parameter in urlParameters.Keys) #endif { switch (method.ToUpperInvariant()) @@ -253,25 +255,25 @@ public virtual OAuthWebQueryInfo BuildProtectedResourceInfo(string method, WebPa AddAuthParameters(parameters, timestamp, nonce); var signatureBase = OAuthTools.ConcatenateRequestElements(method, url, parameters); - var signature = OAuthTools.GetSignature( - SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret, TokenSecret); + var signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret, + TokenSecret); var info = new OAuthWebQueryInfo - { - WebMethod = method, - ParameterHandling = ParameterHandling, - ConsumerKey = ConsumerKey, - Token = Token, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, - Signature = signature, - Timestamp = timestamp, - Nonce = nonce, - Version = Version ?? "1.0", - Callback = CallbackUrl, - ConsumerSecret = ConsumerSecret, - TokenSecret = TokenSecret - }; + { + WebMethod = method, + ParameterHandling = ParameterHandling, + ConsumerKey = ConsumerKey, + Token = Token, + SignatureMethod = SignatureMethod.ToRequestValue(), + SignatureTreatment = SignatureTreatment, + Signature = signature, + Timestamp = timestamp, + Nonce = nonce, + Version = Version ?? "1.0", + Callback = CallbackUrl, + ConsumerSecret = ConsumerSecret, + TokenSecret = TokenSecret + }; return info; } @@ -356,13 +358,13 @@ private void ValidateProtectedResourceState() private void AddAuthParameters(ICollection parameters, string timestamp, string nonce) { var authParameters = new WebParameterCollection - { - new WebPair("oauth_consumer_key", ConsumerKey), - new WebPair("oauth_nonce", nonce), - new WebPair("oauth_signature_method", SignatureMethod.ToRequestValue()), - new WebPair("oauth_timestamp", timestamp), - new WebPair("oauth_version", Version ?? "1.0") - }; + { + new WebPair("oauth_consumer_key", ConsumerKey), + new WebPair("oauth_nonce", nonce), + new WebPair("oauth_signature_method", SignatureMethod.ToRequestValue()), + new WebPair("oauth_timestamp", timestamp), + new WebPair("oauth_version", Version ?? "1.0") + }; if (!Token.IsNullOrBlank()) { @@ -393,16 +395,16 @@ private void AddAuthParameters(ICollection parameters, string timestamp private void AddXAuthParameters(ICollection parameters, string timestamp, string nonce) { var authParameters = new WebParameterCollection - { - new WebPair("x_auth_username", ClientUsername), - new WebPair("x_auth_password", ClientPassword), - new WebPair("x_auth_mode", "client_auth"), - new WebPair("oauth_consumer_key", ConsumerKey), - new WebPair("oauth_signature_method", SignatureMethod.ToRequestValue()), - new WebPair("oauth_timestamp", timestamp), - new WebPair("oauth_nonce", nonce), - new WebPair("oauth_version", Version ?? "1.0") - }; + { + new WebPair("x_auth_username", ClientUsername), + new WebPair("x_auth_password", ClientPassword), + new WebPair("x_auth_mode", "client_auth"), + new WebPair("oauth_consumer_key", ConsumerKey), + new WebPair("oauth_signature_method", SignatureMethod.ToRequestValue()), + new WebPair("oauth_timestamp", timestamp), + new WebPair("oauth_nonce", nonce), + new WebPair("oauth_version", Version ?? "1.0") + }; foreach (var authParameter in authParameters) { diff --git a/RestSharp/Authenticators/OAuth/WebPairCollection.cs b/RestSharp/Authenticators/OAuth/WebPairCollection.cs index dc0aa936c..cbd9e6342 100644 --- a/RestSharp/Authenticators/OAuth/WebPairCollection.cs +++ b/RestSharp/Authenticators/OAuth/WebPairCollection.cs @@ -8,7 +8,7 @@ namespace RestSharp.Authenticators.OAuth { internal class WebPairCollection : IList { - private IList _parameters; + private List parameters; public virtual WebPair this[string name] { @@ -17,17 +17,17 @@ public virtual WebPair this[string name] public virtual IEnumerable Names { - get { return _parameters.Select(p => p.Name); } + get { return this.parameters.Select(p => p.Name); } } public virtual IEnumerable Values { - get { return _parameters.Select(p => p.Value); } + get { return this.parameters.Select(p => p.Value); } } public WebPairCollection(IEnumerable parameters) { - _parameters = new List(parameters); + this.parameters = new List(parameters); } #if !WINDOWS_PHONE && !SILVERLIGHT @@ -44,11 +44,7 @@ public virtual void AddRange(NameValueCollection collection) private void AddCollection(NameValueCollection collection) { - var parameters = collection.AllKeys.Select(key => new WebPair(key, collection[key])); - foreach (var parameter in parameters) - { - _parameters.Add(parameter); - } + this.parameters.AddRange(collection.AllKeys.Select(key => new WebPair(key, collection[key]))); } #endif @@ -60,30 +56,22 @@ public WebPairCollection(IDictionary collection) public void AddCollection(IDictionary collection) { - foreach (var key in collection.Keys) - { - var parameter = new WebPair(key, collection[key]); - _parameters.Add(parameter); - } + this.parameters.AddRange(collection.Keys.Select(key => new WebPair(key, collection[key]))); } public WebPairCollection() { - _parameters = new List(0); + this.parameters = new List(0); } public WebPairCollection(int capacity) { - _parameters = new List(capacity); + this.parameters = new List(capacity); } private void AddCollection(IEnumerable collection) { - foreach (var parameter in collection) - { - var pair = new WebPair(parameter.Name, parameter.Value); - _parameters.Add(pair); - } + this.parameters.AddRange(collection.Select(parameter => new WebPair(parameter.Name, parameter.Value))); } public virtual void AddRange(WebPairCollection collection) @@ -98,21 +86,17 @@ public virtual void AddRange(IEnumerable collection) public virtual void Sort(Comparison comparison) { - var sorted = new List(_parameters); + var sorted = new List(this.parameters); + sorted.Sort(comparison); - _parameters = sorted; + + this.parameters = sorted; } - public virtual bool RemoveAll(IEnumerable parameters) + public virtual bool RemoveAll(IEnumerable parametersToRemove) { - var success = true; - var array = parameters.ToArray(); - - for (var p = 0; p < array.Length; p++) - { - var parameter = array[p]; - success &= _parameters.Remove(parameter); - } + var array = parametersToRemove.ToArray(); + var success = array.Aggregate(true, (current, parameter) => current & this.parameters.Remove(parameter)); return success && array.Length > 0; } @@ -120,14 +104,15 @@ public virtual bool RemoveAll(IEnumerable parameters) public virtual void Add(string name, string value) { var pair = new WebPair(name, value); - _parameters.Add(pair); + + this.parameters.Add(pair); } #region IList Members public virtual IEnumerator GetEnumerator() { - return _parameters.GetEnumerator(); + return this.parameters.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() @@ -137,58 +122,58 @@ IEnumerator IEnumerable.GetEnumerator() public virtual void Add(WebPair parameter) { - _parameters.Add(parameter); + this.parameters.Add(parameter); } public virtual void Clear() { - _parameters.Clear(); + this.parameters.Clear(); } public virtual bool Contains(WebPair parameter) { - return _parameters.Contains(parameter); + return this.parameters.Contains(parameter); } - public virtual void CopyTo(WebPair[] parameters, int arrayIndex) + public virtual void CopyTo(WebPair[] parametersArray, int arrayIndex) { - _parameters.CopyTo(parameters, arrayIndex); + this.parameters.CopyTo(parametersArray, arrayIndex); } public virtual bool Remove(WebPair parameter) { - return _parameters.Remove(parameter); + return this.parameters.Remove(parameter); } public virtual int Count { - get { return _parameters.Count; } + get { return this.parameters.Count; } } public virtual bool IsReadOnly { - get { return _parameters.IsReadOnly; } + get { return false; } } public virtual int IndexOf(WebPair parameter) { - return _parameters.IndexOf(parameter); + return this.parameters.IndexOf(parameter); } public virtual void Insert(int index, WebPair parameter) { - _parameters.Insert(index, parameter); + this.parameters.Insert(index, parameter); } public virtual void RemoveAt(int index) { - _parameters.RemoveAt(index); + this.parameters.RemoveAt(index); } public virtual WebPair this[int index] { - get { return _parameters[index]; } - set { _parameters[index] = value; } + get { return this.parameters[index]; } + set { this.parameters[index] = value; } } #endregion diff --git a/RestSharp/Authenticators/OAuth/WebParameter.cs b/RestSharp/Authenticators/OAuth/WebParameter.cs index 7c6093c4a..a56c2ecb6 100644 --- a/RestSharp/Authenticators/OAuth/WebParameter.cs +++ b/RestSharp/Authenticators/OAuth/WebParameter.cs @@ -1,13 +1,7 @@ -#if !Smartphone using System; -using System.Diagnostics; -#endif namespace RestSharp.Authenticators.OAuth { -#if !Smartphone - [DebuggerDisplay("{Name}:{Value}")] -#endif #if !SILVERLIGHT && !WINDOWS_PHONE [Serializable] #endif diff --git a/RestSharp/Authenticators/OAuth/WebParameterCollection.cs b/RestSharp/Authenticators/OAuth/WebParameterCollection.cs index 8d29e0d90..e4b1f8392 100644 --- a/RestSharp/Authenticators/OAuth/WebParameterCollection.cs +++ b/RestSharp/Authenticators/OAuth/WebParameterCollection.cs @@ -15,8 +15,7 @@ public WebParameterCollection(NameValueCollection collection) public WebParameterCollection() { } - public WebParameterCollection(int capacity) - : base(capacity) { } + public WebParameterCollection(int capacity) : base(capacity) { } public WebParameterCollection(IDictionary collection) : base(collection) { } @@ -24,6 +23,7 @@ public WebParameterCollection(IDictionary collection) public override void Add(string name, string value) { var parameter = new WebParameter(name, value); + base.Add(parameter); } } diff --git a/RestSharp/Authenticators/OAuth1Authenticator.cs b/RestSharp/Authenticators/OAuth1Authenticator.cs index 54f5b788c..4b015cd02 100644 --- a/RestSharp/Authenticators/OAuth1Authenticator.cs +++ b/RestSharp/Authenticators/OAuth1Authenticator.cs @@ -20,12 +20,18 @@ using RestSharp.Authenticators.OAuth; using RestSharp.Authenticators.OAuth.Extensions; +#if !SILVERLIGHT && !WINDOWS_PHONE +using RestSharp.Extensions.MonoHttp; +#endif + #if WINDOWS_PHONE using System.Net; -#elif SILVERLIGHT +#endif + +#if SILVERLIGHT using System.Windows.Browser; #else -using RestSharp.Contrib; + #endif namespace RestSharp.Authenticators @@ -66,21 +72,24 @@ public class OAuth1Authenticator : IAuthenticator public static OAuth1Authenticator ForRequestToken(string consumerKey, string consumerSecret) { var authenticator = new OAuth1Authenticator - { - ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, - SignatureMethod = OAuthSignatureMethod.HmacSha1, - SignatureTreatment = OAuthSignatureTreatment.Escaped, - ConsumerKey = consumerKey, - ConsumerSecret = consumerSecret, - Type = OAuthType.RequestToken - }; + { + ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, + SignatureMethod = OAuthSignatureMethod.HmacSha1, + SignatureTreatment = OAuthSignatureTreatment.Escaped, + ConsumerKey = consumerKey, + ConsumerSecret = consumerSecret, + Type = OAuthType.RequestToken + }; + return authenticator; } public static OAuth1Authenticator ForRequestToken(string consumerKey, string consumerSecret, string callbackUrl) { var authenticator = ForRequestToken(consumerKey, consumerSecret); + authenticator.CallbackUrl = callbackUrl; + return authenticator; } @@ -88,16 +97,17 @@ public static OAuth1Authenticator ForAccessToken(string consumerKey, string cons string tokenSecret) { var authenticator = new OAuth1Authenticator - { - ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, - SignatureMethod = OAuthSignatureMethod.HmacSha1, - SignatureTreatment = OAuthSignatureTreatment.Escaped, - ConsumerKey = consumerKey, - ConsumerSecret = consumerSecret, - Token = token, - TokenSecret = tokenSecret, - Type = OAuthType.AccessToken - }; + { + ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, + SignatureMethod = OAuthSignatureMethod.HmacSha1, + SignatureTreatment = OAuthSignatureTreatment.Escaped, + ConsumerKey = consumerKey, + ConsumerSecret = consumerSecret, + Token = token, + TokenSecret = tokenSecret, + Type = OAuthType.AccessToken + }; + return authenticator; } @@ -105,7 +115,9 @@ public static OAuth1Authenticator ForAccessToken(string consumerKey, string cons string tokenSecret, string verifier) { var authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret); + authenticator.Verifier = verifier; + return authenticator; } @@ -113,7 +125,9 @@ public static OAuth1Authenticator ForAccessTokenRefresh(string consumerKey, stri string tokenSecret, string sessionHandle) { var authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret); + authenticator.SessionHandle = sessionHandle; + return authenticator; } @@ -121,8 +135,10 @@ public static OAuth1Authenticator ForAccessTokenRefresh(string consumerKey, stri string tokenSecret, string verifier, string sessionHandle) { var authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret); + authenticator.SessionHandle = sessionHandle; authenticator.Verifier = verifier; + return authenticator; } @@ -130,16 +146,17 @@ public static OAuth1Authenticator ForClientAuthentication(string consumerKey, st string username, string password) { var authenticator = new OAuth1Authenticator - { - ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, - SignatureMethod = OAuthSignatureMethod.HmacSha1, - SignatureTreatment = OAuthSignatureTreatment.Escaped, - ConsumerKey = consumerKey, - ConsumerSecret = consumerSecret, - ClientUsername = username, - ClientPassword = password, - Type = OAuthType.ClientAuthentication - }; + { + ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, + SignatureMethod = OAuthSignatureMethod.HmacSha1, + SignatureTreatment = OAuthSignatureTreatment.Escaped, + ConsumerKey = consumerKey, + ConsumerSecret = consumerSecret, + ClientUsername = username, + ClientPassword = password, + Type = OAuthType.ClientAuthentication + }; + return authenticator; } @@ -147,37 +164,38 @@ public static OAuth1Authenticator ForProtectedResource(string consumerKey, strin string accessToken, string accessTokenSecret) { var authenticator = new OAuth1Authenticator - { - Type = OAuthType.ProtectedResource, - ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, - SignatureMethod = OAuthSignatureMethod.HmacSha1, - SignatureTreatment = OAuthSignatureTreatment.Escaped, - ConsumerKey = consumerKey, - ConsumerSecret = consumerSecret, - Token = accessToken, - TokenSecret = accessTokenSecret - }; + { + Type = OAuthType.ProtectedResource, + ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, + SignatureMethod = OAuthSignatureMethod.HmacSha1, + SignatureTreatment = OAuthSignatureTreatment.Escaped, + ConsumerKey = consumerKey, + ConsumerSecret = consumerSecret, + Token = accessToken, + TokenSecret = accessTokenSecret + }; + return authenticator; } public void Authenticate(IRestClient client, IRestRequest request) { var workflow = new OAuthWorkflow - { - ConsumerKey = ConsumerKey, - ConsumerSecret = ConsumerSecret, - ParameterHandling = ParameterHandling, - SignatureMethod = SignatureMethod, - SignatureTreatment = SignatureTreatment, - Verifier = Verifier, - Version = Version, - CallbackUrl = CallbackUrl, - SessionHandle = SessionHandle, - Token = Token, - TokenSecret = TokenSecret, - ClientUsername = ClientUsername, - ClientPassword = ClientPassword - }; + { + ConsumerKey = ConsumerKey, + ConsumerSecret = ConsumerSecret, + ParameterHandling = ParameterHandling, + SignatureMethod = SignatureMethod, + SignatureTreatment = SignatureTreatment, + Verifier = Verifier, + Version = Version, + CallbackUrl = CallbackUrl, + SessionHandle = SessionHandle, + Token = Token, + TokenSecret = TokenSecret, + ClientUsername = ClientUsername, + ClientPassword = ClientPassword + }; AddOAuthData(client, request, workflow); } @@ -201,30 +219,32 @@ private void AddOAuthData(IRestClient client, IRestRequest request, OAuthWorkflo // or implement a seperate class for each OAuth version if (!request.AlwaysMultipartFormData && !request.Files.Any()) { - foreach (var p in client.DefaultParameters.Where(p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString)) - { - parameters.Add(new WebPair(p.Name, p.Value.ToString())); - } - - foreach (var p in request.Parameters.Where(p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString)) - { - parameters.Add(new WebPair(p.Name, p.Value.ToString())); - } + parameters.AddRange( + client.DefaultParameters + .Where(p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString) + .Select(p => new WebPair(p.Name, p.Value.ToString()))); + + + parameters.AddRange( + request.Parameters + .Where(p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString) + .Select(p => new WebPair(p.Name, p.Value.ToString()))); } else { // if we are sending a multipart request, only the "oauth_" parameters should be included in the signature - foreach (var p in client.DefaultParameters.Where( - p => (p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString) && p.Name.StartsWith("oauth_"))) - { - parameters.Add(new WebPair(p.Name, p.Value.ToString())); - } - - foreach (var p in request.Parameters.Where( - p => (p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString) && p.Name.StartsWith("oauth_"))) - { - parameters.Add(new WebPair(p.Name, p.Value.ToString())); - } + + parameters.AddRange( + client.DefaultParameters + .Where(p => (p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString) + && p.Name.StartsWith("oauth_")) + .Select(p => new WebPair(p.Name, p.Value.ToString()))); + + parameters.AddRange( + request.Parameters + .Where(p => (p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString) + && p.Name.StartsWith("oauth_")) + .Select(p => new WebPair(p.Name, p.Value.ToString()))); } switch (Type) @@ -261,13 +281,14 @@ private void AddOAuthData(IRestClient client, IRestRequest request, OAuthWorkflo case OAuthParameterHandling.UrlOrPostParameters: parameters.Add("oauth_signature", oauth.Signature); - - foreach (var parameter in parameters.Where(parameter => - !parameter.Name.IsNullOrBlank() && - (parameter.Name.StartsWith("oauth_") || parameter.Name.StartsWith("x_auth_")))) - { - request.AddParameter(parameter.Name, HttpUtility.UrlDecode(parameter.Value)); - } + request.Parameters.AddRange( + parameters.Where(p => !p.Name.IsNullOrBlank() && + (p.Name.StartsWith("oauth_") || p.Name.StartsWith("x_auth_"))) + .Select(p => new Parameter + { + Name = p.Name, + Value = HttpUtility.UrlDecode(p.Value) + })); break; default: @@ -287,20 +308,23 @@ private string GetAuthorizationHeader(WebPairCollection parameters) parameters.Sort((l, r) => l.Name.CompareTo(r.Name)); var parameterCount = 0; - var oathParameters = parameters.Where(parameter => - !parameter.Name.IsNullOrBlank() && - !parameter.Value.IsNullOrBlank() && - (parameter.Name.StartsWith("oauth_") || parameter.Name.StartsWith("x_auth_")) - ).ToList(); + var oathParameters = + parameters.Where(p => !p.Name.IsNullOrBlank() && + !p.Value.IsNullOrBlank() && + (p.Name.StartsWith("oauth_") || p.Name.StartsWith("x_auth_"))) + .ToList(); foreach (var parameter in oathParameters) { parameterCount++; + var format = parameterCount < oathParameters.Count ? "{0}=\"{1}\"," : "{0}=\"{1}\""; + sb.Append(format.FormatWith(parameter.Name, parameter.Value)); } var authorization = sb.ToString(); + return authorization; } } diff --git a/RestSharp/Authenticators/OAuth2Authenticator.cs b/RestSharp/Authenticators/OAuth2Authenticator.cs index d0658cd90..9cf016b45 100644 --- a/RestSharp/Authenticators/OAuth2Authenticator.cs +++ b/RestSharp/Authenticators/OAuth2Authenticator.cs @@ -17,7 +17,7 @@ using System; using System.Linq; -namespace RestSharp +namespace RestSharp.Authenticators { /// /// Base class for OAuth 2 Authenticators. @@ -35,7 +35,7 @@ public abstract class OAuth2Authenticator : IAuthenticator /// /// Access token to be used when authenticating. /// - private readonly string _accessToken; + private readonly string accessToken; /// /// Initializes a new instance of the class. @@ -45,7 +45,7 @@ public abstract class OAuth2Authenticator : IAuthenticator /// protected OAuth2Authenticator(string accessToken) { - _accessToken = accessToken; + this.accessToken = accessToken; } /// @@ -53,7 +53,7 @@ protected OAuth2Authenticator(string accessToken) /// public string AccessToken { - get { return _accessToken; } + get { return this.accessToken; } } public abstract void Authenticate(IRestClient client, IRestRequest request); @@ -93,7 +93,7 @@ public class OAuth2AuthorizationRequestHeaderAuthenticator : OAuth2Authenticator /// /// Stores the Authorization header value as "[tokenType] accessToken". used for performance. /// - private readonly string _authorizationValue; + private readonly string authorizationValue; /// /// Initializes a new instance of the class. @@ -117,7 +117,7 @@ public OAuth2AuthorizationRequestHeaderAuthenticator(string accessToken, string : base(accessToken) { // Conatenate during constructor so that it is only done once. can improve performance. - _authorizationValue = tokenType + " " + accessToken; + this.authorizationValue = tokenType + " " + accessToken; } public override void Authenticate(IRestClient client, IRestRequest request) @@ -125,7 +125,7 @@ public override void Authenticate(IRestClient client, IRestRequest request) // only add the Authorization parameter if it hasn't been added. if (!request.Parameters.Any(p => p.Name.Equals("Authorization", StringComparison.OrdinalIgnoreCase))) { - request.AddParameter("Authorization", _authorizationValue, ParameterType.HttpHeader); + request.AddParameter("Authorization", this.authorizationValue, ParameterType.HttpHeader); } } } diff --git a/RestSharp/Authenticators/SimpleAuthenticator.cs b/RestSharp/Authenticators/SimpleAuthenticator.cs index 72050fb59..5098ab78d 100644 --- a/RestSharp/Authenticators/SimpleAuthenticator.cs +++ b/RestSharp/Authenticators/SimpleAuthenticator.cs @@ -14,27 +14,27 @@ // limitations under the License. #endregion -namespace RestSharp +namespace RestSharp.Authenticators { public class SimpleAuthenticator : IAuthenticator { - private readonly string _usernameKey; - private readonly string _username; - private readonly string _passwordKey; - private readonly string _password; + private readonly string usernameKey; + private readonly string username; + private readonly string passwordKey; + private readonly string password; public SimpleAuthenticator(string usernameKey, string username, string passwordKey, string password) { - _usernameKey = usernameKey; - _username = username; - _passwordKey = passwordKey; - _password = password; + this.usernameKey = usernameKey; + this.username = username; + this.passwordKey = passwordKey; + this.password = password; } public void Authenticate(IRestClient client, IRestRequest request) { - request.AddParameter(_usernameKey, _username); - request.AddParameter(_passwordKey, _password); + request.AddParameter(this.usernameKey, this.username); + request.AddParameter(this.passwordKey, this.password); } } } diff --git a/RestSharp/Compression/ZLib/Crc32.cs b/RestSharp/Compression/ZLib/Crc32.cs index 459885078..1cd559229 100644 --- a/RestSharp/Compression/ZLib/Crc32.cs +++ b/RestSharp/Compression/ZLib/Crc32.cs @@ -35,7 +35,7 @@ #if WINDOWS_PHONE using System; -using Interop = System.Runtime.InteropServices; +using System.IO; namespace RestSharp.Compression.ZLib { @@ -45,29 +45,60 @@ namespace RestSharp.Compression.ZLib /// directly by applications wishing to create, read, or manipulate zip archive /// files. /// - internal class CRC32 + internal class Crc32 { - /// - /// indicates the total number of bytes read on the CRC stream. - /// This is used when writing the ZipDirEntry when compressing files. - /// - public Int64 TotalBytesRead + // private member vars + private static readonly uint[] crc32Table; + private const int BUFFER_SIZE = 8192; + private uint runningCrc32Result = 0xFFFFFFFF; + + // pre-initialize the crc table for speed of lookup. + static Crc32() { - get + unchecked { - return _TotalBytesRead; + // This is the official polynomial used by CRC32 in PKZip. + // Often the polynomial is shown reversed as 0x04C11DB7. + const uint dwPolynomial = 0xEDB88320; + + crc32Table = new uint[256]; + + for (uint i = 0; i < 256; i++) + { + var dwCrc = i; + + for (uint j = 8; j > 0; j--) + { + if ((dwCrc & 1) == 1) + { + dwCrc = (dwCrc >> 1) ^ dwPolynomial; + } + else + { + dwCrc >>= 1; + } + } + + crc32Table[i] = dwCrc; + } } } + /// + /// indicates the total number of bytes read on the CRC stream. + /// This is used when writing the ZipDirEntry when compressing files. + /// + public long TotalBytesRead { get; private set; } + /// /// Indicates the current CRC for all blocks slurped in. /// - public Int32 Crc32Result + public int Crc32Result { get { // return one's complement of the running result - return unchecked((Int32)(~_RunningCrc32Result)); + return unchecked((int) (~runningCrc32Result)); } } @@ -76,7 +107,7 @@ public Int32 Crc32Result /// /// The stream over which to calculate the CRC32 /// the CRC32 calculation - public Int32 GetCrc32(System.IO.Stream input) + public int GetCrc32(Stream input) { return GetCrc32AndCopy(input, null); } @@ -88,7 +119,7 @@ public Int32 GetCrc32(System.IO.Stream input) /// The stream over which to calculate the CRC32 /// The stream into which to deflate the input /// the CRC32 calculation - public Int32 GetCrc32AndCopy(System.IO.Stream input, System.IO.Stream output) + public int GetCrc32AndCopy(Stream input, Stream output) { if (input == null) throw new ZlibException("The input stream must not be null."); @@ -98,21 +129,28 @@ public Int32 GetCrc32AndCopy(System.IO.Stream input, System.IO.Stream output) //UInt32 crc32Result; //crc32Result = 0xFFFFFFFF; byte[] buffer = new byte[BUFFER_SIZE]; - int readSize = BUFFER_SIZE; + const int readSize = BUFFER_SIZE; - _TotalBytesRead = 0; + TotalBytesRead = 0; int count = input.Read(buffer, 0, readSize); - if (output != null) output.Write(buffer, 0, count); - _TotalBytesRead += count; + + if (output != null) + output.Write(buffer, 0, count); + + TotalBytesRead += count; + while (count > 0) { SlurpBlock(buffer, 0, count); count = input.Read(buffer, 0, readSize); - if (output != null) output.Write(buffer, 0, count); - _TotalBytesRead += count; + + if (output != null) + output.Write(buffer, 0, count); + + TotalBytesRead += count; } - return (Int32)(~_RunningCrc32Result); + return (int) (~runningCrc32Result); } } @@ -120,17 +158,17 @@ public Int32 GetCrc32AndCopy(System.IO.Stream input, System.IO.Stream output) /// Get the CRC32 for the given (word,byte) combo. This is a computation /// defined by PKzip. /// - /// The word to start with. - /// The byte to combine it with. + /// The word to start with. + /// The byte to combine it with. /// The CRC-ized result. - public Int32 ComputeCrc32(Int32 W, byte B) + public int ComputeCrc32(int w, byte b) { - return _InternalComputeCrc32((UInt32)W, B); + return InternalComputeCrc32((uint) w, b); } - internal Int32 _InternalComputeCrc32(UInt32 W, byte B) + internal int InternalComputeCrc32(uint w, byte b) { - return (Int32)(crc32Table[(W ^ B) & 0xFF] ^ (W >> 8)); + return (int) (crc32Table[(w ^ b) & 0xFF] ^ (w >> 8)); } /// @@ -148,53 +186,12 @@ public void SlurpBlock(byte[] block, int offset, int count) for (int i = 0; i < count; i++) { int x = offset + i; - _RunningCrc32Result = ((_RunningCrc32Result) >> 8) ^ crc32Table[(block[x]) ^ ((_RunningCrc32Result) & 0x000000FF)]; - } - - _TotalBytesRead += count; - } - - - // pre-initialize the crc table for speed of lookup. - static CRC32() - { - unchecked - { - // This is the official polynomial used by CRC32 in PKZip. - // Often the polynomial is shown reversed as 0x04C11DB7. - UInt32 dwPolynomial = 0xEDB88320; - UInt32 i, j; - - crc32Table = new UInt32[256]; - UInt32 dwCrc; - - for (i = 0; i < 256; i++) - { - dwCrc = i; - - for (j = 8; j > 0; j--) - { - if ((dwCrc & 1) == 1) - { - dwCrc = (dwCrc >> 1) ^ dwPolynomial; - } - else - { - dwCrc >>= 1; - } - } - - crc32Table[i] = dwCrc; - } + runningCrc32Result = ((runningCrc32Result) >> 8) ^ crc32Table[(block[x]) ^ ((runningCrc32Result) & 0x000000FF)]; } - } - // private member vars - private Int64 _TotalBytesRead; - private static UInt32[] crc32Table; - private const int BUFFER_SIZE = 8192; - private UInt32 _RunningCrc32Result = 0xFFFFFFFF; + TotalBytesRead += count; + } } /// @@ -216,27 +213,13 @@ static CRC32() /// DotNetZip library. /// /// - internal class CrcCalculatorStream : System.IO.Stream, System.IDisposable + internal class CrcCalculatorStream : Stream, IDisposable { - private static readonly Int64 UnsetLengthLimit = -99; - - private System.IO.Stream _innerStream; - private CRC32 _Crc32; - private Int64 _lengthLimit = -99; - private bool _leaveOpen; + private const long UNSET_LENGTH_LIMIT = -99; - /// - /// Gets the total number of bytes run through the CRC32 calculator. - /// - /// - /// - /// This is either the total number of bytes read, or the total number of bytes - /// written, depending on the direction of this stream. - /// - public Int64 TotalBytesSlurped - { - get { return _Crc32.TotalBytesRead; } - } + private readonly Stream innerStream; + private readonly Crc32 crc32; + private readonly long lengthLimit; /// /// The default constructor. @@ -246,8 +229,8 @@ public Int64 TotalBytesSlurped /// open upon Close(). /// /// The underlying stream - public CrcCalculatorStream(System.IO.Stream stream) - : this(true, CrcCalculatorStream.UnsetLengthLimit, stream) { } + public CrcCalculatorStream(Stream stream) + : this(true, UNSET_LENGTH_LIMIT, stream) { } /// /// The constructor allows the caller to specify how to handle the underlying @@ -256,8 +239,8 @@ public CrcCalculatorStream(System.IO.Stream stream) /// The underlying stream /// true to leave the underlying stream /// open upon close of the CrcCalculatorStream.; false otherwise. - public CrcCalculatorStream(System.IO.Stream stream, bool leaveOpen) - : this(leaveOpen, CrcCalculatorStream.UnsetLengthLimit, stream) { } + public CrcCalculatorStream(Stream stream, bool leaveOpen) + : this(leaveOpen, UNSET_LENGTH_LIMIT, stream) { } /// /// A constructor allowing the specification of the length of the stream to read. @@ -268,7 +251,7 @@ public CrcCalculatorStream(System.IO.Stream stream, bool leaveOpen) /// /// The underlying stream /// The length of the stream to slurp - public CrcCalculatorStream(System.IO.Stream stream, Int64 length) + public CrcCalculatorStream(Stream stream, long length) : this(true, length, stream) { if (length < 0) @@ -283,7 +266,7 @@ public CrcCalculatorStream(System.IO.Stream stream, Int64 length) /// The length of the stream to slurp /// true to leave the underlying stream /// open upon close of the CrcCalculatorStream.; false otherwise. - public CrcCalculatorStream(System.IO.Stream stream, Int64 length, bool leaveOpen) + public CrcCalculatorStream(Stream stream, long length, bool leaveOpen) : this(leaveOpen, length, stream) { if (length < 0) @@ -296,32 +279,34 @@ public CrcCalculatorStream(System.IO.Stream stream, Int64 length, bool leaveOpen // is no length set. So we validate the length limit in those ctors that use an // explicit param, otherwise we don't validate, because it could be our special // value. - private CrcCalculatorStream(bool leaveOpen, Int64 length, System.IO.Stream stream) - : base() + private CrcCalculatorStream(bool leaveOpen, long length, Stream stream) { - _innerStream = stream; - _Crc32 = new CRC32(); - _lengthLimit = length; - _leaveOpen = leaveOpen; + innerStream = stream; + crc32 = new Crc32(); + lengthLimit = length; + LeaveOpen = leaveOpen; } + /// + /// Gets the total number of bytes run through the CRC32 calculator. + /// + /// + /// + /// This is either the total number of bytes read, or the total number of bytes + /// written, depending on the direction of this stream. + /// + public long TotalBytesSlurped { get { return crc32.TotalBytesRead; } } + /// /// Provides the current CRC for all blocks slurped in. /// - public Int32 Crc - { - get { return _Crc32.Crc32Result; } - } + public int Crc { get { return crc32.Crc32Result; } } /// /// Indicates whether the underlying stream will be left open when the /// CrcCalculatorStream is Closed. /// - public bool LeaveOpen - { - get { return _leaveOpen; } - set { _leaveOpen = value; } - } + public bool LeaveOpen { get; set; } /// /// Read from the stream @@ -342,17 +327,21 @@ public override int Read(byte[] buffer, int offset, int count) // calling ReadToEnd() on it, We can "over-read" the zip data and get a // corrupt string. The length limits that, prevents that problem. - if (_lengthLimit != CrcCalculatorStream.UnsetLengthLimit) + if (lengthLimit != UNSET_LENGTH_LIMIT) { - if (_Crc32.TotalBytesRead >= _lengthLimit) return 0; // EOF - Int64 bytesRemaining = _lengthLimit - _Crc32.TotalBytesRead; - if (bytesRemaining < count) bytesToRead = (int)bytesRemaining; + if (crc32.TotalBytesRead >= lengthLimit) + return 0; // EOF + + long bytesRemaining = lengthLimit - crc32.TotalBytesRead; + + if (bytesRemaining < count) + bytesToRead = (int) bytesRemaining; } - int n = _innerStream.Read(buffer, offset, bytesToRead); + int n = innerStream.Read(buffer, offset, bytesToRead); if (n > 0) - _Crc32.SlurpBlock(buffer, offset, n); + crc32.SlurpBlock(buffer, offset, n); return n; } @@ -366,9 +355,9 @@ public override int Read(byte[] buffer, int offset, int count) public override void Write(byte[] buffer, int offset, int count) { if (count > 0) - _Crc32.SlurpBlock(buffer, offset, count); + crc32.SlurpBlock(buffer, offset, count); - _innerStream.Write(buffer, offset, count); + innerStream.Write(buffer, offset, count); } /// @@ -376,7 +365,7 @@ public override void Write(byte[] buffer, int offset, int count) /// public override bool CanRead { - get { return _innerStream.CanRead; } + get { return innerStream.CanRead; } } /// @@ -384,7 +373,7 @@ public override bool CanRead /// public override bool CanSeek { - get { return _innerStream.CanSeek; } + get { return innerStream.CanSeek; } } /// @@ -392,7 +381,7 @@ public override bool CanSeek /// public override bool CanWrite { - get { return _innerStream.CanWrite; } + get { return innerStream.CanWrite; } } /// @@ -400,7 +389,7 @@ public override bool CanWrite /// public override void Flush() { - _innerStream.Flush(); + innerStream.Flush(); } /// @@ -408,13 +397,7 @@ public override void Flush() /// public override long Length { - get - { - if (_lengthLimit == CrcCalculatorStream.UnsetLengthLimit) - return _innerStream.Length; - else - return _lengthLimit; - } + get { return lengthLimit == UNSET_LENGTH_LIMIT ? innerStream.Length : lengthLimit; } } /// @@ -422,7 +405,7 @@ public override long Length /// public override long Position { - get { return _Crc32.TotalBytesRead; } + get { return crc32.TotalBytesRead; } set { throw new NotImplementedException(); } } @@ -432,7 +415,7 @@ public override long Position /// N/A /// N/A /// N/A - public override long Seek(long offset, System.IO.SeekOrigin origin) + public override long Seek(long offset, SeekOrigin origin) { throw new NotImplementedException(); } @@ -446,7 +429,6 @@ public override void SetLength(long value) throw new NotImplementedException(); } - void IDisposable.Dispose() { Close(); @@ -459,8 +441,8 @@ public override void Close() { base.Close(); - if (!_leaveOpen) - _innerStream.Close(); + if (!LeaveOpen) + innerStream.Close(); } } } diff --git a/RestSharp/Compression/ZLib/GZipStream.cs b/RestSharp/Compression/ZLib/GZipStream.cs index 491762656..e507b2528 100644 --- a/RestSharp/Compression/ZLib/GZipStream.cs +++ b/RestSharp/Compression/ZLib/GZipStream.cs @@ -30,6 +30,7 @@ using System; using System.IO; +using System.Text; namespace RestSharp.Compression.ZLib { @@ -73,7 +74,7 @@ namespace RestSharp.Compression.ZLib /// /// /// - internal class GZipStream : System.IO.Stream + internal class GZipStream : Stream { // GZip format // source: http://tools.ietf.org/html/rfc1952 @@ -128,15 +129,15 @@ internal class GZipStream : System.IO.Stream /// property will return null (Nothing in VB). /// /// - public String Comment + public string Comment { - get { return _Comment; } + get { return comment; } set { - if (_disposed) + if (disposed) throw new ObjectDisposedException("GZipStream"); - _Comment = value; + comment = value; } } @@ -157,31 +158,31 @@ public String Comment /// bytestream, the property will return null (Nothing in VB). /// /// - public String FileName + public string FileName { - get { return _FileName; } + get { return fileName; } set { - if (_disposed) + if (disposed) throw new ObjectDisposedException("GZipStream"); - _FileName = value; + fileName = value; - if (_FileName == null) + if (fileName == null) return; - if (_FileName.IndexOf("/") != -1) + if (fileName.IndexOf("/") != -1) { - _FileName = _FileName.Replace("/", "\\"); + fileName = fileName.Replace("/", "\\"); } - if (_FileName.EndsWith("\\")) + if (fileName.EndsWith("\\")) throw new Exception("Illegal filename"); - if (_FileName.IndexOf("\\") != -1) + if (fileName.IndexOf("\\") != -1) { // trim any leading path - _FileName = Path.GetFileName(_FileName); + fileName = Path.GetFileName(fileName); } } } @@ -202,14 +203,13 @@ public String FileName /// /// This is used for internal error checking. You probably don't need to look at this property. /// - public int Crc32 { get { return _Crc32; } } + public int Crc32 { get; private set; } - internal ZlibBaseStream _baseStream; - bool _disposed; - bool _firstReadDone; - string _FileName; - string _Comment; - int _Crc32; + internal ZlibBaseStream BaseStream; + bool disposed; + bool firstReadDone; + string fileName; + string comment; /// /// Create a GZipStream using the specified CompressionMode and the specified CompressionLevel, @@ -273,7 +273,7 @@ public String FileName /// A tuning knob to trade speed for effectiveness. public GZipStream(Stream stream) { - _baseStream = new ZlibBaseStream(stream, ZlibStreamFlavor.GZIP, false); + BaseStream = new ZlibBaseStream(stream, ZlibStreamFlavor.GZIP, false); } #region Zlib properties @@ -283,11 +283,13 @@ public GZipStream(Stream stream) /// virtual public FlushType FlushMode { - get { return (this._baseStream._flushMode); } + get { return (BaseStream.flushMode); } set { - if (_disposed) throw new ObjectDisposedException("GZipStream"); - this._baseStream._flushMode = value; + if (disposed) + throw new ObjectDisposedException("GZipStream"); + + BaseStream.flushMode = value; } } @@ -309,32 +311,32 @@ virtual public FlushType FlushMode /// public int BufferSize { - get { return this._baseStream._bufferSize; } + get { return BaseStream.bufferSize; } set { - if (_disposed) + if (disposed) throw new ObjectDisposedException("GZipStream"); - if (this._baseStream._workingBuffer != null) + if (BaseStream.workingBuffer != null) throw new ZlibException("The working buffer is already set."); - if (value < ZlibConstants.WorkingBufferSizeMin) - throw new ZlibException(String.Format("Don't be silly. {0} bytes?? Use a bigger buffer.", value)); + if (value < ZlibConstants.WORKING_BUFFER_SIZE_MIN) + throw new ZlibException(string.Format("Don't be silly. {0} bytes?? Use a bigger buffer.", value)); - this._baseStream._bufferSize = value; + BaseStream.bufferSize = value; } } /// Returns the total number of bytes input so far. virtual public long TotalIn { - get { return this._baseStream._z.TotalBytesIn; } + get { return BaseStream.z.TotalBytesIn; } } /// Returns the total number of bytes output so far. virtual public long TotalOut { - get { return this._baseStream._z.TotalBytesOut; } + get { return BaseStream.z.TotalBytesOut; } } #endregion @@ -352,15 +354,15 @@ protected override void Dispose(bool disposing) { try { - if (!_disposed) + if (!disposed) { - if (disposing && (this._baseStream != null)) + if (disposing && (BaseStream != null)) { - this._baseStream.Close(); - this._Crc32 = _baseStream.Crc32; + BaseStream.Close(); + Crc32 = BaseStream.Crc32; } - _disposed = true; + disposed = true; } } finally @@ -379,10 +381,10 @@ public override bool CanRead { get { - if (_disposed) + if (disposed) throw new ObjectDisposedException("GZipStream"); - return _baseStream._stream.CanRead; + return BaseStream.stream.CanRead; } } @@ -407,10 +409,10 @@ public override bool CanWrite { get { - if (_disposed) + if (disposed) throw new ObjectDisposedException("GZipStream"); - return _baseStream._stream.CanWrite; + return BaseStream.stream.CanWrite; } } @@ -419,10 +421,10 @@ public override bool CanWrite /// public override void Flush() { - if (_disposed) + if (disposed) throw new ObjectDisposedException("GZipStream"); - _baseStream.Flush(); + BaseStream.Flush(); } /// @@ -446,8 +448,8 @@ public override long Position { get { - if (this._baseStream._streamMode == ZlibBaseStream.StreamMode.Reader) - return this._baseStream._z.TotalBytesIn + this._baseStream._gzipHeaderByteCount; + if (BaseStream.streamMode == ZlibBaseStream.StreamMode.Reader) + return BaseStream.z.TotalBytesIn + BaseStream.GzipHeaderByteCount; return 0; } @@ -485,19 +487,19 @@ public override long Position /// the number of bytes actually read public override int Read(byte[] buffer, int offset, int count) { - if (_disposed) + if (disposed) throw new ObjectDisposedException("GZipStream"); - int n = _baseStream.Read(buffer, offset, count); + int n = BaseStream.Read(buffer, offset, count); // Console.WriteLine("GZipStream::Read(buffer, off({0}), c({1}) = {2}", offset, count, n); // Console.WriteLine( Util.FormatByteArray(buffer, offset, n) ); - if (!_firstReadDone) + if (!firstReadDone) { - _firstReadDone = true; - FileName = _baseStream._GzipFileName; - Comment = _baseStream._GzipComment; + firstReadDone = true; + FileName = BaseStream.GzipFileName; + Comment = BaseStream.GzipComment; } return n; @@ -525,13 +527,13 @@ public override void SetLength(long value) #endregion - internal static System.DateTime _unixEpoch = new System.DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); - internal static System.Text.Encoding iso8859dash1 = System.Text.Encoding.GetEncoding("iso-8859-1"); + internal static DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + internal static Encoding Iso8859Dash1 = Encoding.GetEncoding("iso-8859-1"); private int EmitHeader() { - byte[] commentBytes = (Comment == null) ? null : iso8859dash1.GetBytes(Comment); - byte[] filenameBytes = (FileName == null) ? null : iso8859dash1.GetBytes(FileName); + byte[] commentBytes = (Comment == null) ? null : Iso8859Dash1.GetBytes(Comment); + byte[] filenameBytes = (FileName == null) ? null : Iso8859Dash1.GetBytes(FileName); int cbLength = (Comment == null) ? 0 : commentBytes.Length + 1; int fnLength = (FileName == null) ? 0 : filenameBytes.Length + 1; @@ -539,12 +541,14 @@ private int EmitHeader() int bufferLength = 10 + cbLength + fnLength; byte[] header = new byte[bufferLength]; int i = 0; + // ID header[i++] = 0x1F; header[i++] = 0x8B; // compression method header[i++] = 8; + byte flag = 0; if (Comment != null) @@ -560,9 +564,10 @@ private int EmitHeader() if (!LastModified.HasValue) LastModified = DateTime.Now; - System.TimeSpan delta = LastModified.Value - _unixEpoch; - Int32 timet = (Int32)delta.TotalSeconds; + TimeSpan delta = LastModified.Value - UnixEpoch; + int timet = (int) delta.TotalSeconds; Array.Copy(BitConverter.GetBytes(timet), 0, header, i, 4); + i += 4; // xflg @@ -578,6 +583,7 @@ private int EmitHeader() if (fnLength != 0) { Array.Copy(filenameBytes, 0, header, i, fnLength - 1); + i += fnLength - 1; header[i++] = 0; // terminate } @@ -586,11 +592,12 @@ private int EmitHeader() if (cbLength != 0) { Array.Copy(commentBytes, 0, header, i, cbLength - 1); + i += cbLength - 1; header[i++] = 0; // terminate } - _baseStream._stream.Write(header, 0, header.Length); + BaseStream.stream.Write(header, 0, header.Length); return header.Length; // bytes written } diff --git a/RestSharp/Compression/ZLib/InfTree.cs b/RestSharp/Compression/ZLib/InfTree.cs index e7dbb4502..8d1e1af09 100644 --- a/RestSharp/Compression/ZLib/InfTree.cs +++ b/RestSharp/Compression/ZLib/InfTree.cs @@ -82,27 +82,98 @@ sealed internal class InfTree internal const int fixed_bl = 9; internal const int fixed_bd = 5; - //UPGRADE_NOTE: Final was removed from the declaration of 'fixed_tl'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] fixed_tl = new int[]{96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 192, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 160, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 224, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 144, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 208, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 176, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 240, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 200, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 232, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 216, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 184, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 248, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 196, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 164, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 228, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 148, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 180, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 244, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 172, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 236, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 156, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 220, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 188, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 252, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 194, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 162, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 226, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 146, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 210, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 178, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 202, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 234, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 154, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 218, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 186, - 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 198, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 166, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 230, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 182, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 246, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 206, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 238, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 158, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 222, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 190, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254, 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 193, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 225, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 145, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 209, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 177, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 241, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 201, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 233, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 153, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 217, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 185, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 249, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 197, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 165, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 229, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 213, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 181, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 245, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 205, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 173, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 157, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 221, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 189, 0, 8, - 14, 0, 8, 142, 0, 8, 78, 0, 9, 253, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 195, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 163, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 147, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 211, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 243, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 203, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 171, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 235, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 155, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187, 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 251, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 199, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 167, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 231, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 151, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 215, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 183, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 247, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 207, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 175, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 159, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 223, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 191, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 255}; + // UPGRADE_NOTE: Final was removed from the declaration of 'fixed_tl'. + // "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] fixed_tl = + { + 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 192, 80, 7, 10, 0, 8, 96, 0, + 8, 32, 0, 9, 160, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 224, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 144, 83, 7, 59, + 0, 8, 120, 0, 8, 56, 0, 9, 208, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 176, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, + 240, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 200, 81, 7, 13, 0, 8, + 100, 0, 8, 36, 0, 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 232, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152, + 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 216, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 184, 0, 8, 12, 0, 8, 140, 0, + 8, 76, 0, 9, 248, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 196, 81, 7, + 11, 0, 8, 98, 0, 8, 34, 0, 9, 164, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 228, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, + 9, 148, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 180, 0, 8, 10, 0, 8, + 138, 0, 8, 74, 0, 9, 244, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204, + 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 172, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 236, 80, 7, 9, 0, 8, 94, 0, 8, + 30, 0, 9, 156, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 220, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 188, 0, 8, 14, + 0, 8, 142, 0, 8, 78, 0, 9, 252, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, + 9, 194, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 162, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 226, 80, 7, 6, 0, 8, 89, + 0, 8, 25, 0, 9, 146, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 210, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 178, 0, + 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, + 53, 0, 9, 202, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 234, 80, 7, 8, + 0, 8, 93, 0, 8, 29, 0, 9, 154, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 218, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, + 9, 186, 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, + 115, 0, 8, 51, 0, 9, 198, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 166, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 230, + 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, 19, 0, 8, 107, 0, + 8, 43, 0, 9, 182, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 246, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, + 51, 0, 8, 119, 0, 8, 55, 0, 9, 206, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174, 0, 8, 7, 0, 8, 135, 0, 8, 71, + 0, 9, 238, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 158, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 222, 82, 7, 27, 0, + 8, 111, 0, 8, 47, 0, 9, 190, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254, 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, + 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 193, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, + 0, 8, 64, 0, 9, 225, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 145, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 209, 81, + 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 177, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 241, 80, 7, 4, 0, 8, 84, 0, 8, 20, + 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 201, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, 0, 8, 4, 0, + 8, 132, 0, 8, 68, 0, 9, 233, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 153, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, + 217, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 185, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 249, 80, 7, 3, 0, 8, 82, + 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 197, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 165, 0, + 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 229, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149, 84, 7, 67, 0, 8, 122, 0, 8, 58, + 0, 9, 213, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 181, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 245, 80, 7, 5, 0, + 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 205, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, + 173, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 157, 84, 7, 99, 0, 8, 126, + 0, 8, 62, 0, 9, 221, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 189, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 253, 96, + 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 195, 80, 7, 10, 0, 8, 97, 0, 8, + 33, 0, 9, 163, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 147, 83, 7, 59, 0, + 8, 121, 0, 8, 57, 0, 9, 211, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, + 243, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 203, 81, 7, 13, 0, 8, + 101, 0, 8, 37, 0, 9, 171, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 235, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 155, + 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187, 0, 8, 13, 0, 8, 141, 0, + 8, 77, 0, 9, 251, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 199, 81, 7, + 11, 0, 8, 99, 0, 8, 35, 0, 9, 167, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 231, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, + 9, 151, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 215, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 183, 0, 8, 11, 0, 8, + 139, 0, 8, 75, 0, 9, 247, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 207, + 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 175, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, 9, 0, 8, 95, 0, 8, + 31, 0, 9, 159, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 223, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 191, 0, 8, 15, + 0, 8, 143, 0, 8, 79, 0, 9, 255 + }; //UPGRADE_NOTE: Final was removed from the declaration of 'fixed_td'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] fixed_td = new int[] { 80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5, 4097, 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385, 80, 5, 3, 88, 5, 513, 84, 5, 33, 92, 5, 8193, 82, 5, 9, 90, 5, 2049, 86, 5, 129, 192, 5, 24577, 80, 5, 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145, 81, 5, 7, 89, 5, 1537, 85, 5, 97, 93, 5, 24577, 80, 5, 4, 88, 5, 769, 84, 5, 49, 92, 5, 12289, 82, 5, 13, 90, 5, 3073, 86, 5, 193, 192, 5, 24577 }; + internal static readonly int[] fixed_td = + { + 80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5, 4097, 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385, 80, 5, 3, 88, 5, + 513, 84, 5, 33, 92, 5, 8193, 82, 5, 9, 90, 5, 2049, 86, 5, 129, 192, 5, 24577, 80, 5, 2, 87, 5, 385, 83, 5, 25, + 91, 5, 6145, 81, 5, 7, 89, 5, 1537, 85, 5, 97, 93, 5, 24577, 80, 5, 4, 88, 5, 769, 84, 5, 49, 92, 5, 12289, 82, + 5, 13, 90, 5, 3073, 86, 5, 193, 192, 5, 24577 + }; // Tables for deflate from PKZIP's appnote.txt. //UPGRADE_NOTE: Final was removed from the declaration of 'cplens'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cplens = new int[] { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 }; + internal static readonly int[] cplens = + { + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, + 258, 0, 0 + }; // see note #13 above about 258 //UPGRADE_NOTE: Final was removed from the declaration of 'cplext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cplext = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112 }; + internal static readonly int[] cplext = + { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112 + }; //UPGRADE_NOTE: Final was removed from the declaration of 'cpdist'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cpdist = new int[] { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 }; + internal static readonly int[] cpdist = + { + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, + 6145, 8193, 12289, 16385, 24577 + }; //UPGRADE_NOTE: Final was removed from the declaration of 'cpdext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cpdext = new int[] { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 }; + internal static readonly int[] cpdext = + { + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 + }; // If BMAX needs to be larger than 16, then h and x[] should be uLong. internal const int BMAX = 15; // maximum bit length of any code @@ -122,15 +193,12 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of // lengths), or Z_MEM_ERROR if not enough memory. - int a; // counter for codes of length k - int f; // i repeats in table every f entries int g; // maximum code length int h; // table level int i; // counter, current code int j; // counter int k; // number of bits in current code int l; // bits per table (returned in m) - int mask; // (1 << w) - 1, to avoid cc -O bug on HP int p; // pointer into c[], b[], or v[] int q; // points to current table int w; // bits before this table == (l * h) @@ -154,6 +222,7 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ // null input--all zero length codes t[0] = -1; m[0] = 0; + return Z_OK; } @@ -161,8 +230,10 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ l = m[0]; for (j = 1; j <= BMAX; j++) + { if (c[j] != 0) break; + } k = j; // minimum code length @@ -243,12 +314,14 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ // go through the bit lengths (k already is bits in shortest code) for (; k <= g; k++) { - a = c[k]; + int a = c[k]; // counter for codes of length k while (a-- != 0) { // here i is the Huffman code of length k bits for value *p // make tables up to required level + int f; // i repeats in table every f entries + while (k > w + l) { h++; @@ -296,7 +369,7 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ r[0] = (sbyte)j; // bits in this table r[1] = (sbyte)l; // bits to dump before this table j = SharedUtils.URShift(i, (w - l)); - r[2] = (int)(q - u[h - 1] - j); // offset to this table + r[2] = q - u[h - 1] - j; // offset to this table Array.Copy(r, 0, hp, (u[h - 1] + j) * 3, 3); // connect to last table } else @@ -325,6 +398,7 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ // fill code-like entries with r f = 1 << (k - w); + for (j = SharedUtils.URShift(i, w); j < z; j += f) { Array.Copy(r, 0, hp, (q + j) * 3, 3); @@ -339,7 +413,7 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ i ^= j; // backup over finished tables - mask = (1 << w) - 1; // needed on HP, cc -O bug + int mask = (1 << w) - 1; // (1 << w) - 1, to avoid cc -O bug on HP while ((i & mask) != x[h]) { @@ -469,6 +543,7 @@ private void initWorkArea(int vsize) // for(int i=0; i m) t = m; - Array.Copy(_codec.InputBuffer, p, window, q, t); - p += t; n -= t; - q += t; m -= t; + Array.Copy(codec.InputBuffer, p, window, q, t); + p += t; + n -= t; + q += t; + m -= t; if ((left -= t) != 0) break; @@ -342,17 +380,18 @@ internal int Process(int r) } else { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; + return Flush(r); } - ; n--; - b |= (_codec.InputBuffer[p++] & 0xff) << k; + b |= (codec.InputBuffer[p++] & 0xff) << k; k += 8; } @@ -361,13 +400,15 @@ internal int Process(int r) if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) { mode = BAD; - _codec.Message = "too many length or distance symbols"; + codec.Message = "too many length or distance symbols"; r = ZlibConstants.Z_DATA_ERROR; - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; + return Flush(r); } @@ -384,13 +425,14 @@ internal int Process(int r) blens[i] = 0; } } - { - b = SharedUtils.URShift(b, (14)); k -= (14); + b = SharedUtils.URShift(b, (14)); + k -= (14); } index = 0; mode = BTREE; + goto case BTREE; case BTREE: @@ -404,34 +446,36 @@ internal int Process(int r) } else { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; + return Flush(r); } - ; n--; - b |= (_codec.InputBuffer[p++] & 0xff) << k; + b |= (codec.InputBuffer[p++] & 0xff) << k; k += 8; } - blens[border[index++]] = b & 7; + blens[Border[index++]] = b & 7; { - b = SharedUtils.URShift(b, (3)); k -= (3); + b = SharedUtils.URShift(b, (3)); + k -= (3); } } while (index < 19) { - blens[border[index++]] = 0; + blens[Border[index++]] = 0; } bb[0] = 7; - t = inftree.inflate_trees_bits(blens, bb, tb, hufts, _codec); + t = inftree.inflate_trees_bits(blens, bb, tb, hufts, codec); if (t != ZlibConstants.Z_OK) { @@ -443,16 +487,18 @@ internal int Process(int r) mode = BAD; } - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; return Flush(r); } index = 0; mode = DTREE; + goto case DTREE; case DTREE: @@ -465,7 +511,7 @@ internal int Process(int r) break; } - int i, j, c; + int c; t = bb[0]; @@ -477,18 +523,18 @@ internal int Process(int r) } else { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; return Flush(r); } - ; n--; - b |= (_codec.InputBuffer[p++] & 0xff) << k; + b |= (codec.InputBuffer[p++] & 0xff) << k; k += 8; } @@ -497,19 +543,20 @@ internal int Process(int r) //System.err.println("null..."); } - t = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 1]; - c = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 2]; + t = hufts[(tb[0] + (b & inflateMask[t])) * 3 + 1]; + c = hufts[(tb[0] + (b & inflateMask[t])) * 3 + 2]; if (c < 16) { - b = SharedUtils.URShift(b, (t)); k -= (t); + b = SharedUtils.URShift(b, (t)); + k -= (t); blens[index++] = c; } else { // c == 16..18 - i = c == 18 ? 7 : c - 14; - j = c == 18 ? 11 : 3; + int i = c == 18 ? 7 : c - 14; + int j = c == 18 ? 11 : 3; while (k < (t + i)) { @@ -519,23 +566,26 @@ internal int Process(int r) } else { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; + return Flush(r); } - ; n--; - b |= (_codec.InputBuffer[p++] & 0xff) << k; + b |= (codec.InputBuffer[p++] & 0xff) << k; k += 8; } - b = SharedUtils.URShift(b, (t)); k -= (t); - j += (b & inflate_mask[i]); - b = SharedUtils.URShift(b, (i)); k -= (i); + b = SharedUtils.URShift(b, (t)); + k -= (t); + j += (b & inflateMask[i]); + b = SharedUtils.URShift(b, (i)); + k -= (i); i = index; t = table; @@ -544,13 +594,15 @@ internal int Process(int r) { blens = null; mode = BAD; - _codec.Message = "invalid bit length repeat"; + codec.Message = "invalid bit length repeat"; r = ZlibConstants.Z_DATA_ERROR; - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; + return Flush(r); } @@ -568,13 +620,13 @@ internal int Process(int r) tb[0] = -1; { - int[] bl = new int[] { 9 }; // must be <= 9 for lookahead assumptions - int[] bd = new int[] { 6 }; // must be <= 9 for lookahead assumptions + int[] bl = { 9 }; // must be <= 9 for lookahead assumptions + int[] bd = { 6 }; // must be <= 9 for lookahead assumptions int[] tl = new int[1]; int[] td = new int[1]; t = table; - t = inftree.inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), blens, bl, bd, tl, td, hufts, _codec); + t = inftree.inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), blens, bl, bd, tl, td, hufts, codec); if (t != ZlibConstants.Z_OK) { @@ -585,11 +637,13 @@ internal int Process(int r) } r = t; - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; + return Flush(r); } @@ -597,25 +651,27 @@ internal int Process(int r) } mode = CODES; + goto case CODES; case CODES: - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; if ((r = codes.Process(this, r)) != ZlibConstants.Z_STREAM_END) return Flush(r); r = ZlibConstants.Z_OK; - p = _codec.NextIn; - n = _codec.AvailableBytesIn; + p = codec.NextIn; + n = codec.AvailableBytesIn; b = bitb; k = bitk; q = write; - m = (int)(q < read ? read - q - 1 : end - q); + m = q < this.read ? this.read - q - 1 : this.end - q; if (last == 0) { @@ -629,48 +685,57 @@ internal int Process(int r) case DRY: write = q; r = Flush(r); - q = write; m = (int)(q < read ? read - q - 1 : end - q); + q = write; + + m = q < this.read ? this.read - q - 1 : this.end - q; if (read != write) { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; return Flush(r); } mode = DONE; + goto case DONE; case DONE: r = ZlibConstants.Z_STREAM_END; bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; + return Flush(r); case BAD: r = ZlibConstants.Z_DATA_ERROR; - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; + return Flush(r); default: r = ZlibConstants.Z_STREAM_ERROR; - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; + bitb = b; + bitk = k; + codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; write = q; + return Flush(r); } } @@ -705,28 +770,28 @@ internal int Flush(int r) int q; // local copies of source and destination pointers - p = _codec.NextOut; + p = codec.NextOut; q = read; // compute number of bytes to copy as far as end of window - n = (int)((q <= write ? write : end) - q); + n = (q <= this.write ? this.write : this.end) - q; - if (n > _codec.AvailableBytesOut) - n = _codec.AvailableBytesOut; + if (n > codec.AvailableBytesOut) + n = codec.AvailableBytesOut; if (n != 0 && r == ZlibConstants.Z_BUF_ERROR) r = ZlibConstants.Z_OK; // update counters - _codec.AvailableBytesOut -= n; - _codec.TotalBytesOut += n; + codec.AvailableBytesOut -= n; + codec.TotalBytesOut += n; // update check information if (checkfn != null) - _codec._Adler32 = check = Adler.Adler32(check, window, q, n); + codec.adler32 = check = Adler.Adler32(check, window, q, n); // copy as far as end of window - Array.Copy(window, q, _codec.OutputBuffer, p, n); + Array.Copy(window, q, codec.OutputBuffer, p, n); p += n; q += n; @@ -742,28 +807,28 @@ internal int Flush(int r) // compute bytes to copy n = write - q; - if (n > _codec.AvailableBytesOut) - n = _codec.AvailableBytesOut; + if (n > codec.AvailableBytesOut) + n = codec.AvailableBytesOut; if (n != 0 && r == ZlibConstants.Z_BUF_ERROR) r = ZlibConstants.Z_OK; // update counters - _codec.AvailableBytesOut -= n; - _codec.TotalBytesOut += n; + codec.AvailableBytesOut -= n; + codec.TotalBytesOut += n; // update check information if (checkfn != null) - _codec._Adler32 = check = Adler.Adler32(check, window, q, n); + codec.adler32 = check = Adler.Adler32(check, window, q, n); // copy - Array.Copy(window, q, _codec.OutputBuffer, p, n); + Array.Copy(window, q, codec.OutputBuffer, p, n); p += n; q += n; } // update pointers - _codec.NextOut = p; + codec.NextOut = p; read = q; // done @@ -773,8 +838,28 @@ internal int Flush(int r) sealed internal class InflateCodes { - //UPGRADE_NOTE: Final was removed from the declaration of 'inflate_mask'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - private static readonly int[] inflate_mask = new int[] { 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff }; + // UPGRADE_NOTE: Final was removed from the declaration of 'inflate_mask'. + // "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + private static readonly int[] inflateMask = + { + 0x00000000, + 0x00000001, + 0x00000003, + 0x00000007, + 0x0000000f, + 0x0000001f, + 0x0000003f, + 0x0000007f, + 0x000000ff, + 0x000001ff, + 0x000003ff, + 0x000007ff, + 0x00000fff, + 0x00001fff, + 0x00003fff, + 0x00007fff, + 0x0000ffff + }; // waiting for "i:"=input, // "o:"=output, @@ -796,7 +881,7 @@ sealed internal class InflateCodes internal int len; internal int[] tree; // pointer into tree - internal int tree_index = 0; + internal int tree_index; internal int need; // bits needed internal int lit; @@ -816,8 +901,8 @@ internal InflateCodes() { } internal void Init(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index) { mode = START; - lbits = (byte)bl; - dbits = (byte)bd; + lbits = (byte) bl; + dbits = (byte) bd; ltree = tl; ltree_index = tl_index; dtree = td; @@ -827,36 +912,38 @@ internal void Init(int bl, int bd, int[] tl, int tl_index, int[] td, int td_inde internal int Process(InflateBlocks blocks, int r) { - int j; // temporary storage - int tindex; // temporary pointer - int e; // extra bits or operation - int b = 0; // bit buffer - int k = 0; // bits in bit buffer - int p = 0; // input data pointer + int b; // bit buffer + int k; // bits in bit buffer + int p; // input data pointer int n; // bytes available there int q; // output window write pointer int m; // bytes to end of window or read pointer - int f; // pointer to copy strings from - ZlibCodec z = blocks._codec; + ZlibCodec z = blocks.codec; // copy input/output information to locals (UPDATE macro restores) p = z.NextIn; n = z.AvailableBytesIn; b = blocks.bitb; k = blocks.bitk; - q = blocks.write; m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + q = blocks.write; + m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; // process input and output based on current state while (true) { + int j; // temporary storage + int tindex; // temporary pointer + int e; // extra bits or operation + switch (mode) { // waiting for "i:"=input, "o:"=output, "x:"=nothing case START: // x: set up for LEN if (m >= 258 && n >= 10) { - blocks.bitb = b; blocks.bitk = k; + blocks.bitb = b; + blocks.bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; @@ -866,11 +953,13 @@ internal int Process(InflateBlocks blocks, int r) n = z.AvailableBytesIn; b = blocks.bitb; k = blocks.bitk; - q = blocks.write; m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + q = blocks.write; + m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; if (r != ZlibConstants.Z_OK) { mode = (r == ZlibConstants.Z_STREAM_END) ? WASH : BADCODE; + break; } } @@ -879,6 +968,7 @@ internal int Process(InflateBlocks blocks, int r) tree = ltree; tree_index = ltree_index; mode = LEN; + goto case LEN; case LEN: // i: get length/literal/eob next @@ -890,11 +980,13 @@ internal int Process(InflateBlocks blocks, int r) r = ZlibConstants.Z_OK; else { - blocks.bitb = b; blocks.bitk = k; + blocks.bitb = b; + blocks.bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; blocks.write = q; + return blocks.Flush(r); } @@ -903,7 +995,7 @@ internal int Process(InflateBlocks blocks, int r) k += 8; } - tindex = (tree_index + (b & inflate_mask[j])) * 3; + tindex = (tree_index + (b & inflateMask[j])) * 3; b = SharedUtils.URShift(b, (tree[tindex + 1])); k -= (tree[tindex + 1]); @@ -914,6 +1006,7 @@ internal int Process(InflateBlocks blocks, int r) // literal lit = tree[tindex + 2]; mode = LIT; + break; } @@ -923,6 +1016,7 @@ internal int Process(InflateBlocks blocks, int r) get_Renamed = e & 15; len = tree[tindex + 2]; mode = LENEXT; + break; } @@ -931,6 +1025,7 @@ internal int Process(InflateBlocks blocks, int r) // next table need = e; tree_index = tindex / 3 + tree[tindex + 2]; + break; } @@ -938,17 +1033,20 @@ internal int Process(InflateBlocks blocks, int r) { // end of block mode = WASH; + break; } mode = BADCODE; // invalid code z.Message = "invalid literal/length code"; r = ZlibConstants.Z_DATA_ERROR; - blocks.bitb = b; blocks.bitk = k; + blocks.bitb = b; + blocks.bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; blocks.write = q; + return blocks.Flush(r); case LENEXT: // i: getting length extra (have base) @@ -961,17 +1059,22 @@ internal int Process(InflateBlocks blocks, int r) else { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.bitb = b; + blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; blocks.write = q; + return blocks.Flush(r); } - n--; b |= (z.InputBuffer[p++] & 0xff) << k; + n--; + b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; } - len += (b & inflate_mask[j]); + len += (b & inflateMask[j]); b >>= j; k -= j; @@ -980,6 +1083,7 @@ internal int Process(InflateBlocks blocks, int r) tree = dtree; tree_index = dtree_index; mode = DIST; + goto case DIST; case DIST: // i: get distance next @@ -991,17 +1095,22 @@ internal int Process(InflateBlocks blocks, int r) r = ZlibConstants.Z_OK; else { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.bitb = b; + blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; blocks.write = q; + return blocks.Flush(r); } - n--; b |= (z.InputBuffer[p++] & 0xff) << k; + n--; + b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; } - tindex = (tree_index + (b & inflate_mask[j])) * 3; + tindex = (tree_index + (b & inflateMask[j])) * 3; b >>= tree[tindex + 1]; k -= tree[tindex + 1]; @@ -1013,6 +1122,7 @@ internal int Process(InflateBlocks blocks, int r) get_Renamed = e & 15; dist = tree[tindex + 2]; mode = DISTEXT; + break; } @@ -1021,15 +1131,20 @@ internal int Process(InflateBlocks blocks, int r) // next table need = e; tree_index = tindex / 3 + tree[tindex + 2]; + break; } mode = BADCODE; // invalid code z.Message = "invalid distance code"; r = ZlibConstants.Z_DATA_ERROR; - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.bitb = b; + blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; blocks.write = q; + return blocks.Flush(r); case DISTEXT: // i: getting distance extra @@ -1041,26 +1156,32 @@ internal int Process(InflateBlocks blocks, int r) r = ZlibConstants.Z_OK; else { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.bitb = b; + blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; blocks.write = q; + return blocks.Flush(r); } - n--; b |= (z.InputBuffer[p++] & 0xff) << k; + n--; + b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; } - dist += (b & inflate_mask[j]); + dist += (b & inflateMask[j]); b >>= j; k -= j; mode = COPY; + goto case COPY; case COPY: // o: copying bytes in window, waiting for space - f = q - dist; + int f = q - this.dist; // pointer to copy strings from while (f < 0) { @@ -1074,32 +1195,39 @@ internal int Process(InflateBlocks blocks, int r) { if (q == blocks.end && blocks.read != 0) { - q = 0; m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + q = 0; + m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; } if (m == 0) { - blocks.write = q; r = blocks.Flush(r); - q = blocks.write; m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + blocks.write = q; + r = blocks.Flush(r); + q = blocks.write; + m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; if (q == blocks.end && blocks.read != 0) { - q = 0; m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + q = 0; + m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; } if (m == 0) { - blocks.bitb = b; blocks.bitk = k; + blocks.bitb = b; + blocks.bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; blocks.write = q; + return blocks.Flush(r); } } } - blocks.window[q++] = blocks.window[f++]; m--; + blocks.window[q++] = blocks.window[f++]; + m--; if (f == blocks.end) f = 0; @@ -1115,32 +1243,42 @@ internal int Process(InflateBlocks blocks, int r) { if (q == blocks.end && blocks.read != 0) { - q = 0; m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + q = 0; + m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; } if (m == 0) { - blocks.write = q; r = blocks.Flush(r); - q = blocks.write; m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + blocks.write = q; + r = blocks.Flush(r); + q = blocks.write; + m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; if (q == blocks.end && blocks.read != 0) { - q = 0; m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + q = 0; + m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; } if (m == 0) { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.bitb = b; + blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; blocks.write = q; + return blocks.Flush(r); } } } r = ZlibConstants.Z_OK; - blocks.window[q++] = (byte)lit; m--; + blocks.window[q++] = (byte) lit; + m--; mode = START; + break; case WASH: // o: got eob, possibly more output @@ -1152,39 +1290,58 @@ internal int Process(InflateBlocks blocks, int r) p--; // can always return one } - blocks.write = q; r = blocks.Flush(r); - q = blocks.write; m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + blocks.write = q; + r = blocks.Flush(r); + q = blocks.write; + m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; if (blocks.read != blocks.write) { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.bitb = b; + blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; blocks.write = q; + return blocks.Flush(r); } mode = END; + goto case END; case END: r = ZlibConstants.Z_STREAM_END; - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.bitb = b; + blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; blocks.write = q; + return blocks.Flush(r); case BADCODE: // x: got error r = ZlibConstants.Z_DATA_ERROR; - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.bitb = b; + blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; blocks.write = q; + return blocks.Flush(r); default: r = ZlibConstants.Z_STREAM_ERROR; - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.bitb = b; + blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; blocks.write = q; + return blocks.Flush(r); } } @@ -1197,10 +1354,6 @@ internal int Process(InflateBlocks blocks, int r) internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InflateBlocks s, ZlibCodec z) { - int t; // temporary pointer - int[] tp; // temporary pointer - int tp_index; // temporary pointer - int e; // extra bits or operation int b; // bit buffer int k; // bits in bit buffer int p; // input data pointer @@ -1210,18 +1363,18 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t int ml; // mask for literal/length tree int md; // mask for distance tree int c; // bytes to copy - int d; // distance back to copy from - int r; // copy source pointer - - int tp_index_t_3; // (tp_index+t)*3 // load input, output, bit values - p = z.NextIn; n = z.AvailableBytesIn; b = s.bitb; k = s.bitk; - q = s.write; m = q < s.read ? s.read - q - 1 : s.end - q; + p = z.NextIn; + n = z.AvailableBytesIn; + b = s.bitb; + k = s.bitk; + q = s.write; + m = q < s.read ? s.read - q - 1 : s.end - q; // initialize masks - ml = inflate_mask[bl]; - md = inflate_mask[bd]; + ml = inflateMask[bl]; + md = inflateMask[bd]; // do until not enough input or output space for fast loop do @@ -1232,40 +1385,47 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t { // max bits for literal/length code n--; - b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; + b |= (z.InputBuffer[p++] & 0xff) << k; + k += 8; } - t = b & ml; - tp = tl; - tp_index = tl_index; - tp_index_t_3 = (tp_index + t) * 3; + int t = b & ml; // temporary pointer + int[] tp = tl; // temporary pointer + int tp_index = tl_index; // temporary pointer + int tp_index_t_3 = (tp_index + t) * 3; // (tp_index+t)*3 + int e; // extra bits or operation if ((e = tp[tp_index_t_3]) == 0) { - b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); + b >>= (tp[tp_index_t_3 + 1]); + k -= (tp[tp_index_t_3 + 1]); - s.window[q++] = (byte)tp[tp_index_t_3 + 2]; + s.window[q++] = (byte) tp[tp_index_t_3 + 2]; m--; + continue; } do { - b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); + b >>= (tp[tp_index_t_3 + 1]); + k -= (tp[tp_index_t_3 + 1]); if ((e & 16) != 0) { e &= 15; - c = tp[tp_index_t_3 + 2] + ((int)b & inflate_mask[e]); + c = tp[tp_index_t_3 + 2] + (b & inflateMask[e]); - b >>= e; k -= e; + b >>= e; + k -= e; // decode distance base of block to copy while (k < (15)) { // max bits for distance code n--; - b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; + b |= (z.InputBuffer[p++] & 0xff) << k; + k += 8; } t = b & md; @@ -1276,7 +1436,8 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t do { - b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); + b >>= (tp[tp_index_t_3 + 1]); + k -= (tp[tp_index_t_3 + 1]); if ((e & 16) != 0) { @@ -1287,15 +1448,20 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t { // get extra bits (up to 13) n--; - b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; + b |= (z.InputBuffer[p++] & 0xff) << k; + k += 8; } - d = tp[tp_index_t_3 + 2] + (b & inflate_mask[e]); - b >>= (e); k -= (e); + int d = tp[tp_index_t_3 + 2] + (b & inflateMask[e]); // distance back to copy from + + b >>= (e); + k -= (e); // do the copy m -= c; + int r; // copy source pointer + if (q >= d) { // offset before dest @@ -1311,13 +1477,16 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t else { Array.Copy(s.window, r, s.window, q, 2); - q += 2; r += 2; c -= 2; + q += 2; + r += 2; + c -= 2; } } else { // else offset after destination r = q - d; + do { r += s.end; // force pointer in window @@ -1342,7 +1511,9 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t else { Array.Copy(s.window, r, s.window, q, e); - q += e; r += e; e = 0; + q += e; + r += e; + e = 0; } r = 0; // copy rest from start of window @@ -1361,61 +1532,91 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t else { Array.Copy(s.window, r, s.window, q, c); - q += c; r += c; c = 0; + q += c; + r += c; + c = 0; } break; } - else if ((e & 64) == 0) + + if ((e & 64) == 0) { t += tp[tp_index_t_3 + 2]; - t += (b & inflate_mask[e]); + t += (b & inflateMask[e]); tp_index_t_3 = (tp_index + t) * 3; e = tp[tp_index_t_3]; } else { z.Message = "invalid distance code"; - c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - s.bitb = b; s.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + c = z.AvailableBytesIn - n; + c = (k >> 3) < c ? k >> 3 : c; + n += c; + p -= c; + k -= (c << 3); + s.bitb = b; + s.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; s.write = q; + return ZlibConstants.Z_DATA_ERROR; } } while (true); + break; } if ((e & 64) == 0) { t += tp[tp_index_t_3 + 2]; - t += (b & inflate_mask[e]); + t += (b & inflateMask[e]); tp_index_t_3 = (tp_index + t) * 3; if ((e = tp[tp_index_t_3]) == 0) { - b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); - s.window[q++] = (byte)tp[tp_index_t_3 + 2]; + b >>= (tp[tp_index_t_3 + 1]); + k -= (tp[tp_index_t_3 + 1]); + s.window[q++] = (byte) tp[tp_index_t_3 + 2]; m--; + break; } } else if ((e & 32) != 0) { - c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - s.bitb = b; s.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + c = z.AvailableBytesIn - n; + c = (k >> 3) < c ? k >> 3 : c; + n += c; + p -= c; + k -= (c << 3); + s.bitb = b; + s.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; s.write = q; + return ZlibConstants.Z_STREAM_END; } else { z.Message = "invalid literal/length code"; - c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - s.bitb = b; s.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + c = z.AvailableBytesIn - n; + c = (k >> 3) < c ? k >> 3 : c; + n += c; + p -= c; + k -= (c << 3); + s.bitb = b; + s.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; s.write = q; + return ZlibConstants.Z_DATA_ERROR; } } @@ -1424,11 +1625,19 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t while (m >= 258 && n >= 10); // not enough input or output--restore pointers and return - c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + c = z.AvailableBytesIn - n; + c = (k >> 3) < c ? k >> 3 : c; + n += c; + p -= c; + k -= (c << 3); + + s.bitb = b; + s.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; s.write = q; + return ZlibConstants.Z_OK; } } @@ -1454,7 +1663,7 @@ internal sealed class InflateManager private const int BAD = 13; // got an error--stay here internal int mode; // current inflate mode - internal ZlibCodec _codec; // pointer back to this zlib stream + internal ZlibCodec codec; // pointer back to this zlib stream // mode dependent information internal int method; // if FLAGS, method byte @@ -1468,11 +1677,12 @@ internal sealed class InflateManager // mode independent information //internal int nowrap; // flag for no wrapper - private bool _handleRfc1950HeaderBytes = true; + private bool handleRfc1950HeaderBytes = true; + internal bool HandleRfc1950HeaderBytes { - get { return _handleRfc1950HeaderBytes; } - set { _handleRfc1950HeaderBytes = value; } + get { return this.handleRfc1950HeaderBytes; } + set { this.handleRfc1950HeaderBytes = value; } } internal int wbits; // log2(window size) (8..15, defaults to 15) @@ -1482,15 +1692,16 @@ public InflateManager() { } public InflateManager(bool expectRfc1950HeaderBytes) { - _handleRfc1950HeaderBytes = expectRfc1950HeaderBytes; + this.handleRfc1950HeaderBytes = expectRfc1950HeaderBytes; } internal int Reset() { - _codec.TotalBytesIn = _codec.TotalBytesOut = 0; - _codec.Message = null; + codec.TotalBytesIn = codec.TotalBytesOut = 0; + codec.Message = null; mode = HandleRfc1950HeaderBytes ? METHOD : BLOCKS; blocks.Reset(null); + return ZlibConstants.Z_OK; } @@ -1500,13 +1711,14 @@ internal int End() blocks.Free(); blocks = null; + return ZlibConstants.Z_OK; } internal int Initialize(ZlibCodec codec, int w) { - _codec = codec; - _codec.Message = null; + this.codec = codec; + codec.Message = null; blocks = null; // handle undocumented nowrap option (no zlib header or check) @@ -1528,25 +1740,23 @@ internal int Initialize(ZlibCodec codec, int w) wbits = w; - blocks = new InflateBlocks(codec, - HandleRfc1950HeaderBytes ? this : null, - 1 << w); + blocks = new InflateBlocks(codec, HandleRfc1950HeaderBytes ? this : null, 1 << w); // reset state Reset(); + return ZlibConstants.Z_OK; } internal int Inflate(FlushType flush) { int r; - int b; - int f = (int)flush; + int f = (int) flush; - if (_codec.InputBuffer == null) + if (codec.InputBuffer == null) throw new ZlibException("InputBuffer is null. "); - f = (f == (int)FlushType.Finish) + f = (f == (int) FlushType.Finish) ? ZlibConstants.Z_BUF_ERROR : ZlibConstants.Z_OK; r = ZlibConstants.Z_BUF_ERROR; @@ -1556,26 +1766,29 @@ internal int Inflate(FlushType flush) switch (mode) { case METHOD: - if (_codec.AvailableBytesIn == 0) + if (codec.AvailableBytesIn == 0) return r; r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; + codec.AvailableBytesIn--; + codec.TotalBytesIn++; - if (((method = _codec.InputBuffer[_codec.NextIn++]) & 0xf) != Z_DEFLATED) + if (((method = codec.InputBuffer[codec.NextIn++]) & 0xf) != Z_DEFLATED) { mode = BAD; - _codec.Message = String.Format("unknown compression method (0x{0:X2})", method); + codec.Message = string.Format("unknown compression method (0x{0:X2})", method); marker = 5; // can't try inflateSync + break; } if ((method >> 4) + 8 > wbits) { mode = BAD; - _codec.Message = String.Format("invalid window size ({0})", (method >> 4) + 8); + codec.Message = string.Format("invalid window size ({0})", (method >> 4) + 8); marker = 5; // can't try inflateSync + break; } @@ -1583,75 +1796,89 @@ internal int Inflate(FlushType flush) goto case FLAG; case FLAG: - if (_codec.AvailableBytesIn == 0) return r; + if (codec.AvailableBytesIn == 0) + return r; r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; - b = (_codec.InputBuffer[_codec.NextIn++]) & 0xff; + codec.AvailableBytesIn--; + codec.TotalBytesIn++; + int b = (this.codec.InputBuffer[this.codec.NextIn++]) & 0xff; if ((((method << 8) + b) % 31) != 0) { mode = BAD; - _codec.Message = "incorrect header check"; + codec.Message = "incorrect header check"; marker = 5; // can't try inflateSync + break; } if ((b & PRESET_DICT) == 0) { mode = BLOCKS; + break; } mode = DICT4; + goto case DICT4; case DICT4: - if (_codec.AvailableBytesIn == 0) + if (codec.AvailableBytesIn == 0) return r; r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; - need = ((_codec.InputBuffer[_codec.NextIn++] & 0xff) << 24) & unchecked((int)0xff000000L); + codec.AvailableBytesIn--; + codec.TotalBytesIn++; + need = ((codec.InputBuffer[codec.NextIn++] & 0xff) << 24) & unchecked((int) 0xff000000L); mode = DICT3; + goto case DICT3; case DICT3: - if (_codec.AvailableBytesIn == 0) + if (codec.AvailableBytesIn == 0) return r; r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; - need += (((_codec.InputBuffer[_codec.NextIn++] & 0xff) << 16) & 0xff0000L); + codec.AvailableBytesIn--; + codec.TotalBytesIn++; + need += (((codec.InputBuffer[codec.NextIn++] & 0xff) << 16) & 0xff0000L); mode = DICT2; + goto case DICT2; case DICT2: - if (_codec.AvailableBytesIn == 0) + if (codec.AvailableBytesIn == 0) return r; r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; - need += (((_codec.InputBuffer[_codec.NextIn++] & 0xff) << 8) & 0xff00L); + codec.AvailableBytesIn--; + codec.TotalBytesIn++; + need += (((codec.InputBuffer[codec.NextIn++] & 0xff) << 8) & 0xff00L); mode = DICT1; + goto case DICT1; case DICT1: - if (_codec.AvailableBytesIn == 0) + if (codec.AvailableBytesIn == 0) return r; r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; - need += (_codec.InputBuffer[_codec.NextIn++] & 0xffL); - _codec._Adler32 = need; + codec.AvailableBytesIn--; + codec.TotalBytesIn++; + need += (codec.InputBuffer[codec.NextIn++] & 0xffL); + codec.adler32 = need; mode = DICT0; + return ZlibConstants.Z_NEED_DICT; case DICT0: mode = BAD; - _codec.Message = "need dictionary"; + codec.Message = "need dictionary"; marker = 0; // can try inflateSync + return ZlibConstants.Z_STREAM_ERROR; case BLOCKS: @@ -1661,6 +1888,7 @@ internal int Inflate(FlushType flush) { mode = BAD; marker = 0; // can try inflateSync + break; } @@ -1676,58 +1904,67 @@ internal int Inflate(FlushType flush) if (!HandleRfc1950HeaderBytes) { mode = DONE; + break; } mode = CHECK4; + goto case CHECK4; case CHECK4: - if (_codec.AvailableBytesIn == 0) + if (codec.AvailableBytesIn == 0) return r; r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; - need = ((_codec.InputBuffer[_codec.NextIn++] & 0xff) << 24) & unchecked((int)0xff000000L); + codec.AvailableBytesIn--; + codec.TotalBytesIn++; + need = ((codec.InputBuffer[codec.NextIn++] & 0xff) << 24) & unchecked((int) 0xff000000L); mode = CHECK3; + goto case CHECK3; case CHECK3: - if (_codec.AvailableBytesIn == 0) + if (codec.AvailableBytesIn == 0) return r; r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; - need += (((_codec.InputBuffer[_codec.NextIn++] & 0xff) << 16) & 0xff0000L); + codec.AvailableBytesIn--; + codec.TotalBytesIn++; + need += (((codec.InputBuffer[codec.NextIn++] & 0xff) << 16) & 0xff0000L); mode = CHECK2; + goto case CHECK2; case CHECK2: - if (_codec.AvailableBytesIn == 0) + if (codec.AvailableBytesIn == 0) return r; r = f; - _codec.AvailableBytesIn--; - _codec.TotalBytesIn++; - need += (((_codec.InputBuffer[_codec.NextIn++] & 0xff) << 8) & 0xff00L); + codec.AvailableBytesIn--; + codec.TotalBytesIn++; + need += (((codec.InputBuffer[codec.NextIn++] & 0xff) << 8) & 0xff00L); mode = CHECK1; + goto case CHECK1; case CHECK1: - if (_codec.AvailableBytesIn == 0) + if (codec.AvailableBytesIn == 0) return r; r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; - need += (_codec.InputBuffer[_codec.NextIn++] & 0xffL); + codec.AvailableBytesIn--; + codec.TotalBytesIn++; + need += (codec.InputBuffer[codec.NextIn++] & 0xffL); unchecked { - if (((int)(was[0])) != ((int)(need))) + if (((int) (was[0])) != ((int) (need))) { mode = BAD; - _codec.Message = "incorrect data check"; + codec.Message = "incorrect data check"; marker = 5; // can't try inflateSync + break; } } @@ -1739,7 +1976,7 @@ internal int Inflate(FlushType flush) return ZlibConstants.Z_STREAM_END; case BAD: - throw new ZlibException(String.Format("Bad state ({0})", _codec.Message)); + throw new ZlibException(string.Format("Bad state ({0})", codec.Message)); //return ZlibConstants.Z_DATA_ERROR; default: @@ -1757,12 +1994,12 @@ internal int SetDictionary(byte[] dictionary) if (mode != DICT0) throw new ZlibException("Stream error."); - if (Adler.Adler32(1L, dictionary, 0, dictionary.Length) != _codec._Adler32) + if (Adler.Adler32(1L, dictionary, 0, dictionary.Length) != codec.adler32) { return ZlibConstants.Z_DATA_ERROR; } - _codec._Adler32 = Adler.Adler32(0, null, 0, 0); + codec.adler32 = Adler.Adler32(0, null, 0, 0); if (length >= (1 << wbits)) { @@ -1772,10 +2009,11 @@ internal int SetDictionary(byte[] dictionary) blocks.SetDictionary(dictionary, index, length); mode = BLOCKS; + return ZlibConstants.Z_OK; } - private static byte[] mark = new byte[] { 0, 0, 0xff, 0xff }; + private static readonly byte[] mark = { 0, 0, 0xff, 0xff }; internal int Sync() { @@ -1791,20 +2029,20 @@ internal int Sync() marker = 0; } - if ((n = _codec.AvailableBytesIn) == 0) + if ((n = codec.AvailableBytesIn) == 0) return ZlibConstants.Z_BUF_ERROR; - p = _codec.NextIn; + p = codec.NextIn; m = marker; // search while (n != 0 && m < 4) { - if (_codec.InputBuffer[p] == mark[m]) + if (codec.InputBuffer[p] == mark[m]) { m++; } - else if (_codec.InputBuffer[p] != 0) + else if (codec.InputBuffer[p] != 0) { m = 0; } @@ -1813,13 +2051,14 @@ internal int Sync() m = 4 - m; } - p++; n--; + p++; + n--; } // restore - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - _codec.AvailableBytesIn = n; + codec.TotalBytesIn += p - codec.NextIn; + codec.NextIn = p; + codec.AvailableBytesIn = n; marker = m; // return no joy or set up to restart on a new block @@ -1828,12 +2067,13 @@ internal int Sync() return ZlibConstants.Z_DATA_ERROR; } - r = _codec.TotalBytesIn; - w = _codec.TotalBytesOut; + r = codec.TotalBytesIn; + w = codec.TotalBytesOut; Reset(); - _codec.TotalBytesIn = r; - _codec.TotalBytesOut = w; + codec.TotalBytesIn = r; + codec.TotalBytesOut = w; mode = BLOCKS; + return ZlibConstants.Z_OK; } diff --git a/RestSharp/Compression/ZLib/ZLib.cs b/RestSharp/Compression/ZLib/ZLib.cs index c5241e8f4..11e52c491 100644 --- a/RestSharp/Compression/ZLib/ZLib.cs +++ b/RestSharp/Compression/ZLib/ZLib.cs @@ -65,6 +65,8 @@ #if WINDOWS_PHONE using System; +using System.IO; +using System.Text; using Interop = System.Runtime.InteropServices; namespace RestSharp.Compression.ZLib @@ -72,19 +74,19 @@ namespace RestSharp.Compression.ZLib /// /// A general purpose exception class for exceptions in the Zlib library. /// - internal class ZlibException : System.Exception + internal class ZlibException : Exception { /// /// The ZlibException class captures exception information generated /// by the Zlib library. /// - public ZlibException() : base() { } + public ZlibException() { } /// /// This ctor collects a message attached to the exception. /// /// - public ZlibException(System.String s) : base(s) { } + public ZlibException(string s) : base(s) { } } internal class SharedUtils @@ -108,7 +110,7 @@ public static int URShift(int number, int bits) /// The resulting number from the shift operation public static long URShift(long number, int bits) { - return (long)((UInt64)number >> bits); + return (long)((ulong)number >> bits); } #if NOTUSED @@ -172,7 +174,7 @@ public static System.Int32 ReadInput(System.IO.Stream sourceStream, byte[] targe /// The starting index of the target array. /// The maximum number of characters to read from the source TextReader. /// The number of characters read. The number will be less than or equal to count depending on the data available in the source TextReader. Returns -1 if the end of the stream is reached. - public static System.Int32 ReadInput(System.IO.TextReader sourceTextReader, byte[] target, int start, int count) + public static int ReadInput(TextReader sourceTextReader, byte[] target, int start, int count) { // Returns 0 bytes if not enough space in target if (target.Length == 0) @@ -191,14 +193,14 @@ public static System.Int32 ReadInput(System.IO.TextReader sourceTextReader, byte return bytesRead; } - internal static byte[] ToByteArray(System.String sourceString) + internal static byte[] ToByteArray(string sourceString) { - return System.Text.UTF8Encoding.UTF8.GetBytes(sourceString); + return UTF8Encoding.UTF8.GetBytes(sourceString); } internal static char[] ToCharArray(byte[] byteArray) { - return System.Text.UTF8Encoding.UTF8.GetChars(byteArray); + return UTF8Encoding.UTF8.GetChars(byteArray); } } @@ -215,6 +217,7 @@ internal sealed class Adler { // largest prime smaller than 65536 private static int BASE = 65521; + // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 private static int NMAX = 5552; @@ -227,11 +230,11 @@ static internal long Adler32(long adler, byte[] buf, int index, int len) long s1 = adler & 0xffff; long s2 = (adler >> 16) & 0xffff; - int k; while (len > 0) { - k = len < NMAX ? len : NMAX; + int k = len < NMAX ? len : NMAX; + len -= k; while (k >= 16) diff --git a/RestSharp/Compression/ZLib/ZLibCodec.cs b/RestSharp/Compression/ZLib/ZLibCodec.cs index 86930349c..778e3c907 100644 --- a/RestSharp/Compression/ZLib/ZLibCodec.cs +++ b/RestSharp/Compression/ZLib/ZLibCodec.cs @@ -65,9 +65,6 @@ #if WINDOWS_PHONE -using System; -using Interop = System.Runtime.InteropServices; - namespace RestSharp.Compression.ZLib { /// @@ -133,11 +130,11 @@ sealed internal class ZlibCodec /// /// used for diagnostics, when something goes wrong! /// - public System.String Message; + public string Message; internal InflateManager istate; - internal long _Adler32; + internal long adler32; /// /// The number of Window Bits to use. @@ -148,12 +145,12 @@ sealed internal class ZlibCodec /// setting alone if you don't know what it is. The maximum value is 15 bits, which implies /// a 32k window. /// - public int WindowBits = ZlibConstants.WindowBitsDefault; + public int WindowBits = ZlibConstants.WINDOW_BITS_DEFAULT; /// /// The Adler32 checksum on the data transferred through the codec so far. You probably don't need to look at this. /// - public long Adler32 { get { return _Adler32; } } + public long Adler32 { get { return adler32; } } /// /// Create a ZlibCodec that decompresses. @@ -161,7 +158,9 @@ sealed internal class ZlibCodec public ZlibCodec() { int rc = InitializeInflate(); - if (rc != ZlibConstants.Z_OK) throw new ZlibException("Cannot initialize for inflate."); + + if (rc != ZlibConstants.Z_OK) + throw new ZlibException("Cannot initialize for inflate."); } /// @@ -209,6 +208,7 @@ public int InitializeInflate(bool expectRfc1950Header) public int InitializeInflate(int windowBits) { this.WindowBits = windowBits; + return InitializeInflate(windowBits, true); } @@ -239,6 +239,7 @@ public int InitializeInflate(int windowBits, bool expectRfc1950Header) // throw new ZlibException("You may not call InitializeInflate() after calling InitializeDeflate()."); istate = new InflateManager(expectRfc1950Header); + return istate.Initialize(this, windowBits); } diff --git a/RestSharp/Compression/ZLib/ZLibConstants.cs b/RestSharp/Compression/ZLib/ZLibConstants.cs index 18b878b2c..09be374a5 100644 --- a/RestSharp/Compression/ZLib/ZLibConstants.cs +++ b/RestSharp/Compression/ZLib/ZLibConstants.cs @@ -62,8 +62,6 @@ #if WINDOWS_PHONE -using System; - namespace RestSharp.Compression.ZLib { /// @@ -74,12 +72,12 @@ internal static class ZlibConstants /// /// The maximum number of window bits for the Deflate algorithm. /// - public const int WindowBitsMax = 15; // 32K LZ77 window + public const int WINDOW_BITS_MAX = 15; // 32K LZ77 window /// /// The default number of window bits for the Deflate algorithm. /// - public const int WindowBitsDefault = WindowBitsMax; + public const int WINDOW_BITS_DEFAULT = WINDOW_BITS_MAX; /// /// indicates everything is A-OK @@ -114,12 +112,12 @@ internal static class ZlibConstants /// /// The size of the working buffer used in the ZlibCodec class. Defaults to 8192 bytes. /// - public const int WorkingBufferSizeDefault = 8192; // 8192; // 0x8000; // 16384; // 1024; + public const int WORKING_BUFFER_SIZE_DEFAULT = 8192; // 8192; // 0x8000; // 16384; // 1024; /// /// The minimum size of the working buffer used in the ZlibCodec class. Currently it is 128 bytes. /// - public const int WorkingBufferSizeMin = 128; + public const int WORKING_BUFFER_SIZE_MIN = 128; } } diff --git a/RestSharp/Compression/ZLib/ZLibStream.cs b/RestSharp/Compression/ZLib/ZLibStream.cs index 170adea94..7be720f83 100644 --- a/RestSharp/Compression/ZLib/ZLibStream.cs +++ b/RestSharp/Compression/ZLib/ZLibStream.cs @@ -69,14 +69,14 @@ namespace RestSharp.Compression.ZLib /// /// /// - internal class ZlibStream : System.IO.Stream + internal class ZlibStream : Stream { - internal ZlibBaseStream _baseStream; - bool _disposed; + internal ZlibBaseStream baseStream; + bool disposed; - public ZlibStream(System.IO.Stream stream) + public ZlibStream(Stream stream) { - _baseStream = new ZlibBaseStream(stream, ZlibStreamFlavor.ZLIB, false); + baseStream = new ZlibBaseStream(stream, ZlibStreamFlavor.ZLIB, false); } #region Zlib properties @@ -87,13 +87,13 @@ public ZlibStream(System.IO.Stream stream) /// virtual public FlushType FlushMode { - get { return (this._baseStream._flushMode); } + get { return (baseStream.flushMode); } set { - if (_disposed) + if (disposed) throw new ObjectDisposedException("ZlibStream"); - this._baseStream._flushMode = value; + baseStream.flushMode = value; } } @@ -115,32 +115,32 @@ virtual public FlushType FlushMode /// public int BufferSize { - get { return this._baseStream._bufferSize; } + get { return baseStream.bufferSize; } set { - if (_disposed) + if (disposed) throw new ObjectDisposedException("ZlibStream"); - if (this._baseStream._workingBuffer != null) + if (baseStream.workingBuffer != null) throw new ZlibException("The working buffer is already set."); - if (value < ZlibConstants.WorkingBufferSizeMin) - throw new ZlibException(String.Format("Don't be silly. {0} bytes?? Use a bigger buffer.", value)); + if (value < ZlibConstants.WORKING_BUFFER_SIZE_MIN) + throw new ZlibException(string.Format("Don't be silly. {0} bytes?? Use a bigger buffer.", value)); - this._baseStream._bufferSize = value; + baseStream.bufferSize = value; } } /// Returns the total number of bytes input so far. virtual public long TotalIn { - get { return this._baseStream._z.TotalBytesIn; } + get { return baseStream.z.TotalBytesIn; } } /// Returns the total number of bytes output so far. virtual public long TotalOut { - get { return this._baseStream._z.TotalBytesOut; } + get { return baseStream.z.TotalBytesOut; } } #endregion @@ -158,12 +158,12 @@ protected override void Dispose(bool disposing) { try { - if (!_disposed) + if (!disposed) { - if (disposing && (this._baseStream != null)) - this._baseStream.Close(); + if (disposing && (baseStream != null)) + baseStream.Close(); - _disposed = true; + disposed = true; } } finally @@ -182,10 +182,10 @@ public override bool CanRead { get { - if (_disposed) + if (disposed) throw new ObjectDisposedException("ZlibStream"); - return _baseStream._stream.CanRead; + return baseStream.stream.CanRead; } } @@ -210,10 +210,10 @@ public override bool CanWrite { get { - if (_disposed) + if (disposed) throw new ObjectDisposedException("ZlibStream"); - return _baseStream._stream.CanWrite; + return baseStream.stream.CanWrite; } } @@ -222,10 +222,10 @@ public override bool CanWrite /// public override void Flush() { - if (_disposed) + if (disposed) throw new ObjectDisposedException("ZlibStream"); - _baseStream.Flush(); + baseStream.Flush(); } /// @@ -249,11 +249,14 @@ public override long Position { get { - if (this._baseStream._streamMode == ZlibBaseStream.StreamMode.Writer) - return this._baseStream._z.TotalBytesOut; + switch (this.baseStream.streamMode) + { + case ZlibBaseStream.StreamMode.Writer: + return this.baseStream.z.TotalBytesOut; - if (this._baseStream._streamMode == ZlibBaseStream.StreamMode.Reader) - return this._baseStream._z.TotalBytesIn; + case ZlibBaseStream.StreamMode.Reader: + return this.baseStream.z.TotalBytesIn; + } return 0; } @@ -284,10 +287,10 @@ public override long Position /// the number of bytes to read. public override int Read(byte[] buffer, int offset, int count) { - if (_disposed) + if (disposed) throw new ObjectDisposedException("ZlibStream"); - return _baseStream.Read(buffer, offset, count); + return baseStream.Read(buffer, offset, count); } /// @@ -332,10 +335,10 @@ public override void SetLength(long value) /// the number of bytes to write. public override void Write(byte[] buffer, int offset, int count) { - if (_disposed) + if (disposed) throw new ObjectDisposedException("ZlibStream"); - _baseStream.Write(buffer, offset, count); + baseStream.Write(buffer, offset, count); } #endregion @@ -347,7 +350,7 @@ public override void Write(byte[] buffer, int offset, int count) /// /// A buffer containing ZLIB-compressed data. /// - public static String UncompressString(byte[] compressed) + public static string UncompressString(byte[] compressed) { // workitem 8460 byte[] working = new byte[1024]; @@ -407,70 +410,69 @@ public static byte[] UncompressBuffer(byte[] compressed) } } - internal enum ZlibStreamFlavor { ZLIB = 1950, DEFLATE = 1951, GZIP = 1952 } + internal enum ZlibStreamFlavor + { + ZLIB = 1950, + DEFLATE = 1951, + GZIP = 1952 + } - internal class ZlibBaseStream : System.IO.Stream + internal class ZlibBaseStream : Stream { - protected internal ZlibCodec _z = null; // deferred init... new ZlibCodec(); + protected internal ZlibCodec z; // deferred init... new ZlibCodec(); - protected internal StreamMode _streamMode = StreamMode.Undefined; - protected internal FlushType _flushMode; - protected internal ZlibStreamFlavor _flavor; - protected internal bool _leaveOpen; - protected internal byte[] _workingBuffer; - protected internal int _bufferSize = ZlibConstants.WorkingBufferSizeDefault; - protected internal byte[] _buf1 = new byte[1]; - protected internal System.IO.Stream _stream; + protected internal StreamMode streamMode = StreamMode.Undefined; + protected internal FlushType flushMode; + protected internal ZlibStreamFlavor flavor; + protected internal bool leaveOpen; + protected internal byte[] workingBuffer; + protected internal int bufferSize = ZlibConstants.WORKING_BUFFER_SIZE_DEFAULT; + protected internal byte[] buf1 = new byte[1]; + protected internal Stream stream; // workitem 7159 - CRC32 crc; - protected internal string _GzipFileName; - protected internal string _GzipComment; - protected internal DateTime _GzipMtime; - protected internal int _gzipHeaderByteCount; - - internal int Crc32 { get { if (crc == null) return 0; return crc.Crc32Result; } } - - public ZlibBaseStream(System.IO.Stream stream, ZlibStreamFlavor flavor, bool leaveOpen) - : base() - { - this._flushMode = FlushType.None; - //this._workingBuffer = new byte[WORKING_BUFFER_SIZE_DEFAULT]; - this._stream = stream; - this._leaveOpen = leaveOpen; - this._flavor = flavor; + Crc32 crc; + protected internal string GzipFileName; + protected internal string GzipComment; + protected internal DateTime GzipMtime; + protected internal int GzipHeaderByteCount; + + internal int Crc32 { get { return crc == null ? 0 : crc.Crc32Result; } } + + public ZlibBaseStream(Stream stream, ZlibStreamFlavor flavor, bool leaveOpen) + { + flushMode = FlushType.None; + //_workingBuffer = new byte[WORKING_BUFFER_SIZE_DEFAULT]; + this.stream = stream; + this.leaveOpen = leaveOpen; + this.flavor = flavor; // workitem 7159 if (flavor == ZlibStreamFlavor.GZIP) { - crc = new CRC32(); + crc = new Crc32(); } } - private ZlibCodec z + private ZlibCodec Z { get { - if (_z == null) + if (z == null) { - bool wantRfc1950Header = (this._flavor == ZlibStreamFlavor.ZLIB); - _z = new ZlibCodec(); - _z.InitializeInflate(wantRfc1950Header); + bool wantRfc1950Header = (flavor == ZlibStreamFlavor.ZLIB); + + z = new ZlibCodec(); + z.InitializeInflate(wantRfc1950Header); } - return _z; + return z; } } - private byte[] workingBuffer + private byte[] WorkingBuffer { - get - { - if (_workingBuffer == null) - _workingBuffer = new byte[_bufferSize]; - - return _workingBuffer; - } + get { return workingBuffer ?? (workingBuffer = new byte[bufferSize]); } } // workitem 7813 - totally unnecessary @@ -483,16 +485,16 @@ private byte[] workingBuffer // Write(_buf1, 0, 1); // } - public override void Write(System.Byte[] buffer, int offset, int count) + public override void Write(byte[] buffer, int offset, int count) { // workitem 7159 // calculate the CRC on the unccompressed data (before writing) if (crc != null) crc.SlurpBlock(buffer, offset, count); - if (_streamMode == StreamMode.Undefined) - _streamMode = StreamMode.Writer; - else if (_streamMode != StreamMode.Writer) + if (streamMode == StreamMode.Undefined) + streamMode = StreamMode.Writer; + else if (streamMode != StreamMode.Writer) throw new ZlibException("Cannot Write after Reading."); if (count == 0) @@ -500,120 +502,123 @@ public override void Write(System.Byte[] buffer, int offset, int count) // first reference of z property will initialize the private var _z z.InputBuffer = buffer; - _z.NextIn = offset; - _z.AvailableBytesIn = count; + z.NextIn = offset; + z.AvailableBytesIn = count; - bool done = false; + bool done; do { - _z.OutputBuffer = workingBuffer; - _z.NextOut = 0; - _z.AvailableBytesOut = _workingBuffer.Length; + z.OutputBuffer = WorkingBuffer; + z.NextOut = 0; + z.AvailableBytesOut = workingBuffer.Length; //int rc = (_wantCompress) // ? _z.Deflate(_flushMode) // : _z.Inflate(_flushMode); - int rc = _z.Inflate(_flushMode); + int rc = z.Inflate(flushMode); if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) - throw new ZlibException("inflating: " + _z.Message); + throw new ZlibException("inflating: " + z.Message); - _stream.Write(_workingBuffer, 0, _workingBuffer.Length - _z.AvailableBytesOut); + stream.Write(workingBuffer, 0, workingBuffer.Length - z.AvailableBytesOut); - done = _z.AvailableBytesIn == 0 && _z.AvailableBytesOut != 0; + done = z.AvailableBytesIn == 0 && z.AvailableBytesOut != 0; // If GZIP and de-compress, we're done when 8 bytes remain. - if (_flavor == ZlibStreamFlavor.GZIP) - done = (_z.AvailableBytesIn == 8 && _z.AvailableBytesOut != 0); + if (flavor == ZlibStreamFlavor.GZIP) + done = (z.AvailableBytesIn == 8 && z.AvailableBytesOut != 0); } while (!done); } private void finish() { - if (_z == null) + if (z == null) return; - if (_streamMode == StreamMode.Writer) + switch (streamMode) { - bool done = false; + case StreamMode.Writer: + bool done; - do - { - _z.OutputBuffer = workingBuffer; - _z.NextOut = 0; - _z.AvailableBytesOut = _workingBuffer.Length; + do + { + z.OutputBuffer = WorkingBuffer; + z.NextOut = 0; + z.AvailableBytesOut = workingBuffer.Length; - //int rc = (_wantCompress) - // ? _z.Deflate(FlushType.Finish) - // : _z.Inflate(FlushType.Finish); + //int rc = (_wantCompress) + // ? _z.Deflate(FlushType.Finish) + // : _z.Inflate(FlushType.Finish); - int rc = _z.Inflate(FlushType.Finish); + int rc = z.Inflate(FlushType.Finish); - if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) - throw new ZlibException("inflating: " + _z.Message); + if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) + throw new ZlibException("inflating: " + z.Message); - if (_workingBuffer.Length - _z.AvailableBytesOut > 0) - { - _stream.Write(_workingBuffer, 0, _workingBuffer.Length - _z.AvailableBytesOut); - } + if (workingBuffer.Length - z.AvailableBytesOut > 0) + { + stream.Write(workingBuffer, 0, workingBuffer.Length - z.AvailableBytesOut); + } - done = _z.AvailableBytesIn == 0 && _z.AvailableBytesOut != 0; + done = z.AvailableBytesIn == 0 && z.AvailableBytesOut != 0; - // If GZIP and de-compress, we're done when 8 bytes remain. - if (_flavor == ZlibStreamFlavor.GZIP) - done = (_z.AvailableBytesIn == 8 && _z.AvailableBytesOut != 0); - } - while (!done); + // If GZIP and de-compress, we're done when 8 bytes remain. + if (flavor == ZlibStreamFlavor.GZIP) + done = (z.AvailableBytesIn == 8 && z.AvailableBytesOut != 0); + } + while (!done); - Flush(); + Flush(); - // workitem 7159 - if (_flavor == ZlibStreamFlavor.GZIP) - { - //Console.WriteLine("GZipStream: Last write"); - throw new ZlibException("Writing with decompression is not supported."); - } - } - // workitem 7159 - else if (_streamMode == StreamMode.Reader) - { - if (_flavor == ZlibStreamFlavor.GZIP) - { - // workitem 8501: handle edge case (decompress empty stream) - if (_z.TotalBytesOut == 0L) - return; + // workitem 7159 + if (flavor == ZlibStreamFlavor.GZIP) + { + //Console.WriteLine("GZipStream: Last write"); + throw new ZlibException("Writing with decompression is not supported."); + } + break; - // Read and potentially verify the GZIP trailer: CRC32 and size mod 2^32 - byte[] trailer = new byte[8]; + case StreamMode.Reader: + if (flavor == ZlibStreamFlavor.GZIP) + { + // workitem 8501: handle edge case (decompress empty stream) + if (z.TotalBytesOut == 0L) + return; - if (_z.AvailableBytesIn != 8) - throw new ZlibException(String.Format("Protocol error. AvailableBytesIn={0}, expected 8", - _z.AvailableBytesIn)); + // Read and potentially verify the GZIP trailer: CRC32 and size mod 2^32 + byte[] trailer = new byte[8]; - Array.Copy(_z.InputBuffer, _z.NextIn, trailer, 0, trailer.Length); + if (z.AvailableBytesIn != 8) + { + throw new ZlibException(string.Format("Protocol error. AvailableBytesIn={0}, expected 8", + z.AvailableBytesIn)); + } - Int32 crc32_expected = BitConverter.ToInt32(trailer, 0); - int crc32_actual = crc.Crc32Result; - Int32 isize_expected = BitConverter.ToInt32(trailer, 4); - Int32 isize_actual = (Int32)(_z.TotalBytesOut & 0x00000000FFFFFFFF); + Array.Copy(z.InputBuffer, z.NextIn, trailer, 0, trailer.Length); - // Console.WriteLine("GZipStream: slurped trailer crc(0x{0:X8}) isize({1})", crc32_expected, isize_expected); - // Console.WriteLine("GZipStream: calc'd data crc(0x{0:X8}) isize({1})", crc32_actual, isize_actual); + int crc32_expected = BitConverter.ToInt32(trailer, 0); + int crc32_actual = crc.Crc32Result; + int isize_expected = BitConverter.ToInt32(trailer, 4); + int isize_actual = (int) (z.TotalBytesOut & 0x00000000FFFFFFFF); - if (crc32_actual != crc32_expected) - throw new ZlibException(String.Format("Bad CRC32 in GZIP stream. (actual({0:X8})!=expected({1:X8}))", crc32_actual, crc32_expected)); + // Console.WriteLine("GZipStream: slurped trailer crc(0x{0:X8}) isize({1})", crc32_expected, isize_expected); + // Console.WriteLine("GZipStream: calc'd data crc(0x{0:X8}) isize({1})", crc32_actual, isize_actual); - if (isize_actual != isize_expected) - throw new ZlibException(String.Format("Bad size in GZIP stream. (actual({0})!=expected({1}))", isize_actual, isize_expected)); - } + if (crc32_actual != crc32_expected) + throw new ZlibException(string.Format("Bad CRC32 in GZIP stream. (actual({0:X8})!=expected({1:X8}))", crc32_actual, crc32_expected)); + + if (isize_actual != isize_expected) + throw new ZlibException(string.Format("Bad size in GZIP stream. (actual({0})!=expected({1}))", isize_actual, isize_expected)); + } + break; } } private void end() { - if (z == null) + if (Z == null) return; //if (_wantCompress) @@ -621,16 +626,16 @@ private void end() // _z.EndDeflate(); //} //else - { - _z.EndInflate(); - } + //{ + z.EndInflate(); + //} - _z = null; + z = null; } public override void Close() { - if (_stream == null) + if (stream == null) return; try @@ -641,27 +646,27 @@ public override void Close() { end(); - if (!_leaveOpen) - _stream.Close(); + if (!leaveOpen) + stream.Close(); - _stream = null; + stream = null; } } public override void Flush() { - _stream.Flush(); + stream.Flush(); } - public override System.Int64 Seek(System.Int64 offset, System.IO.SeekOrigin origin) + public override long Seek(long offset, System.IO.SeekOrigin origin) { throw new NotImplementedException(); //_outStream.Seek(offset, origin); } - public override void SetLength(System.Int64 value) + public override void SetLength(long value) { - _stream.SetLength(value); + stream.SetLength(value); } #if NOT @@ -678,7 +683,7 @@ public int Read() } #endif - private bool nomoreinput = false; + private bool nomoreinput; private string ReadZeroTerminatedString() { @@ -688,21 +693,20 @@ private string ReadZeroTerminatedString() do { // workitem 7740 - int n = _stream.Read(_buf1, 0, 1); + int n = stream.Read(buf1, 0, 1); if (n != 1) throw new ZlibException("Unexpected EOF reading GZIP header."); + + if (this.buf1[0] == 0) + done = true; else - { - if (_buf1[0] == 0) - done = true; - else - list.Add(_buf1[0]); - } + list.Add(this.buf1[0]); } while (!done); byte[] a = list.ToArray(); - return GZipStream.iso8859dash1.GetString(a, 0, a.Length); + + return GZipStream.Iso8859Dash1.GetString(a, 0, a.Length); } private int _ReadAndValidateGzipHeader() @@ -710,7 +714,7 @@ private int _ReadAndValidateGzipHeader() int totalBytesRead = 0; // read the header on the first read byte[] header = new byte[10]; - int n = _stream.Read(header, 0, header.Length); + int n = stream.Read(header, 0, header.Length); // workitem 8501: handle edge case (decompress empty stream) if (n == 0) @@ -722,37 +726,41 @@ private int _ReadAndValidateGzipHeader() if (header[0] != 0x1F || header[1] != 0x8B || header[2] != 8) throw new ZlibException("Bad GZIP header."); - Int32 timet = BitConverter.ToInt32(header, 4); + int timet = BitConverter.ToInt32(header, 4); - _GzipMtime = GZipStream._unixEpoch.AddSeconds(timet); + GzipMtime = GZipStream.UnixEpoch.AddSeconds(timet); totalBytesRead += n; if ((header[3] & 0x04) == 0x04) { // read and discard extra field - n = _stream.Read(header, 0, 2); // 2-byte length field + n = stream.Read(header, 0, 2); // 2-byte length field totalBytesRead += n; - Int16 extraLength = (Int16)(header[0] + header[1] * 256); + short extraLength = (short) (header[0] + header[1] * 256); byte[] extra = new byte[extraLength]; - n = _stream.Read(extra, 0, extra.Length); + + n = stream.Read(extra, 0, extra.Length); + if (n != extraLength) throw new ZlibException("Unexpected end-of-file reading GZIP header."); + totalBytesRead += n; } + if ((header[3] & 0x08) == 0x08) - _GzipFileName = ReadZeroTerminatedString(); + GzipFileName = ReadZeroTerminatedString(); + if ((header[3] & 0x10) == 0x010) - _GzipComment = ReadZeroTerminatedString(); + GzipComment = ReadZeroTerminatedString(); + if ((header[3] & 0x02) == 0x02) - Read(_buf1, 0, 1); // CRC16, ignore + Read(buf1, 0, 1); // CRC16, ignore return totalBytesRead; } - - - public override System.Int32 Read(System.Byte[] buffer, System.Int32 offset, System.Int32 count) + public override int Read(byte[] buffer, int offset, int count) { // According to MS documentation, any implementation of the IO.Stream.Read function must: // (a) throw an exception if offset & count reference an invalid part of the buffer, @@ -760,53 +768,68 @@ public override System.Int32 Read(System.Byte[] buffer, System.Int32 offset, Sys // (b) return 0 only upon EOF, or if count = 0 // (c) if not EOF, then return at least 1 byte, up to bytes - if (_streamMode == StreamMode.Undefined) + if (streamMode == StreamMode.Undefined) { - if (!this._stream.CanRead) throw new ZlibException("The stream is not readable."); + if (!stream.CanRead) + throw new ZlibException("The stream is not readable."); + // for the first read, set up some controls. - _streamMode = StreamMode.Reader; + streamMode = StreamMode.Reader; + // (The first reference to _z goes through the private accessor which // may initialize it.) - z.AvailableBytesIn = 0; - if (_flavor == ZlibStreamFlavor.GZIP) + Z.AvailableBytesIn = 0; + + if (flavor == ZlibStreamFlavor.GZIP) { - _gzipHeaderByteCount = _ReadAndValidateGzipHeader(); + GzipHeaderByteCount = _ReadAndValidateGzipHeader(); // workitem 8501: handle edge case (decompress empty stream) - if (_gzipHeaderByteCount == 0) + + if (GzipHeaderByteCount == 0) return 0; } } - if (_streamMode != StreamMode.Reader) + if (streamMode != StreamMode.Reader) throw new ZlibException("Cannot Read after Writing."); - if (count == 0) return 0; - if (buffer == null) throw new ArgumentNullException("buffer"); - if (count < 0) throw new ArgumentOutOfRangeException("count"); - if (offset < buffer.GetLowerBound(0)) throw new ArgumentOutOfRangeException("offset"); - if ((offset + count) > buffer.GetLength(0)) throw new ArgumentOutOfRangeException("count"); + if (count == 0) + return 0; + + if (buffer == null) + throw new ArgumentNullException("buffer"); + + if (count < 0) + throw new ArgumentOutOfRangeException("count"); + + if (offset < buffer.GetLowerBound(0)) + throw new ArgumentOutOfRangeException("offset"); + + if ((offset + count) > buffer.GetLength(0)) + throw new ArgumentOutOfRangeException("count"); - int rc = 0; + int rc; // set up the output of the deflate/inflate codec: - _z.OutputBuffer = buffer; - _z.NextOut = offset; - _z.AvailableBytesOut = count; + z.OutputBuffer = buffer; + z.NextOut = offset; + z.AvailableBytesOut = count; // This is necessary in case _workingBuffer has been resized. (new byte[]) // (The first reference to _workingBuffer goes through the private accessor which // may initialize it.) - _z.InputBuffer = workingBuffer; + z.InputBuffer = WorkingBuffer; do { // need data in _workingBuffer in order to deflate/inflate. Here, we check if we have any. - if ((_z.AvailableBytesIn == 0) && (!nomoreinput)) + if ((z.AvailableBytesIn == 0) && (!nomoreinput)) { // No data available, so try to Read data from the captive stream. - _z.NextIn = 0; - _z.AvailableBytesIn = _stream.Read(_workingBuffer, 0, _workingBuffer.Length); - if (_z.AvailableBytesIn == 0) + z.NextIn = 0; + z.AvailableBytesIn = stream.Read(workingBuffer, 0, workingBuffer.Length); + + if (z.AvailableBytesIn == 0) nomoreinput = true; } @@ -814,25 +837,26 @@ public override System.Int32 Read(System.Byte[] buffer, System.Int32 offset, Sys //rc = (_wantCompress) // ? _z.Deflate(_flushMode) // : _z.Inflate(_flushMode); - rc = _z.Inflate(_flushMode); + rc = z.Inflate(flushMode); + if (nomoreinput && (rc == ZlibConstants.Z_BUF_ERROR)) return 0; if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) - throw new ZlibException(String.Format("inflating: rc={0} msg={1}", rc, _z.Message)); + throw new ZlibException(string.Format("inflating: rc={0} msg={1}", rc, z.Message)); - if ((nomoreinput || rc == ZlibConstants.Z_STREAM_END) && (_z.AvailableBytesOut == count)) + if ((nomoreinput || rc == ZlibConstants.Z_STREAM_END) && (z.AvailableBytesOut == count)) break; // nothing more to read } //while (_z.AvailableBytesOut == count && rc == ZlibConstants.Z_OK); - while (_z.AvailableBytesOut > 0 && !nomoreinput && rc == ZlibConstants.Z_OK); + while (z.AvailableBytesOut > 0 && !nomoreinput && rc == ZlibConstants.Z_OK); // workitem 8557 // is there more room in output? - if (_z.AvailableBytesOut > 0) + if (z.AvailableBytesOut > 0) { - if (rc == ZlibConstants.Z_OK && _z.AvailableBytesIn == 0) + if (rc == ZlibConstants.Z_OK && z.AvailableBytesIn == 0) { // deferred } @@ -854,7 +878,7 @@ public override System.Int32 Read(System.Byte[] buffer, System.Int32 offset, Sys } - rc = (count - _z.AvailableBytesOut); + rc = (count - z.AvailableBytesOut); // calculate CRC after reading if (crc != null) @@ -863,26 +887,24 @@ public override System.Int32 Read(System.Byte[] buffer, System.Int32 offset, Sys return rc; } - - - public override System.Boolean CanRead + public override bool CanRead { - get { return this._stream.CanRead; } + get { return stream.CanRead; } } - public override System.Boolean CanSeek + public override bool CanSeek { - get { return this._stream.CanSeek; } + get { return stream.CanSeek; } } - public override System.Boolean CanWrite + public override bool CanWrite { - get { return this._stream.CanWrite; } + get { return stream.CanWrite; } } - public override System.Int64 Length + public override long Length { - get { return _stream.Length; } + get { return stream.Length; } } public override long Position @@ -898,7 +920,6 @@ internal enum StreamMode Undefined, } } - } #endif diff --git a/RestSharp/Deserializers/DeserializeAsAttribute.cs b/RestSharp/Deserializers/DeserializeAsAttribute.cs index 3fea84323..ce0f6a0d1 100644 --- a/RestSharp/Deserializers/DeserializeAsAttribute.cs +++ b/RestSharp/Deserializers/DeserializeAsAttribute.cs @@ -21,7 +21,7 @@ namespace RestSharp.Deserializers /// /// Allows control how class and property names and values are deserialized by XmlAttributeDeserializer /// - [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, Inherited = false, AllowMultiple = false)] + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, Inherited = false)] public sealed class DeserializeAsAttribute : Attribute { /// diff --git a/RestSharp/Deserializers/DotNetXmlDeserializer.cs b/RestSharp/Deserializers/DotNetXmlDeserializer.cs index 9b58f4ca4..42fb43f66 100644 --- a/RestSharp/Deserializers/DotNetXmlDeserializer.cs +++ b/RestSharp/Deserializers/DotNetXmlDeserializer.cs @@ -40,6 +40,7 @@ public T Deserialize(IRestResponse response) using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(response.Content))) { var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T)); + return (T)serializer.Deserialize(stream); } } diff --git a/RestSharp/Deserializers/IDeserializer.cs b/RestSharp/Deserializers/IDeserializer.cs index e293a3966..6556ae8a6 100644 --- a/RestSharp/Deserializers/IDeserializer.cs +++ b/RestSharp/Deserializers/IDeserializer.cs @@ -19,8 +19,11 @@ namespace RestSharp.Deserializers public interface IDeserializer { T Deserialize(IRestResponse response); + string RootElement { get; set; } + string Namespace { get; set; } + string DateFormat { get; set; } } } diff --git a/RestSharp/Deserializers/JsonDeserializer.cs b/RestSharp/Deserializers/JsonDeserializer.cs index e4be3437d..16dcabdc6 100644 --- a/RestSharp/Deserializers/JsonDeserializer.cs +++ b/RestSharp/Deserializers/JsonDeserializer.cs @@ -35,22 +35,26 @@ public T Deserialize(IRestResponse response) if (RootElement.HasValue()) { var root = FindRoot(response.Content); + target = (T)BuildList(objType, root); } else { var data = SimpleJson.DeserializeObject(response.Content); + target = (T)BuildList(objType, data); } } else if (target is IDictionary) { var root = FindRoot(response.Content); + target = (T)BuildDictionary(target.GetType(), root); } else { var root = FindRoot(response.Content); + target = (T)Map(target, (IDictionary)root); } @@ -197,13 +201,13 @@ private object ConvertValue(Type type, object value) if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { // Since the type is nullable and no value is provided return null - if (String.IsNullOrEmpty(stringValue)) + if (string.IsNullOrEmpty(stringValue)) return null; type = type.GetGenericArguments()[0]; } - if (type == typeof(Object) && value != null) + if (type == typeof(object) && value != null) { type = value.GetType(); } @@ -253,15 +257,15 @@ private object ConvertValue(Type type, object value) return (DateTimeOffset)dt; } } - else if (type == typeof(Decimal)) + else if (type == typeof(decimal)) { if (value is double) return (decimal)((double)value); if (stringValue.Contains("e")) - return Decimal.Parse(stringValue, NumberStyles.Float, Culture); + return decimal.Parse(stringValue, NumberStyles.Float, Culture); - return Decimal.Parse(stringValue, Culture); + return decimal.Parse(stringValue, Culture); } else if (type == typeof(Guid)) { diff --git a/RestSharp/Deserializers/XmlDeserializer.cs b/RestSharp/Deserializers/XmlDeserializer.cs index 0d900c970..c07d960c4 100644 --- a/RestSharp/Deserializers/XmlDeserializer.cs +++ b/RestSharp/Deserializers/XmlDeserializer.cs @@ -66,11 +66,11 @@ public virtual T Deserialize(IRestResponse response) if (objType.IsSubclassOfRawGeneric(typeof(List<>))) { - x = (T)HandleListDerivative(x, root, objType.Name, objType); + x = (T) HandleListDerivative(x, root, objType.Name, objType); } else { - x = (T)Map(x, root); + x = (T) Map(x, root); } return x; @@ -89,13 +89,11 @@ private void RemoveNamespace(XDocument xdoc) { e.ReplaceAttributes( e.Attributes() - .Select( - a => - a.IsNamespaceDeclaration - ? null - : a.Name.Namespace != XNamespace.None - ? new XAttribute(XNamespace.None.GetName(a.Name.LocalName), a.Value) - : a)); + .Select(a => a.IsNamespaceDeclaration + ? null + : a.Name.Namespace != XNamespace.None + ? new XAttribute(XNamespace.None.GetName(a.Name.LocalName), a.Value) + : a)); } } } @@ -118,7 +116,8 @@ protected virtual object Map(object x, XElement root) if (attributes.Length > 0) { - var attribute = (DeserializeAsAttribute)attributes[0]; + var attribute = (DeserializeAsAttribute) attributes[0]; + name = attribute.Name.AsNamespaced(Namespace); } else @@ -135,11 +134,12 @@ protected virtual object Map(object x, XElement root) { var genericType = type.GetGenericArguments()[0]; var first = GetElementByName(root, genericType.Name); - var list = (IList)Activator.CreateInstance(type); + var list = (IList) Activator.CreateInstance(type); if (first != null) { var elements = root.Elements(first.Name); + PopulateListFromElements(genericType, elements, list); } @@ -152,7 +152,7 @@ protected virtual object Map(object x, XElement root) if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { // if the value is empty, set the property to null... - if (value == null || String.IsNullOrEmpty(value.ToString())) + if (value == null || string.IsNullOrEmpty(value.ToString())) { prop.SetValue(x, null, null); continue; @@ -164,6 +164,7 @@ protected virtual object Map(object x, XElement root) if (type == typeof(bool)) { var toConvert = value.ToString().ToLower(); + prop.SetValue(x, XmlConvert.ToBoolean(toConvert), null); } else if (type.IsPrimitive) @@ -173,11 +174,13 @@ protected virtual object Map(object x, XElement root) else if (type.IsEnum) { var converted = type.FindEnumValue(value.ToString(), Culture); + prop.SetValue(x, converted, null); } else if (type == typeof(Uri)) { var uri = new Uri(value.ToString(), UriKind.RelativeOrAbsolute); + prop.SetValue(x, uri, null); } else if (type == typeof(string)) @@ -186,14 +189,9 @@ protected virtual object Map(object x, XElement root) } else if (type == typeof(DateTime)) { - if (DateFormat.HasValue()) - { - value = DateTime.ParseExact(value.ToString(), DateFormat, Culture); - } - else - { - value = DateTime.Parse(value.ToString(), Culture); - } + value = this.DateFormat.HasValue() + ? DateTime.ParseExact(value.ToString(), this.DateFormat, this.Culture) + : DateTime.Parse(value.ToString(), this.Culture); prop.SetValue(x, value, null); } @@ -227,26 +225,28 @@ protected virtual object Map(object x, XElement root) } } } - else if (type == typeof(Decimal)) + else if (type == typeof(decimal)) { - value = Decimal.Parse(value.ToString(), Culture); + value = decimal.Parse(value.ToString(), Culture); prop.SetValue(x, value, null); } else if (type == typeof(Guid)) { var raw = value.ToString(); + value = string.IsNullOrEmpty(raw) ? Guid.Empty : new Guid(value.ToString()); prop.SetValue(x, value, null); } else if (type == typeof(TimeSpan)) { var timeSpan = XmlConvert.ToTimeSpan(value.ToString()); + prop.SetValue(x, timeSpan, null); } else if (type.IsGenericType) { var t = type.GetGenericArguments()[0]; - var list = (IList)Activator.CreateInstance(type); + var list = (IList) Activator.CreateInstance(type); var container = GetElementByName(root, prop.Name.AsNamespaced(Namespace)); if (container.HasElements) @@ -264,6 +264,7 @@ protected virtual object Map(object x, XElement root) // handles classes that derive from List // e.g. a collection that also has attributes var list = HandleListDerivative(x, root, prop.Name, type); + prop.SetValue(x, list, null); } else @@ -285,6 +286,7 @@ protected virtual object Map(object x, XElement root) if (element != null) { var item = CreateAndMap(type, element); + prop.SetValue(x, item, null); } } @@ -303,13 +305,16 @@ private static bool TryGetFromString(string inputString, out object result, Type if (converter.CanConvertFrom(typeof(string))) { result = (converter.ConvertFromInvariantString(inputString)); + return true; } result = null; + return false; #else result = null; + return false; #endif } @@ -319,40 +324,33 @@ private void PopulateListFromElements(Type t, IEnumerable elements, IL foreach (var element in elements) { var item = CreateAndMap(t, element); + list.Add(item); } } private object HandleListDerivative(object x, XElement root, string propName, Type type) { - Type t; - - if (type.IsGenericType) - { - t = type.GetGenericArguments()[0]; - } - else - { - t = type.BaseType.GetGenericArguments()[0]; - } - - var list = (IList)Activator.CreateInstance(type); + var t = type.IsGenericType ? type.GetGenericArguments()[0] : type.BaseType.GetGenericArguments()[0]; + var list = (IList) Activator.CreateInstance(type); var elements = root.Descendants(t.Name.AsNamespaced(Namespace)); var name = t.Name; - var attribute = t.GetAttribute(); + if (attribute != null) name = attribute.Name; if (!elements.Any()) { var lowerName = name.ToLower().AsNamespaced(Namespace); + elements = root.Descendants(lowerName); } if (!elements.Any()) { var camelName = name.ToCamelCase(Culture).AsNamespaced(Namespace); + elements = root.Descendants(camelName); } @@ -364,6 +362,7 @@ private object HandleListDerivative(object x, XElement root, string propName, Ty if (!elements.Any()) { var lowerName = name.ToLower().AsNamespaced(Namespace); + elements = root.Descendants().Where(e => e.Name.LocalName.RemoveUnderscoresAndDashes() == lowerName); } @@ -373,7 +372,8 @@ private object HandleListDerivative(object x, XElement root, string propName, Ty // only if this isn't a generic type if (!type.IsGenericType) { - Map(list, root.Element(propName.AsNamespaced(Namespace)) ?? root); // when using RootElement, the heirarchy is different + Map(list, root.Element(propName.AsNamespaced(Namespace)) ?? root); + // when using RootElement, the heirarchy is different } return list; @@ -383,7 +383,7 @@ protected virtual object CreateAndMap(Type t, XElement element) { object item; - if (t == typeof(String)) + if (t == typeof(string)) { item = element.Value; } @@ -457,7 +457,7 @@ protected virtual XElement GetElementByName(XElement root, XName name) // try looking for element that matches sanitized property name (Order by depth) return root.Descendants() .OrderBy(d => d.Ancestors().Count()) - .FirstOrDefault(d => d.Name.LocalName.RemoveUnderscoresAndDashes() == name.LocalName) ?? + .FirstOrDefault(d => d.Name.LocalName.RemoveUnderscoresAndDashes() == name.LocalName) ?? root.Descendants() .OrderBy(d => d.Ancestors().Count()) .FirstOrDefault(d => d.Name.LocalName.RemoveUnderscoresAndDashes() == name.LocalName.ToLower()); @@ -466,11 +466,11 @@ protected virtual XElement GetElementByName(XElement root, XName name) protected virtual XAttribute GetAttributeByName(XElement root, XName name) { var names = new List - { - name.LocalName, - name.LocalName.ToLower().AsNamespaced(name.NamespaceName), - name.LocalName.ToCamelCase(Culture).AsNamespaced(name.NamespaceName) - }; + { + name.LocalName, + name.LocalName.ToLower().AsNamespaced(name.NamespaceName), + name.LocalName.ToCamelCase(Culture).AsNamespaced(name.NamespaceName) + }; return root.DescendantsAndSelf() .OrderBy(d => d.Ancestors().Count()) diff --git a/RestSharp/Enum.cs b/RestSharp/Enum.cs index 6102880cc..5ff6ad02a 100644 --- a/RestSharp/Enum.cs +++ b/RestSharp/Enum.cs @@ -61,12 +61,12 @@ public struct DateFormat /// /// .NET format string for ISO 8601 date format /// - public const string Iso8601 = "s"; + public const string ISO_8601 = "s"; /// /// .NET format string for roundtrip date format /// - public const string RoundTrip = "u"; + public const string ROUND_TRIP = "u"; } /// diff --git a/RestSharp/Extensions/MonoHttp/Helpers.cs b/RestSharp/Extensions/MonoHttp/Helpers.cs index 8863e1b9b..7f837ee07 100644 --- a/RestSharp/Extensions/MonoHttp/Helpers.cs +++ b/RestSharp/Extensions/MonoHttp/Helpers.cs @@ -26,9 +26,10 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // + using System.Globalization; -namespace RestSharp.Contrib +namespace RestSharp.Extensions.MonoHttp { class Helpers { diff --git a/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs b/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs index 3862daa61..9d5ddcfcd 100644 --- a/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs +++ b/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs @@ -30,31 +30,33 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // + using System; using System.Collections.Generic; using System.IO; using System.Text; + #if NET_4_0 using System.Web.Configuration; #endif -namespace RestSharp.Contrib +namespace RestSharp.Extensions.MonoHttp { #if NET_4_0 public #endif class HttpEncoder { - static char[] hexChars = "0123456789abcdef".ToCharArray(); - static object entitiesLock = new object(); + static readonly char[] hexChars = "0123456789abcdef".ToCharArray(); + static readonly object entitiesLock = new object(); static SortedDictionary entities; #if NET_4_0 static Lazy defaultEncoder; static Lazy currentEncoderLazy; #else - static HttpEncoder defaultEncoder; + static readonly HttpEncoder defaultEncoder; #endif - static HttpEncoder currentEncoder; + static readonly HttpEncoder currentEncoder; static IDictionary Entities { @@ -85,6 +87,7 @@ public static HttpEncoder Current { if (value == null) throw new ArgumentNullException ("value"); + currentEncoder = value; } #endif @@ -113,8 +116,6 @@ static HttpEncoder() #endif } - public HttpEncoder() { } - #if NET_4_0 protected internal virtual #else @@ -122,15 +123,8 @@ internal static #endif void HeaderNameValueEncode(string headerName, string headerValue, out string encodedHeaderName, out string encodedHeaderValue) { - if (String.IsNullOrEmpty(headerName)) - encodedHeaderName = headerName; - else - encodedHeaderName = EncodeHeaderString(headerName); - - if (String.IsNullOrEmpty(headerValue)) - encodedHeaderValue = headerValue; - else - encodedHeaderValue = EncodeHeaderString(headerValue); + encodedHeaderName = string.IsNullOrEmpty(headerName) ? headerName : EncodeHeaderString(headerName); + encodedHeaderValue = string.IsNullOrEmpty(headerValue) ? headerValue : EncodeHeaderString(headerValue); } static void StringBuilderAppend(string s, ref StringBuilder sb) @@ -144,20 +138,14 @@ static void StringBuilderAppend(string s, ref StringBuilder sb) static string EncodeHeaderString(string input) { StringBuilder sb = null; - char ch; - for (int i = 0; i < input.Length; i++) + foreach (var ch in input) { - ch = input[i]; - if ((ch < 32 && ch != 9) || ch == 127) - StringBuilderAppend(String.Format("%{0:x2}", (int)ch), ref sb); + StringBuilderAppend(string.Format("%{0:x2}", (int) ch), ref sb); } - if (sb != null) - return sb.ToString(); - - return input; + return sb != null ? sb.ToString() : input; } #if NET_4_0 @@ -223,7 +211,7 @@ internal static #endif string UrlPathEncode(string value) { - if (String.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return value; MemoryStream result = new MemoryStream(); @@ -233,6 +221,7 @@ string UrlPathEncode(string value) UrlPathEncodeChar(value[i], result); byte[] bytes = result.ToArray(); + return Encoding.ASCII.GetString(bytes, 0, bytes.Length); } @@ -256,7 +245,7 @@ internal static byte[] UrlEncodeToBytes(byte[] bytes, int offset, int count) int end = offset + count; for (int i = offset; i < end; i++) - UrlEncodeChar((char)bytes[i], result, false); + UrlEncodeChar((char) bytes[i], result, false); return result.ToArray(); } @@ -267,7 +256,7 @@ internal static string HtmlEncode(string s) return null; if (s.Length == 0) - return String.Empty; + return string.Empty; bool needEncode = false; @@ -278,7 +267,7 @@ internal static string HtmlEncode(string s) #if NET_4_0 || c == '\'' #endif - ) +) { needEncode = true; break; @@ -289,7 +278,6 @@ internal static string HtmlEncode(string s) return s; StringBuilder output = new StringBuilder(); - char ch; int len = s.Length; for (int i = 0; i < len; i++) @@ -327,12 +315,12 @@ internal static string HtmlEncode(string s) break; default: - ch = s[i]; + var ch = s[i]; if (ch > 159 && ch < 256) { output.Append("&#"); - output.Append(((int)ch).ToString(Helpers.InvariantCulture)); + output.Append(((int) ch).ToString(Helpers.InvariantCulture)); output.Append(";"); } else @@ -355,7 +343,7 @@ internal static string HtmlAttributeEncode(string s) return null; if (s.Length == 0) - return String.Empty; + return string.Empty; #endif bool needEncode = false; @@ -367,7 +355,7 @@ internal static string HtmlAttributeEncode(string s) #if NET_4_0 || c == '\'' #endif - ) +) { needEncode = true; break; @@ -396,9 +384,9 @@ internal static string HtmlAttributeEncode(string s) break; #if NET_4_0 - case '\'': - output.Append ("'"); - break; + case '\'': + output.Append ("'"); + break; #endif default: @@ -415,10 +403,11 @@ internal static string HtmlDecode(string s) return null; if (s.Length == 0) - return String.Empty; + return string.Empty; if (s.IndexOf('&') == -1) return s; + #if NET_4_0 StringBuilder rawEntity = new StringBuilder (); #endif @@ -432,8 +421,8 @@ internal static string HtmlDecode(string s) // 3 -> '#' found after '&' and getting numbers int state = 0; int number = 0; - bool is_hex_value = false; - bool have_trailing_digits = false; + bool isHexValue = false; + bool haveTrailingDigits = false; for (int i = 0; i < len; i++) { @@ -461,136 +450,130 @@ internal static string HtmlDecode(string s) { state = 1; - if (have_trailing_digits) + if (haveTrailingDigits) { entity.Append(number.ToString(Helpers.InvariantCulture)); - have_trailing_digits = false; + haveTrailingDigits = false; } - output.Append(entity.ToString()); + output.Append(entity); entity.Length = 0; entity.Append('&'); continue; } - if (state == 1) + switch (state) { - if (c == ';') - { - state = 0; - output.Append(entity.ToString()); - output.Append(c); - entity.Length = 0; - } - else - { - number = 0; - is_hex_value = false; - if (c != '#') + case 1: + if (c == ';') { - state = 2; + state = 0; + output.Append(entity); + output.Append(c); + entity.Length = 0; } else { - state = 3; + number = 0; + isHexValue = false; + state = c != '#' ? 2 : 3; + entity.Append(c); +#if NET_4_0 + rawEntity.Append (c); +#endif } + break; + case 2: entity.Append(c); -#if NET_4_0 - rawEntity.Append (c); -#endif - } - } - else if (state == 2) - { - entity.Append(c); - if (c == ';') - { - string key = entity.ToString(); + if (c == ';') + { + string key = entity.ToString(); - if (key.Length > 1 && Entities.ContainsKey(key.Substring(1, key.Length - 2))) - key = Entities[key.Substring(1, key.Length - 2)].ToString(); + if (key.Length > 1 && Entities.ContainsKey(key.Substring(1, key.Length - 2))) + key = Entities[key.Substring(1, key.Length - 2)].ToString(); - output.Append(key); - state = 0; - entity.Length = 0; + output.Append(key); + state = 0; + entity.Length = 0; #if NET_4_0 - rawEntity.Length = 0; + rawEntity.Length = 0; #endif - } - } - else if (state == 3) - { - if (c == ';') - { + } + break; + + case 3: + if (c == ';') + { #if NET_4_0 if (number == 0) output.Append (rawEntity.ToString () + ";"); else #endif - if (number > 65535) - { - output.Append("&#"); - output.Append(number.ToString(Helpers.InvariantCulture)); - output.Append(";"); - } - else - { - output.Append((char)number); - } - - state = 0; - entity.Length = 0; + if (number > 65535) + { + output.Append("&#"); + output.Append(number.ToString(Helpers.InvariantCulture)); + output.Append(";"); + } + else + { + output.Append((char) number); + } + + state = 0; + entity.Length = 0; #if NET_4_0 - rawEntity.Length = 0; + rawEntity.Length = 0; #endif - have_trailing_digits = false; - } - else if (is_hex_value && Uri.IsHexDigit(c)) - { - number = number * 16 + Uri.FromHex(c); - have_trailing_digits = true; + haveTrailingDigits = false; + } + else if (isHexValue && Uri.IsHexDigit(c)) + { + number = number * 16 + Uri.FromHex(c); + haveTrailingDigits = true; #if NET_4_0 rawEntity.Append (c); #endif - } - else if (Char.IsDigit(c)) - { - number = number * 10 + ((int)c - '0'); - have_trailing_digits = true; + } + else if (char.IsDigit(c)) + { + number = number * 10 + (c - '0'); + haveTrailingDigits = true; #if NET_4_0 - rawEntity.Append (c); + rawEntity.Append (c); #endif - } - else if (number == 0 && (c == 'x' || c == 'X')) - { - is_hex_value = true; + } + else if (number == 0 && (c == 'x' || c == 'X')) + { + isHexValue = true; #if NET_4_0 - rawEntity.Append (c); + rawEntity.Append (c); #endif - } - else - { - state = 2; - - if (have_trailing_digits) - { - entity.Append(number.ToString(Helpers.InvariantCulture)); - have_trailing_digits = false; } + else + { + state = 2; - entity.Append(c); - } + if (haveTrailingDigits) + { + entity.Append(number.ToString(Helpers.InvariantCulture)); + haveTrailingDigits = false; + } + + entity.Append(c); + } + break; } } if (entity.Length > 0) { - output.Append(entity.ToString()); + output.Append(entity); } - else if (have_trailing_digits) + else if (haveTrailingDigits) { output.Append(number.ToString(Helpers.InvariantCulture)); } @@ -602,9 +585,9 @@ internal static bool NotEncoded(char c) { return (c == '!' || c == '(' || c == ')' || c == '*' || c == '-' || c == '.' || c == '_' #if !NET_4_0 - || c == '\'' + || c == '\'' #endif - ); +); } internal static void UrlEncodeChar(char c, Stream result, bool isUnicode) @@ -614,32 +597,35 @@ internal static void UrlEncodeChar(char c, Stream result, bool isUnicode) //FIXME: what happens when there is an internal error? //if (!isUnicode) // throw new ArgumentOutOfRangeException ("c", c, "c must be less than 256"); - int idx; - int i = (int)c; + int i = c; + + result.WriteByte((byte) '%'); + result.WriteByte((byte) 'u'); + + int idx = i >> 12; - result.WriteByte((byte)'%'); - result.WriteByte((byte)'u'); - idx = i >> 12; - result.WriteByte((byte)hexChars[idx]); + result.WriteByte((byte) hexChars[idx]); idx = (i >> 8) & 0x0F; - result.WriteByte((byte)hexChars[idx]); + result.WriteByte((byte) hexChars[idx]); idx = (i >> 4) & 0x0F; - result.WriteByte((byte)hexChars[idx]); + result.WriteByte((byte) hexChars[idx]); idx = i & 0x0F; - result.WriteByte((byte)hexChars[idx]); + result.WriteByte((byte) hexChars[idx]); return; } if (c > ' ' && NotEncoded(c)) { - result.WriteByte((byte)c); + result.WriteByte((byte) c); + return; } if (c == ' ') { - result.WriteByte((byte)'+'); + result.WriteByte((byte) '+'); + return; } @@ -650,22 +636,22 @@ internal static void UrlEncodeChar(char c, Stream result, bool isUnicode) { if (isUnicode && c > 127) { - result.WriteByte((byte)'%'); - result.WriteByte((byte)'u'); - result.WriteByte((byte)'0'); - result.WriteByte((byte)'0'); + result.WriteByte((byte) '%'); + result.WriteByte((byte) 'u'); + result.WriteByte((byte) '0'); + result.WriteByte((byte) '0'); } else - result.WriteByte((byte)'%'); + result.WriteByte((byte) '%'); - int idx = ((int)c) >> 4; + int idx = c >> 4; - result.WriteByte((byte)hexChars[idx]); - idx = ((int)c) & 0x0F; - result.WriteByte((byte)hexChars[idx]); + result.WriteByte((byte) hexChars[idx]); + idx = c & 0x0F; + result.WriteByte((byte) hexChars[idx]); } else - result.WriteByte((byte)c); + result.WriteByte((byte) c); } internal static void UrlPathEncodeChar(char c, Stream result) @@ -676,282 +662,284 @@ internal static void UrlPathEncodeChar(char c, Stream result) for (int i = 0; i < bIn.Length; i++) { - result.WriteByte((byte)'%'); + result.WriteByte((byte) '%'); - int idx = ((int)bIn[i]) >> 4; + int idx = bIn[i] >> 4; - result.WriteByte((byte)hexChars[idx]); - idx = ((int)bIn[i]) & 0x0F; - result.WriteByte((byte)hexChars[idx]); + result.WriteByte((byte) hexChars[idx]); + idx = bIn[i] & 0x0F; + result.WriteByte((byte) hexChars[idx]); } } else if (c == ' ') { - result.WriteByte((byte)'%'); - result.WriteByte((byte)'2'); - result.WriteByte((byte)'0'); + result.WriteByte((byte) '%'); + result.WriteByte((byte) '2'); + result.WriteByte((byte) '0'); } else - result.WriteByte((byte)c); + result.WriteByte((byte) c); } static void InitEntities() { // Build the hash table of HTML entity references. This list comes // from the HTML 4.01 W3C recommendation. - entities = new SortedDictionary(StringComparer.Ordinal); - entities.Add("nbsp", '\u00A0'); - entities.Add("iexcl", '\u00A1'); - entities.Add("cent", '\u00A2'); - entities.Add("pound", '\u00A3'); - entities.Add("curren", '\u00A4'); - entities.Add("yen", '\u00A5'); - entities.Add("brvbar", '\u00A6'); - entities.Add("sect", '\u00A7'); - entities.Add("uml", '\u00A8'); - entities.Add("copy", '\u00A9'); - entities.Add("ordf", '\u00AA'); - entities.Add("laquo", '\u00AB'); - entities.Add("not", '\u00AC'); - entities.Add("shy", '\u00AD'); - entities.Add("reg", '\u00AE'); - entities.Add("macr", '\u00AF'); - entities.Add("deg", '\u00B0'); - entities.Add("plusmn", '\u00B1'); - entities.Add("sup2", '\u00B2'); - entities.Add("sup3", '\u00B3'); - entities.Add("acute", '\u00B4'); - entities.Add("micro", '\u00B5'); - entities.Add("para", '\u00B6'); - entities.Add("middot", '\u00B7'); - entities.Add("cedil", '\u00B8'); - entities.Add("sup1", '\u00B9'); - entities.Add("ordm", '\u00BA'); - entities.Add("raquo", '\u00BB'); - entities.Add("frac14", '\u00BC'); - entities.Add("frac12", '\u00BD'); - entities.Add("frac34", '\u00BE'); - entities.Add("iquest", '\u00BF'); - entities.Add("Agrave", '\u00C0'); - entities.Add("Aacute", '\u00C1'); - entities.Add("Acirc", '\u00C2'); - entities.Add("Atilde", '\u00C3'); - entities.Add("Auml", '\u00C4'); - entities.Add("Aring", '\u00C5'); - entities.Add("AElig", '\u00C6'); - entities.Add("Ccedil", '\u00C7'); - entities.Add("Egrave", '\u00C8'); - entities.Add("Eacute", '\u00C9'); - entities.Add("Ecirc", '\u00CA'); - entities.Add("Euml", '\u00CB'); - entities.Add("Igrave", '\u00CC'); - entities.Add("Iacute", '\u00CD'); - entities.Add("Icirc", '\u00CE'); - entities.Add("Iuml", '\u00CF'); - entities.Add("ETH", '\u00D0'); - entities.Add("Ntilde", '\u00D1'); - entities.Add("Ograve", '\u00D2'); - entities.Add("Oacute", '\u00D3'); - entities.Add("Ocirc", '\u00D4'); - entities.Add("Otilde", '\u00D5'); - entities.Add("Ouml", '\u00D6'); - entities.Add("times", '\u00D7'); - entities.Add("Oslash", '\u00D8'); - entities.Add("Ugrave", '\u00D9'); - entities.Add("Uacute", '\u00DA'); - entities.Add("Ucirc", '\u00DB'); - entities.Add("Uuml", '\u00DC'); - entities.Add("Yacute", '\u00DD'); - entities.Add("THORN", '\u00DE'); - entities.Add("szlig", '\u00DF'); - entities.Add("agrave", '\u00E0'); - entities.Add("aacute", '\u00E1'); - entities.Add("acirc", '\u00E2'); - entities.Add("atilde", '\u00E3'); - entities.Add("auml", '\u00E4'); - entities.Add("aring", '\u00E5'); - entities.Add("aelig", '\u00E6'); - entities.Add("ccedil", '\u00E7'); - entities.Add("egrave", '\u00E8'); - entities.Add("eacute", '\u00E9'); - entities.Add("ecirc", '\u00EA'); - entities.Add("euml", '\u00EB'); - entities.Add("igrave", '\u00EC'); - entities.Add("iacute", '\u00ED'); - entities.Add("icirc", '\u00EE'); - entities.Add("iuml", '\u00EF'); - entities.Add("eth", '\u00F0'); - entities.Add("ntilde", '\u00F1'); - entities.Add("ograve", '\u00F2'); - entities.Add("oacute", '\u00F3'); - entities.Add("ocirc", '\u00F4'); - entities.Add("otilde", '\u00F5'); - entities.Add("ouml", '\u00F6'); - entities.Add("divide", '\u00F7'); - entities.Add("oslash", '\u00F8'); - entities.Add("ugrave", '\u00F9'); - entities.Add("uacute", '\u00FA'); - entities.Add("ucirc", '\u00FB'); - entities.Add("uuml", '\u00FC'); - entities.Add("yacute", '\u00FD'); - entities.Add("thorn", '\u00FE'); - entities.Add("yuml", '\u00FF'); - entities.Add("fnof", '\u0192'); - entities.Add("Alpha", '\u0391'); - entities.Add("Beta", '\u0392'); - entities.Add("Gamma", '\u0393'); - entities.Add("Delta", '\u0394'); - entities.Add("Epsilon", '\u0395'); - entities.Add("Zeta", '\u0396'); - entities.Add("Eta", '\u0397'); - entities.Add("Theta", '\u0398'); - entities.Add("Iota", '\u0399'); - entities.Add("Kappa", '\u039A'); - entities.Add("Lambda", '\u039B'); - entities.Add("Mu", '\u039C'); - entities.Add("Nu", '\u039D'); - entities.Add("Xi", '\u039E'); - entities.Add("Omicron", '\u039F'); - entities.Add("Pi", '\u03A0'); - entities.Add("Rho", '\u03A1'); - entities.Add("Sigma", '\u03A3'); - entities.Add("Tau", '\u03A4'); - entities.Add("Upsilon", '\u03A5'); - entities.Add("Phi", '\u03A6'); - entities.Add("Chi", '\u03A7'); - entities.Add("Psi", '\u03A8'); - entities.Add("Omega", '\u03A9'); - entities.Add("alpha", '\u03B1'); - entities.Add("beta", '\u03B2'); - entities.Add("gamma", '\u03B3'); - entities.Add("delta", '\u03B4'); - entities.Add("epsilon", '\u03B5'); - entities.Add("zeta", '\u03B6'); - entities.Add("eta", '\u03B7'); - entities.Add("theta", '\u03B8'); - entities.Add("iota", '\u03B9'); - entities.Add("kappa", '\u03BA'); - entities.Add("lambda", '\u03BB'); - entities.Add("mu", '\u03BC'); - entities.Add("nu", '\u03BD'); - entities.Add("xi", '\u03BE'); - entities.Add("omicron", '\u03BF'); - entities.Add("pi", '\u03C0'); - entities.Add("rho", '\u03C1'); - entities.Add("sigmaf", '\u03C2'); - entities.Add("sigma", '\u03C3'); - entities.Add("tau", '\u03C4'); - entities.Add("upsilon", '\u03C5'); - entities.Add("phi", '\u03C6'); - entities.Add("chi", '\u03C7'); - entities.Add("psi", '\u03C8'); - entities.Add("omega", '\u03C9'); - entities.Add("thetasym", '\u03D1'); - entities.Add("upsih", '\u03D2'); - entities.Add("piv", '\u03D6'); - entities.Add("bull", '\u2022'); - entities.Add("hellip", '\u2026'); - entities.Add("prime", '\u2032'); - entities.Add("Prime", '\u2033'); - entities.Add("oline", '\u203E'); - entities.Add("frasl", '\u2044'); - entities.Add("weierp", '\u2118'); - entities.Add("image", '\u2111'); - entities.Add("real", '\u211C'); - entities.Add("trade", '\u2122'); - entities.Add("alefsym", '\u2135'); - entities.Add("larr", '\u2190'); - entities.Add("uarr", '\u2191'); - entities.Add("rarr", '\u2192'); - entities.Add("darr", '\u2193'); - entities.Add("harr", '\u2194'); - entities.Add("crarr", '\u21B5'); - entities.Add("lArr", '\u21D0'); - entities.Add("uArr", '\u21D1'); - entities.Add("rArr", '\u21D2'); - entities.Add("dArr", '\u21D3'); - entities.Add("hArr", '\u21D4'); - entities.Add("forall", '\u2200'); - entities.Add("part", '\u2202'); - entities.Add("exist", '\u2203'); - entities.Add("empty", '\u2205'); - entities.Add("nabla", '\u2207'); - entities.Add("isin", '\u2208'); - entities.Add("notin", '\u2209'); - entities.Add("ni", '\u220B'); - entities.Add("prod", '\u220F'); - entities.Add("sum", '\u2211'); - entities.Add("minus", '\u2212'); - entities.Add("lowast", '\u2217'); - entities.Add("radic", '\u221A'); - entities.Add("prop", '\u221D'); - entities.Add("infin", '\u221E'); - entities.Add("ang", '\u2220'); - entities.Add("and", '\u2227'); - entities.Add("or", '\u2228'); - entities.Add("cap", '\u2229'); - entities.Add("cup", '\u222A'); - entities.Add("int", '\u222B'); - entities.Add("there4", '\u2234'); - entities.Add("sim", '\u223C'); - entities.Add("cong", '\u2245'); - entities.Add("asymp", '\u2248'); - entities.Add("ne", '\u2260'); - entities.Add("equiv", '\u2261'); - entities.Add("le", '\u2264'); - entities.Add("ge", '\u2265'); - entities.Add("sub", '\u2282'); - entities.Add("sup", '\u2283'); - entities.Add("nsub", '\u2284'); - entities.Add("sube", '\u2286'); - entities.Add("supe", '\u2287'); - entities.Add("oplus", '\u2295'); - entities.Add("otimes", '\u2297'); - entities.Add("perp", '\u22A5'); - entities.Add("sdot", '\u22C5'); - entities.Add("lceil", '\u2308'); - entities.Add("rceil", '\u2309'); - entities.Add("lfloor", '\u230A'); - entities.Add("rfloor", '\u230B'); - entities.Add("lang", '\u2329'); - entities.Add("rang", '\u232A'); - entities.Add("loz", '\u25CA'); - entities.Add("spades", '\u2660'); - entities.Add("clubs", '\u2663'); - entities.Add("hearts", '\u2665'); - entities.Add("diams", '\u2666'); - entities.Add("quot", '\u0022'); - entities.Add("amp", '\u0026'); - entities.Add("lt", '\u003C'); - entities.Add("gt", '\u003E'); - entities.Add("OElig", '\u0152'); - entities.Add("oelig", '\u0153'); - entities.Add("Scaron", '\u0160'); - entities.Add("scaron", '\u0161'); - entities.Add("Yuml", '\u0178'); - entities.Add("circ", '\u02C6'); - entities.Add("tilde", '\u02DC'); - entities.Add("ensp", '\u2002'); - entities.Add("emsp", '\u2003'); - entities.Add("thinsp", '\u2009'); - entities.Add("zwnj", '\u200C'); - entities.Add("zwj", '\u200D'); - entities.Add("lrm", '\u200E'); - entities.Add("rlm", '\u200F'); - entities.Add("ndash", '\u2013'); - entities.Add("mdash", '\u2014'); - entities.Add("lsquo", '\u2018'); - entities.Add("rsquo", '\u2019'); - entities.Add("sbquo", '\u201A'); - entities.Add("ldquo", '\u201C'); - entities.Add("rdquo", '\u201D'); - entities.Add("bdquo", '\u201E'); - entities.Add("dagger", '\u2020'); - entities.Add("Dagger", '\u2021'); - entities.Add("permil", '\u2030'); - entities.Add("lsaquo", '\u2039'); - entities.Add("rsaquo", '\u203A'); - entities.Add("euro", '\u20AC'); + entities = new SortedDictionary(StringComparer.Ordinal) + { + { "nbsp", '\u00A0' }, + { "iexcl", '\u00A1' }, + { "cent", '\u00A2' }, + { "pound", '\u00A3' }, + { "curren", '\u00A4' }, + { "yen", '\u00A5' }, + { "brvbar", '\u00A6' }, + { "sect", '\u00A7' }, + { "uml", '\u00A8' }, + { "copy", '\u00A9' }, + { "ordf", '\u00AA' }, + { "laquo", '\u00AB' }, + { "not", '\u00AC' }, + { "shy", '\u00AD' }, + { "reg", '\u00AE' }, + { "macr", '\u00AF' }, + { "deg", '\u00B0' }, + { "plusmn", '\u00B1' }, + { "sup2", '\u00B2' }, + { "sup3", '\u00B3' }, + { "acute", '\u00B4' }, + { "micro", '\u00B5' }, + { "para", '\u00B6' }, + { "middot", '\u00B7' }, + { "cedil", '\u00B8' }, + { "sup1", '\u00B9' }, + { "ordm", '\u00BA' }, + { "raquo", '\u00BB' }, + { "frac14", '\u00BC' }, + { "frac12", '\u00BD' }, + { "frac34", '\u00BE' }, + { "iquest", '\u00BF' }, + { "Agrave", '\u00C0' }, + { "Aacute", '\u00C1' }, + { "Acirc", '\u00C2' }, + { "Atilde", '\u00C3' }, + { "Auml", '\u00C4' }, + { "Aring", '\u00C5' }, + { "AElig", '\u00C6' }, + { "Ccedil", '\u00C7' }, + { "Egrave", '\u00C8' }, + { "Eacute", '\u00C9' }, + { "Ecirc", '\u00CA' }, + { "Euml", '\u00CB' }, + { "Igrave", '\u00CC' }, + { "Iacute", '\u00CD' }, + { "Icirc", '\u00CE' }, + { "Iuml", '\u00CF' }, + { "ETH", '\u00D0' }, + { "Ntilde", '\u00D1' }, + { "Ograve", '\u00D2' }, + { "Oacute", '\u00D3' }, + { "Ocirc", '\u00D4' }, + { "Otilde", '\u00D5' }, + { "Ouml", '\u00D6' }, + { "times", '\u00D7' }, + { "Oslash", '\u00D8' }, + { "Ugrave", '\u00D9' }, + { "Uacute", '\u00DA' }, + { "Ucirc", '\u00DB' }, + { "Uuml", '\u00DC' }, + { "Yacute", '\u00DD' }, + { "THORN", '\u00DE' }, + { "szlig", '\u00DF' }, + { "agrave", '\u00E0' }, + { "aacute", '\u00E1' }, + { "acirc", '\u00E2' }, + { "atilde", '\u00E3' }, + { "auml", '\u00E4' }, + { "aring", '\u00E5' }, + { "aelig", '\u00E6' }, + { "ccedil", '\u00E7' }, + { "egrave", '\u00E8' }, + { "eacute", '\u00E9' }, + { "ecirc", '\u00EA' }, + { "euml", '\u00EB' }, + { "igrave", '\u00EC' }, + { "iacute", '\u00ED' }, + { "icirc", '\u00EE' }, + { "iuml", '\u00EF' }, + { "eth", '\u00F0' }, + { "ntilde", '\u00F1' }, + { "ograve", '\u00F2' }, + { "oacute", '\u00F3' }, + { "ocirc", '\u00F4' }, + { "otilde", '\u00F5' }, + { "ouml", '\u00F6' }, + { "divide", '\u00F7' }, + { "oslash", '\u00F8' }, + { "ugrave", '\u00F9' }, + { "uacute", '\u00FA' }, + { "ucirc", '\u00FB' }, + { "uuml", '\u00FC' }, + { "yacute", '\u00FD' }, + { "thorn", '\u00FE' }, + { "yuml", '\u00FF' }, + { "fnof", '\u0192' }, + { "Alpha", '\u0391' }, + { "Beta", '\u0392' }, + { "Gamma", '\u0393' }, + { "Delta", '\u0394' }, + { "Epsilon", '\u0395' }, + { "Zeta", '\u0396' }, + { "Eta", '\u0397' }, + { "Theta", '\u0398' }, + { "Iota", '\u0399' }, + { "Kappa", '\u039A' }, + { "Lambda", '\u039B' }, + { "Mu", '\u039C' }, + { "Nu", '\u039D' }, + { "Xi", '\u039E' }, + { "Omicron", '\u039F' }, + { "Pi", '\u03A0' }, + { "Rho", '\u03A1' }, + { "Sigma", '\u03A3' }, + { "Tau", '\u03A4' }, + { "Upsilon", '\u03A5' }, + { "Phi", '\u03A6' }, + { "Chi", '\u03A7' }, + { "Psi", '\u03A8' }, + { "Omega", '\u03A9' }, + { "alpha", '\u03B1' }, + { "beta", '\u03B2' }, + { "gamma", '\u03B3' }, + { "delta", '\u03B4' }, + { "epsilon", '\u03B5' }, + { "zeta", '\u03B6' }, + { "eta", '\u03B7' }, + { "theta", '\u03B8' }, + { "iota", '\u03B9' }, + { "kappa", '\u03BA' }, + { "lambda", '\u03BB' }, + { "mu", '\u03BC' }, + { "nu", '\u03BD' }, + { "xi", '\u03BE' }, + { "omicron", '\u03BF' }, + { "pi", '\u03C0' }, + { "rho", '\u03C1' }, + { "sigmaf", '\u03C2' }, + { "sigma", '\u03C3' }, + { "tau", '\u03C4' }, + { "upsilon", '\u03C5' }, + { "phi", '\u03C6' }, + { "chi", '\u03C7' }, + { "psi", '\u03C8' }, + { "omega", '\u03C9' }, + { "thetasym", '\u03D1' }, + { "upsih", '\u03D2' }, + { "piv", '\u03D6' }, + { "bull", '\u2022' }, + { "hellip", '\u2026' }, + { "prime", '\u2032' }, + { "Prime", '\u2033' }, + { "oline", '\u203E' }, + { "frasl", '\u2044' }, + { "weierp", '\u2118' }, + { "image", '\u2111' }, + { "real", '\u211C' }, + { "trade", '\u2122' }, + { "alefsym", '\u2135' }, + { "larr", '\u2190' }, + { "uarr", '\u2191' }, + { "rarr", '\u2192' }, + { "darr", '\u2193' }, + { "harr", '\u2194' }, + { "crarr", '\u21B5' }, + { "lArr", '\u21D0' }, + { "uArr", '\u21D1' }, + { "rArr", '\u21D2' }, + { "dArr", '\u21D3' }, + { "hArr", '\u21D4' }, + { "forall", '\u2200' }, + { "part", '\u2202' }, + { "exist", '\u2203' }, + { "empty", '\u2205' }, + { "nabla", '\u2207' }, + { "isin", '\u2208' }, + { "notin", '\u2209' }, + { "ni", '\u220B' }, + { "prod", '\u220F' }, + { "sum", '\u2211' }, + { "minus", '\u2212' }, + { "lowast", '\u2217' }, + { "radic", '\u221A' }, + { "prop", '\u221D' }, + { "infin", '\u221E' }, + { "ang", '\u2220' }, + { "and", '\u2227' }, + { "or", '\u2228' }, + { "cap", '\u2229' }, + { "cup", '\u222A' }, + { "int", '\u222B' }, + { "there4", '\u2234' }, + { "sim", '\u223C' }, + { "cong", '\u2245' }, + { "asymp", '\u2248' }, + { "ne", '\u2260' }, + { "equiv", '\u2261' }, + { "le", '\u2264' }, + { "ge", '\u2265' }, + { "sub", '\u2282' }, + { "sup", '\u2283' }, + { "nsub", '\u2284' }, + { "sube", '\u2286' }, + { "supe", '\u2287' }, + { "oplus", '\u2295' }, + { "otimes", '\u2297' }, + { "perp", '\u22A5' }, + { "sdot", '\u22C5' }, + { "lceil", '\u2308' }, + { "rceil", '\u2309' }, + { "lfloor", '\u230A' }, + { "rfloor", '\u230B' }, + { "lang", '\u2329' }, + { "rang", '\u232A' }, + { "loz", '\u25CA' }, + { "spades", '\u2660' }, + { "clubs", '\u2663' }, + { "hearts", '\u2665' }, + { "diams", '\u2666' }, + { "quot", '\u0022' }, + { "amp", '\u0026' }, + { "lt", '\u003C' }, + { "gt", '\u003E' }, + { "OElig", '\u0152' }, + { "oelig", '\u0153' }, + { "Scaron", '\u0160' }, + { "scaron", '\u0161' }, + { "Yuml", '\u0178' }, + { "circ", '\u02C6' }, + { "tilde", '\u02DC' }, + { "ensp", '\u2002' }, + { "emsp", '\u2003' }, + { "thinsp", '\u2009' }, + { "zwnj", '\u200C' }, + { "zwj", '\u200D' }, + { "lrm", '\u200E' }, + { "rlm", '\u200F' }, + { "ndash", '\u2013' }, + { "mdash", '\u2014' }, + { "lsquo", '\u2018' }, + { "rsquo", '\u2019' }, + { "sbquo", '\u201A' }, + { "ldquo", '\u201C' }, + { "rdquo", '\u201D' }, + { "bdquo", '\u201E' }, + { "dagger", '\u2020' }, + { "Dagger", '\u2021' }, + { "permil", '\u2030' }, + { "lsaquo", '\u2039' }, + { "rsaquo", '\u203A' }, + { "euro", '\u20AC' } + }; } } } diff --git a/RestSharp/Extensions/MonoHttp/HttpUtility.cs b/RestSharp/Extensions/MonoHttp/HttpUtility.cs index 8899b3b41..5327a6f37 100644 --- a/RestSharp/Extensions/MonoHttp/HttpUtility.cs +++ b/RestSharp/Extensions/MonoHttp/HttpUtility.cs @@ -36,16 +36,12 @@ using System.IO; using System.Text; -namespace RestSharp.Contrib +namespace RestSharp.Extensions.MonoHttp { - //#if !MONOTOUCH - // // CAS - no InheritanceDemand here as the class is sealed - // [AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] - //#endif public sealed class HttpUtility { - sealed class HttpQSCollection : NameValueCollection + sealed class HttpQsCollection : NameValueCollection { public override string ToString() { @@ -754,7 +750,7 @@ public static NameValueCollection ParseQueryString(string query, Encoding encodi if (query[0] == '?') query = query.Substring(1); - NameValueCollection result = new HttpQSCollection(); + NameValueCollection result = new HttpQsCollection(); ParseQueryString(query, encoding, result); diff --git a/RestSharp/Extensions/ReflectionExtensions.cs b/RestSharp/Extensions/ReflectionExtensions.cs index 3c2dea41c..b3e6c125f 100644 --- a/RestSharp/Extensions/ReflectionExtensions.cs +++ b/RestSharp/Extensions/ReflectionExtensions.cs @@ -56,7 +56,7 @@ public static T GetAttribute(this Type type) where T : Attribute /// public static bool IsSubclassOfRawGeneric(this Type toCheck, Type generic) { - while (toCheck != typeof(object)) + while (toCheck != null && toCheck != typeof(object)) { var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck; diff --git a/RestSharp/Extensions/StringExtensions.cs b/RestSharp/Extensions/StringExtensions.cs index 513360a84..f408da6e1 100644 --- a/RestSharp/Extensions/StringExtensions.cs +++ b/RestSharp/Extensions/StringExtensions.cs @@ -16,21 +16,20 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Globalization; -#if SILVERLIGHT -using System.Windows.Browser; +#if WINDOWS_PHONE +using System.Net; #endif -#if WINDOWS_PHONE +#if SILVERLIGHT +using System.Windows.Browser; #endif -#if FRAMEWORK || MONOTOUCH || MONODROID -using RestSharp.Contrib; +#if !SILVERLIGHT && !WINDOWS_PHONE +using RestSharp.Extensions.MonoHttp; #endif namespace RestSharp.Extensions @@ -49,6 +48,7 @@ public static string UrlDecode(this string input) public static string UrlEncode(this string input) { const int maxLength = 32766; + if (input == null) throw new ArgumentNullException("input"); @@ -119,18 +119,13 @@ public static DateTime ParseJsonDate(this string input, CultureInfo culture) input = input.Replace("\r", ""); input = input.RemoveSurroundingQuotes(); - long? unix = null; + long unix; - try - { - unix = Int64.Parse(input); - } - catch (Exception) { }; - - if (unix.HasValue) + if (long.TryParse(input, out unix)) { var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); - return epoch.AddSeconds(unix.Value); + + return epoch.AddSeconds(unix); } if (input.Contains("/Date(")) @@ -141,6 +136,7 @@ public static DateTime ParseJsonDate(this string input, CultureInfo culture) if (input.Contains("new Date(")) { input = input.Replace(" ", ""); + // because all whitespace is removed, match against newDate( instead of new Date( return ExtractDate(input, @"newDate\((-?\d+)*\)", culture); } @@ -166,17 +162,17 @@ public static string RemoveSurroundingQuotes(this string input) private static DateTime ParseFormattedDate(string input, CultureInfo culture) { - var formats = new[] - { - "u", - "s", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", - "yyyy-MM-ddTHH:mm:ssZ", - "yyyy-MM-dd HH:mm:ssZ", - "yyyy-MM-ddTHH:mm:ss", - "yyyy-MM-ddTHH:mm:sszzzzzz", - "M/d/yyyy h:mm:ss tt" // default format for invariant culture - }; + var formats = new [] + { + "u", + "s", + "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", + "yyyy-MM-ddTHH:mm:ssZ", + "yyyy-MM-dd HH:mm:ssZ", + "yyyy-MM-ddTHH:mm:ss", + "yyyy-MM-ddTHH:mm:sszzzzzz", + "M/d/yyyy h:mm:ss tt" // default format for invariant culture + }; DateTime date; @@ -208,18 +204,11 @@ private static DateTime ExtractDate(string input, string pattern, CultureInfo cu dt = epoch.AddMilliseconds(ms); // adjust if time zone modifier present - if (match.Groups.Count > 2 && !String.IsNullOrEmpty(match.Groups[3].Value)) + if (match.Groups.Count > 2 && !string.IsNullOrEmpty(match.Groups[3].Value)) { var mod = DateTime.ParseExact(match.Groups[3].Value, "HHmm", culture); - if (match.Groups[2].Value == "+") - { - dt = dt.Add(mod.TimeOfDay); - } - else - { - dt = dt.Subtract(mod.TimeOfDay); - } + dt = match.Groups[2].Value == "+" ? dt.Add(mod.TimeOfDay) : dt.Subtract(mod.TimeOfDay); } } @@ -257,12 +246,12 @@ public static string ToPascalCase(this string lowercaseAndUnderscoredWord, Cultu /// public static string ToPascalCase(this string text, bool removeUnderscores, CultureInfo culture) { - if (String.IsNullOrEmpty(text)) + if (string.IsNullOrEmpty(text)) return text; text = text.Replace("_", " "); - string joinString = removeUnderscores ? String.Empty : "_"; + string joinString = removeUnderscores ? string.Empty : "_"; string[] words = text.Split(' '); if (words.Length > 1 || words[0].IsUpperCase()) @@ -279,14 +268,14 @@ public static string ToPascalCase(this string text, bool removeUnderscores, Cult char firstChar = char.ToUpper(word[0], culture); - words[i] = String.Concat(firstChar, restOfWord); + words[i] = string.Concat(firstChar, restOfWord); } } - return String.Join(joinString, words); + return string.Join(joinString, words); } - return String.Concat(words[0].Substring(0, 1).ToUpper(culture), words[0].Substring(1)); + return string.Concat(words[0].Substring(0, 1).ToUpper(culture), words[0].Substring(1)); } /// @@ -307,7 +296,7 @@ public static string ToCamelCase(this string lowercaseAndUnderscoredWord, Cultur /// string public static string MakeInitialLowerCase(this string word) { - return String.Concat(word.Substring(0, 1).ToLower(), word.Substring(1)); + return string.Concat(word.Substring(0, 1).ToLower(), word.Substring(1)); } /// @@ -386,7 +375,7 @@ public static string AddSpaces(this string pascalCasedWord) /// IEnumerable<string> public static IEnumerable GetNameVariants(this string name, CultureInfo culture) { - if (String.IsNullOrEmpty(name)) + if (string.IsNullOrEmpty(name)) yield break; yield return name; diff --git a/RestSharp/FileParameter.cs b/RestSharp/FileParameter.cs index ef79e7c1c..5747eb6a4 100644 --- a/RestSharp/FileParameter.cs +++ b/RestSharp/FileParameter.cs @@ -25,13 +25,13 @@ public static FileParameter Create(string name, byte[] data, string filename, st #endif return new FileParameter - { - Writer = s => s.Write(data, 0, data.Length), - FileName = filename, - ContentType = contentType, - ContentLength = length, - Name = name - }; + { + Writer = s => s.Write(data, 0, data.Length), + FileName = filename, + ContentType = contentType, + ContentLength = length, + Name = name + }; } /// @@ -50,10 +50,12 @@ public static FileParameter Create(string name, byte[] data, string filename) /// The length of data to be sent /// public long ContentLength { get; set; } + /// /// Provides raw data for file /// public Action Writer { get; set; } + /// /// Name of the file to use when uploading /// diff --git a/RestSharp/Http.Async.cs b/RestSharp/Http.Async.cs index 674062f96..92994fe20 100644 --- a/RestSharp/Http.Async.cs +++ b/RestSharp/Http.Async.cs @@ -30,10 +30,6 @@ using System.Windows; #endif -#if (FRAMEWORK && !MONOTOUCH && !MONODROID) - -#endif - namespace RestSharp { /// @@ -145,12 +141,14 @@ private HttpResponse CreateErrorResponse(Exception ex) if (webException != null && webException.Status == WebExceptionStatus.RequestCanceled) { response.ResponseStatus = this.timeoutState.TimedOut ? ResponseStatus.TimedOut : ResponseStatus.Aborted; + return response; } response.ErrorMessage = ex.Message; response.ErrorException = ex; response.ResponseStatus = ResponseStatus.Error; + return response; } @@ -216,6 +214,7 @@ private long CalculateContentLength() (current, param) => current + this.Encoding.GetByteCount(this.GetMultipartFormData(param))); length += this.Encoding.GetByteCount(GetMultipartFooter()); + return length; } @@ -226,7 +225,9 @@ private void RequestStreamCallback(IAsyncResult result, Action cal if (this.timeoutState.TimedOut) { var response = new HttpResponse { ResponseStatus = ResponseStatus.TimedOut }; + ExecuteCallback(response, callback); + return; } @@ -252,10 +253,12 @@ private void RequestStreamCallback(IAsyncResult result, Action cal catch (Exception ex) { ExecuteCallback(CreateErrorResponse(ex), callback); + return; } IAsyncResult asyncResult = webRequest.BeginGetResponse(r => ResponseCallback(r, callback), webRequest); + SetTimeout(asyncResult, this.timeoutState); } @@ -300,6 +303,7 @@ private static void GetRawResponseAsync(IAsyncResult result, Action callback { response.ResponseStatus = ResponseStatus.TimedOut; ExecuteCallback(response, callback); + return; } GetRawResponseAsync(result, webResponse => - { - ExtractResponseData(response, webResponse); - ExecuteCallback(response, callback); - }); + { + ExtractResponseData(response, webResponse); + ExecuteCallback(response, callback); + }); } catch (Exception ex) { @@ -373,6 +378,7 @@ private static void PopulateErrorForIncompleteResponse(HttpResponse response) } } +#if SILVERLIGHT || WINDOW_PHONE partial void AddAsyncHeaderActions() { #if SILVERLIGHT @@ -384,6 +390,7 @@ partial void AddAsyncHeaderActions() restrictedHeaderActions.Add("Content-Length", (r, v) => { }); #endif } +#endif // TODO: Try to merge the shared parts between ConfigureWebRequest and ConfigureAsyncWebRequest (quite a bit of code // TODO: duplication at the moment). @@ -452,12 +459,10 @@ private HttpWebRequest ConfigureAsyncWebRequest(string method, Uri url) webRequest.Proxy = Proxy; } -#if FRAMEWORK if (CachePolicy != null) { webRequest.CachePolicy = CachePolicy; } -#endif if (FollowRedirects && MaxRedirects.HasValue) { diff --git a/RestSharp/Http.Sync.cs b/RestSharp/Http.Sync.cs index 3b74342b8..79269d728 100644 --- a/RestSharp/Http.Sync.cs +++ b/RestSharp/Http.Sync.cs @@ -15,13 +15,9 @@ #endregion #if FRAMEWORK + using System; using System.Net; - -#if !MONOTOUCH && !MONODROID - -#endif - using RestSharp.Extensions; namespace RestSharp @@ -158,6 +154,7 @@ private void ExtractErrorResponse(HttpResponse httpResponse, Exception ex) httpResponse.ResponseStatus = ResponseStatus.TimedOut; httpResponse.ErrorMessage = ex.Message; httpResponse.ErrorException = webException; + return; } @@ -173,6 +170,7 @@ private HttpResponse GetResponse(HttpWebRequest request) try { var webResponse = GetRawResponse(request); + ExtractResponseData(response, webResponse); } catch (Exception ex) @@ -302,6 +300,7 @@ private HttpWebRequest ConfigureWebRequest(string method, Uri url) #endif webRequest.AllowAutoRedirect = FollowRedirects; + if (FollowRedirects && MaxRedirects.HasValue) { webRequest.MaximumAutomaticRedirections = MaxRedirects.Value; diff --git a/RestSharp/Http.cs b/RestSharp/Http.cs index cab95da9c..536dee85a 100644 --- a/RestSharp/Http.cs +++ b/RestSharp/Http.cs @@ -26,6 +26,7 @@ #if WINDOWS_PHONE using RestSharp.Compression.ZLib; #endif + #if FRAMEWORK using System.Net.Cache; #endif @@ -132,9 +133,7 @@ protected bool HasFiles /// X509CertificateCollection to be sent with request /// public X509CertificateCollection ClientCertificates { get; set; } -#endif -#if FRAMEWORK /// /// Maximum number of automatic redirects to follow if FollowRedirects is true /// @@ -196,9 +195,7 @@ protected bool HasFiles /// Proxy info to be sent with request /// public IWebProxy Proxy { get; set; } -#endif -#if FRAMEWORK /// /// Caching policy for requests created with this wrapper. /// @@ -223,7 +220,9 @@ public Http() partial void AddSyncHeaderActions(); +#if SILVERLIGHT || WINDOWS_PHONE partial void AddAsyncHeaderActions(); +#endif private void AddSharedHeaderActions() { @@ -231,14 +230,14 @@ private void AddSharedHeaderActions() restrictedHeaderActions.Add("Content-Type", (r, v) => r.ContentType = v); #if NET4 restrictedHeaderActions.Add("Date", (r, v) => - { - DateTime parsed; + { + DateTime parsed; - if (DateTime.TryParse(v, out parsed)) - { - r.Date = parsed; - } - }); + if (DateTime.TryParse(v, out parsed)) + { + r.Date = parsed; + } + }); restrictedHeaderActions.Add("Host", (r, v) => r.Host = v); #else @@ -309,20 +308,19 @@ private void AppendCookies(HttpWebRequest webRequest) { #if FRAMEWORK var cookie = new Cookie - { - Name = httpCookie.Name, - Value = httpCookie.Value, - Domain = webRequest.RequestUri.Host - }; + { + Name = httpCookie.Name, + Value = httpCookie.Value, + Domain = webRequest.RequestUri.Host + }; webRequest.CookieContainer.Add(cookie); #else var cookie = new Cookie - { - Name = httpCookie.Name, - Value = httpCookie.Value - }; - + { + Name = httpCookie.Name, + Value = httpCookie.Value + }; var uri = webRequest.RequestUri; webRequest.CookieContainer.Add(new Uri(string.Format("{0}://{1}", uri.Scheme, uri.Host)), cookie); @@ -365,6 +363,7 @@ private void PreparePostBody(HttpWebRequest webRequest) private void WriteStringTo(Stream stream, string toWrite) { var bytes = this.Encoding.GetBytes(toWrite); + stream.Write(bytes, 0, bytes.Length); } @@ -398,12 +397,14 @@ private void ExtractResponseData(HttpResponse response, HttpWebResponse webRespo #endif response.ContentType = webResponse.ContentType; response.ContentLength = webResponse.ContentLength; + Stream webResponseStream = webResponse.GetResponseStream(); #if WINDOWS_PHONE if (String.Equals(webResponse.Headers[HttpRequestHeader.ContentEncoding], "gzip", StringComparison.OrdinalIgnoreCase)) { var gzStream = new GZipStream(webResponseStream); + ProcessResponseStream(gzStream, response); } else @@ -413,6 +414,7 @@ private void ExtractResponseData(HttpResponse response, HttpWebResponse webRespo #else ProcessResponseStream(webResponseStream, response); #endif + response.StatusCode = webResponse.StatusCode; response.StatusDescription = webResponse.StatusDescription; response.ResponseUri = webResponse.ResponseUri; @@ -423,28 +425,29 @@ private void ExtractResponseData(HttpResponse response, HttpWebResponse webRespo foreach (Cookie cookie in webResponse.Cookies) { response.Cookies.Add(new HttpCookie - { - Comment = cookie.Comment, - CommentUri = cookie.CommentUri, - Discard = cookie.Discard, - Domain = cookie.Domain, - Expired = cookie.Expired, - Expires = cookie.Expires, - HttpOnly = cookie.HttpOnly, - Name = cookie.Name, - Path = cookie.Path, - Port = cookie.Port, - Secure = cookie.Secure, - TimeStamp = cookie.TimeStamp, - Value = cookie.Value, - Version = cookie.Version - }); + { + Comment = cookie.Comment, + CommentUri = cookie.CommentUri, + Discard = cookie.Discard, + Domain = cookie.Domain, + Expired = cookie.Expired, + Expires = cookie.Expires, + HttpOnly = cookie.HttpOnly, + Name = cookie.Name, + Path = cookie.Path, + Port = cookie.Port, + Secure = cookie.Secure, + TimeStamp = cookie.TimeStamp, + Value = cookie.Value, + Version = cookie.Version + }); } } foreach (var headerName in webResponse.Headers.AllKeys) { var headerValue = webResponse.Headers[headerName]; + response.Headers.Add(new HttpHeader { Name = headerName, Value = headerValue }); } @@ -465,7 +468,7 @@ private void ProcessResponseStream(Stream webResponseStream, HttpResponse respon } #if FRAMEWORK - private void AddRange(HttpWebRequest r, string range) + private static void AddRange(HttpWebRequest r, string range) { System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(range, "(\\w+)=(\\d+)-(\\d+)$"); diff --git a/RestSharp/HttpResponse.cs b/RestSharp/HttpResponse.cs index 98c3d54a9..cac055cc5 100644 --- a/RestSharp/HttpResponse.cs +++ b/RestSharp/HttpResponse.cs @@ -26,13 +26,14 @@ namespace RestSharp /// public class HttpResponse : IHttpResponse { - private string _content; + private string content; /// /// Default constructor /// public HttpResponse() { + this.ResponseStatus = ResponseStatus.None; Headers = new List(); Cookies = new List(); } @@ -57,8 +58,9 @@ public HttpResponse() /// public string Content { - get { return _content ?? (_content = RawBytes.AsString()); } + get { return this.content ?? (this.content = RawBytes.AsString()); } } + /// /// HTTP response status code /// @@ -94,17 +96,11 @@ public string Content /// public IList Cookies { get; private set; } - private ResponseStatus _responseStatus = ResponseStatus.None; - /// /// Status of the request. Will return Error for transport errors. /// HTTP errors will still return ResponseStatus.Completed, check StatusCode instead /// - public ResponseStatus ResponseStatus - { - get { return _responseStatus; } - set { _responseStatus = value; } - } + public ResponseStatus ResponseStatus { get; set; } /// /// Transport or other non-HTTP error generated while attempting request diff --git a/RestSharp/IHttpFactory.cs b/RestSharp/IHttpFactory.cs index 98e586836..3c6f97788 100644 --- a/RestSharp/IHttpFactory.cs +++ b/RestSharp/IHttpFactory.cs @@ -1,4 +1,5 @@ -namespace RestSharp + +namespace RestSharp { public interface IHttpFactory { diff --git a/RestSharp/IRestClient.cs b/RestSharp/IRestClient.cs index 29494e1f9..0e54706ba 100644 --- a/RestSharp/IRestClient.cs +++ b/RestSharp/IRestClient.cs @@ -19,12 +19,14 @@ using System.Collections.Generic; using System.Security.Cryptography.X509Certificates; using System.Text; +using RestSharp.Authenticators; using RestSharp.Deserializers; #if NET4 || MONODROID || MONOTOUCH || WP8 using System.Threading; using System.Threading.Tasks; #endif + #if FRAMEWORK using System.Net.Cache; #endif diff --git a/RestSharp/RestClient.Async.cs b/RestSharp/RestClient.Async.cs index 69bdaf249..f8c5dd4ed 100644 --- a/RestSharp/RestClient.Async.cs +++ b/RestSharp/RestClient.Async.cs @@ -87,28 +87,29 @@ private RestRequestAsyncHandle ExecuteAsync(IRestRequest request, var asyncHandle = new RestRequestAsyncHandle(); - Action response_cb = r => this.ProcessResponse(request, r, asyncHandle, callback); + Action responseCb = r => this.ProcessResponse(request, r, asyncHandle, callback); if (this.UseSynchronizationContext && SynchronizationContext.Current != null) { var ctx = SynchronizationContext.Current; - var cb = response_cb; + var cb = responseCb; - response_cb = resp => ctx.Post(s => cb(resp), null); + responseCb = resp => ctx.Post(s => cb(resp), null); } - asyncHandle.WebRequest = getWebRequest(http, response_cb, httpMethod); + asyncHandle.WebRequest = getWebRequest(http, responseCb, httpMethod); + return asyncHandle; } - private static HttpWebRequest DoAsGetAsync(IHttp http, Action response_cb, string method) + private static HttpWebRequest DoAsGetAsync(IHttp http, Action responseCb, string method) { - return http.AsGetAsync(response_cb, method); + return http.AsGetAsync(responseCb, method); } - private static HttpWebRequest DoAsPostAsync(IHttp http, Action response_cb, string method) + private static HttpWebRequest DoAsPostAsync(IHttp http, Action responseCb, string method) { - return http.AsPostAsync(response_cb, method); + return http.AsPostAsync(responseCb, method); } private void ProcessResponse(IRestRequest request, HttpResponse httpResponse, RestRequestAsyncHandle asyncHandle, @@ -172,12 +173,12 @@ private void DeserializeResponse(IRestRequest request, catch (Exception ex) { restResponse = new RestResponse - { - Request = request, - ResponseStatus = ResponseStatus.Error, - ErrorMessage = ex.Message, - ErrorException = ex - }; + { + Request = request, + ResponseStatus = ResponseStatus.Error, + ErrorMessage = ex.Message, + ErrorException = ex + }; } callback(restResponse, asyncHandle); @@ -208,6 +209,7 @@ public virtual Task> ExecuteGetTaskAsync(IRestRequest reques } request.Method = Method.GET; + return this.ExecuteTaskAsync(request, token); } @@ -235,6 +237,7 @@ public virtual Task> ExecutePostTaskAsync(IRestRequest reque } request.Method = Method.POST; + return this.ExecuteTaskAsync(request, token); } @@ -279,10 +282,10 @@ public virtual Task> ExecuteTaskAsync(IRestRequest request, }); var registration = token.Register(() => - { - async.Abort(); - taskCompletionSource.TrySetCanceled(); - }); + { + async.Abort(); + taskCompletionSource.TrySetCanceled(); + }); #if !WINDOWS_PHONE taskCompletionSource.Task.ContinueWith(t => registration.Dispose(), token); @@ -327,6 +330,7 @@ public virtual Task ExecuteGetTaskAsync(IRestRequest request, Can } request.Method = Method.GET; + return this.ExecuteTaskAsync(request, token); } @@ -352,6 +356,7 @@ public virtual Task ExecutePostTaskAsync(IRestRequest request, Ca } request.Method = Method.POST; + return this.ExecuteTaskAsync(request, token); } @@ -372,17 +377,19 @@ public virtual Task ExecuteTaskAsync(IRestRequest request, Cancel try { var async = this.ExecuteAsync(request, (response, _) => - { - if (token.IsCancellationRequested) - { - taskCompletionSource.TrySetCanceled(); - } - //Don't run TrySetException, since we should set Error properties and swallow exceptions to be consistent with sync methods - else - { - taskCompletionSource.TrySetResult(response); - } - }); + { + if (token.IsCancellationRequested) + { + taskCompletionSource.TrySetCanceled(); + } + // Don't run TrySetException, since we should set Error + // properties and swallow exceptions to be consistent + // with sync methods + else + { + taskCompletionSource.TrySetResult(response); + } + }); var registration = token.Register(() => { diff --git a/RestSharp/RestClient.Sync.cs b/RestSharp/RestClient.Sync.cs index 7abc8c2a9..16649c958 100644 --- a/RestSharp/RestClient.Sync.cs +++ b/RestSharp/RestClient.Sync.cs @@ -1,4 +1,5 @@ #if FRAMEWORK + using System; namespace RestSharp @@ -13,6 +14,7 @@ public partial class RestClient public byte[] DownloadData(IRestRequest request) { var response = Execute(request); + return response.RawBytes; } @@ -46,6 +48,7 @@ public IRestResponse ExecuteAsGet(IRestRequest request, string httpMethod) public IRestResponse ExecuteAsPost(IRestRequest request, string httpMethod) { request.Method = Method.POST; // Required by RestClient.BuildUri... + return Execute(request, httpMethod, DoExecuteAsPost); } diff --git a/RestSharp/RestClient.cs b/RestSharp/RestClient.cs index 265db3e11..b58831e7a 100644 --- a/RestSharp/RestClient.cs +++ b/RestSharp/RestClient.cs @@ -22,6 +22,7 @@ using System.Security.Cryptography.X509Certificates; using System.Text; using System.Text.RegularExpressions; +using RestSharp.Authenticators; using RestSharp.Deserializers; using RestSharp.Extensions; @@ -109,9 +110,7 @@ public partial class RestClient : IRestClient /// public virtual Uri BaseUrl { get; set; } - private Encoding encoding = Encoding.UTF8; - - public Encoding Encoding { get { return this.encoding; } set { this.encoding = value; } } + public Encoding Encoding { get; set; } public bool PreAuthenticate { get; set; } @@ -120,6 +119,7 @@ public partial class RestClient : IRestClient /// public RestClient() { + this.Encoding = Encoding.UTF8; #if WINDOWS_PHONE this.UseSynchronizationContext = true; #endif @@ -156,7 +156,7 @@ public RestClient(Uri baseUrl) : this() /// public RestClient(string baseUrl) : this() { - if (String.IsNullOrEmpty(baseUrl)) + if (string.IsNullOrEmpty(baseUrl)) throw new ArgumentNullException("baseUrl"); this.BaseUrl = new Uri(baseUrl); @@ -332,7 +332,7 @@ public Uri BuildUri(IRestRequest request) // build and attach querystring var data = EncodeParameters(parameters); - var separator = assembled.Contains("?") ? "&" : "?"; + var separator = assembled != null && assembled.Contains("?") ? "&" : "?"; assembled = string.Concat(assembled, separator, data); @@ -374,6 +374,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) if (request.Parameters.All(p2 => p2.Name.ToLowerInvariant() != "accept")) { var accepts = string.Join(", ", AcceptTypes.ToArray()); + request.AddParameter("Accept", accepts, ParameterType.HttpHeader); } @@ -409,7 +410,6 @@ private void ConfigureHttp(IRestRequest request, IHttp http) } http.MaxRedirects = MaxRedirects; - http.CachePolicy = CachePolicy; #endif @@ -445,8 +445,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) } var @params = from p in request.Parameters - where p.Type == ParameterType.GetOrPost - && p.Value != null + where p.Type == ParameterType.GetOrPost && p.Value != null select new HttpParameter { Name = p.Name, @@ -470,9 +469,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) }); } - var body = (from p in request.Parameters - where p.Type == ParameterType.RequestBody - select p).FirstOrDefault(); + Parameter body = request.Parameters.FirstOrDefault(p => p.Type == ParameterType.RequestBody); // Only add the body if there aren't any files to make it a multipart form request // If there are files, then add the body to the HTTP Parameters diff --git a/RestSharp/RestClientExtensions.cs b/RestSharp/RestClientExtensions.cs index 669a63767..32a3e8db2 100644 --- a/RestSharp/RestClientExtensions.cs +++ b/RestSharp/RestClientExtensions.cs @@ -1,12 +1,13 @@ using System; using System.Linq; + #if NET4 || MONODROID || MONOTOUCH || WP8 using System.Threading.Tasks; #endif namespace RestSharp { - public static partial class RestClientExtensions + public static class RestClientExtensions { /// /// Executes the request and callback asynchronously, authenticating if needed @@ -37,55 +38,63 @@ public static RestRequestAsyncHandle GetAsync(this IRestClient client, IRestR Action, RestRequestAsyncHandle> callback) where T : new() { request.Method = Method.GET; - return client.ExecuteAsync(request, callback); + + return client.ExecuteAsync(request, callback); } public static RestRequestAsyncHandle PostAsync(this IRestClient client, IRestRequest request, Action, RestRequestAsyncHandle> callback) where T : new() { request.Method = Method.POST; - return client.ExecuteAsync(request, callback); + + return client.ExecuteAsync(request, callback); } public static RestRequestAsyncHandle PutAsync(this IRestClient client, IRestRequest request, Action, RestRequestAsyncHandle> callback) where T : new() { request.Method = Method.PUT; - return client.ExecuteAsync(request, callback); + + return client.ExecuteAsync(request, callback); } public static RestRequestAsyncHandle HeadAsync(this IRestClient client, IRestRequest request, Action, RestRequestAsyncHandle> callback) where T : new() { request.Method = Method.HEAD; - return client.ExecuteAsync(request, callback); + + return client.ExecuteAsync(request, callback); } public static RestRequestAsyncHandle OptionsAsync(this IRestClient client, IRestRequest request, Action, RestRequestAsyncHandle> callback) where T : new() { request.Method = Method.OPTIONS; - return client.ExecuteAsync(request, callback); + + return client.ExecuteAsync(request, callback); } public static RestRequestAsyncHandle PatchAsync(this IRestClient client, IRestRequest request, Action, RestRequestAsyncHandle> callback) where T : new() { request.Method = Method.PATCH; - return client.ExecuteAsync(request, callback); + + return client.ExecuteAsync(request, callback); } public static RestRequestAsyncHandle DeleteAsync(this IRestClient client, IRestRequest request, Action, RestRequestAsyncHandle> callback) where T : new() { request.Method = Method.DELETE; - return client.ExecuteAsync(request, callback); + + return client.ExecuteAsync(request, callback); } public static RestRequestAsyncHandle GetAsync(this IRestClient client, IRestRequest request, Action callback) { request.Method = Method.GET; + return client.ExecuteAsync(request, callback); } @@ -93,6 +102,7 @@ public static RestRequestAsyncHandle PostAsync(this IRestClient client, IRestReq Action callback) { request.Method = Method.POST; + return client.ExecuteAsync(request, callback); } @@ -100,6 +110,7 @@ public static RestRequestAsyncHandle PutAsync(this IRestClient client, IRestRequ Action callback) { request.Method = Method.PUT; + return client.ExecuteAsync(request, callback); } @@ -107,6 +118,7 @@ public static RestRequestAsyncHandle HeadAsync(this IRestClient client, IRestReq Action callback) { request.Method = Method.HEAD; + return client.ExecuteAsync(request, callback); } @@ -114,6 +126,7 @@ public static RestRequestAsyncHandle OptionsAsync(this IRestClient client, IRest Action callback) { request.Method = Method.OPTIONS; + return client.ExecuteAsync(request, callback); } @@ -121,6 +134,7 @@ public static RestRequestAsyncHandle PatchAsync(this IRestClient client, IRestRe Action callback) { request.Method = Method.PATCH; + return client.ExecuteAsync(request, callback); } @@ -128,9 +142,23 @@ public static RestRequestAsyncHandle DeleteAsync(this IRestClient client, IRestR Action callback) { request.Method = Method.DELETE; + return client.ExecuteAsync(request, callback); } +#if NET4 + public static RestResponse ExecuteDynamic(this IRestClient client, IRestRequest request) + { + var response = client.Execute(request); + var generic = (RestResponse)response; + dynamic content = SimpleJson.DeserializeObject(response.Content); + + generic.Data = content; + + return generic; + } +#endif + #if NET4 || MONODROID || MONOTOUCH || WP8 public static Task GetTaskAsync(this IRestClient client, IRestRequest request) where T : new() { @@ -145,30 +173,35 @@ public static RestRequestAsyncHandle DeleteAsync(this IRestClient client, IRestR public static Task PutTaskAsync(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.PUT; + return client.ExecuteTaskAsync(request).ContinueWith(x => x.Result.Data); } public static Task HeadTaskAsync(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.HEAD; + return client.ExecuteTaskAsync(request).ContinueWith(x => x.Result.Data); } public static Task OptionsTaskAsync(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.OPTIONS; + return client.ExecuteTaskAsync(request).ContinueWith(x => x.Result.Data); } public static Task PatchTaskAsync(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.PATCH; + return client.ExecuteTaskAsync(request).ContinueWith(x => x.Result.Data); } public static Task DeleteTaskAsync(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.DELETE; + return client.ExecuteTaskAsync(request).ContinueWith(x => x.Result.Data); } #endif @@ -177,84 +210,98 @@ public static RestRequestAsyncHandle DeleteAsync(this IRestClient client, IRestR public static IRestResponse Get(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.GET; + return client.Execute(request); } public static IRestResponse Post(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.POST; + return client.Execute(request); } public static IRestResponse Put(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.PUT; + return client.Execute(request); } public static IRestResponse Head(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.HEAD; + return client.Execute(request); } public static IRestResponse Options(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.OPTIONS; + return client.Execute(request); } public static IRestResponse Patch(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.PATCH; + return client.Execute(request); } public static IRestResponse Delete(this IRestClient client, IRestRequest request) where T : new() { request.Method = Method.DELETE; + return client.Execute(request); } public static IRestResponse Get(this IRestClient client, IRestRequest request) { request.Method = Method.GET; + return client.Execute(request); } public static IRestResponse Post(this IRestClient client, IRestRequest request) { request.Method = Method.POST; + return client.Execute(request); } public static IRestResponse Put(this IRestClient client, IRestRequest request) { request.Method = Method.PUT; + return client.Execute(request); } public static IRestResponse Head(this IRestClient client, IRestRequest request) { request.Method = Method.HEAD; + return client.Execute(request); } public static IRestResponse Options(this IRestClient client, IRestRequest request) { request.Method = Method.OPTIONS; + return client.Execute(request); } public static IRestResponse Patch(this IRestClient client, IRestRequest request) { request.Method = Method.PATCH; + return client.Execute(request); } public static IRestResponse Delete(this IRestClient client, IRestRequest request) { request.Method = Method.DELETE; + return client.Execute(request); } #endif @@ -284,9 +331,8 @@ public static void AddDefaultParameter(this IRestClient restClient, Parameter p) /// public static void RemoveDefaultParameter(this IRestClient restClient, string name) { - var parameter = - restClient.DefaultParameters.SingleOrDefault( - p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); + var parameter = restClient.DefaultParameters.SingleOrDefault( + p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); if (parameter != null) { @@ -304,7 +350,7 @@ public static void RemoveDefaultParameter(this IRestClient restClient, string na /// This request public static void AddDefaultParameter(this IRestClient restClient, string name, object value) { - restClient.AddDefaultParameter(new Parameter {Name = name, Value = value, Type = ParameterType.GetOrPost}); + restClient.AddDefaultParameter(new Parameter { Name = name, Value = value, Type = ParameterType.GetOrPost }); } /// @@ -322,7 +368,7 @@ public static void AddDefaultParameter(this IRestClient restClient, string name, public static void AddDefaultParameter(this IRestClient restClient, string name, object value, ParameterType type) { - restClient.AddDefaultParameter(new Parameter {Name = name, Value = value, Type = type}); + restClient.AddDefaultParameter(new Parameter { Name = name, Value = value, Type = type }); } /// diff --git a/RestSharp/RestRequest.cs b/RestSharp/RestRequest.cs index 03ae59f1b..c4cb58f15 100644 --- a/RestSharp/RestRequest.cs +++ b/RestSharp/RestRequest.cs @@ -63,6 +63,8 @@ public class RestRequest : IRestRequest /// public RestRequest() { + this.RequestFormat = DataFormat.Xml; + this.Method = Method.GET; this.Parameters = new List(); this.Files = new List(); this.XmlSerializer = new XmlSerializer(); @@ -178,6 +180,7 @@ public IRestRequest AddFile(string name, Action writer, string fileName, private IRestRequest AddFile(FileParameter file) { this.Files.Add(file); + return this; } @@ -289,6 +292,7 @@ public IRestRequest AddXmlBody(object obj) public IRestRequest AddXmlBody(object obj, string xmlNamespace) { this.RequestFormat = DataFormat.Xml; + return this.AddBody(obj, xmlNamespace); } @@ -357,6 +361,7 @@ select item.ToString()) public IRestRequest AddObject(object obj) { this.AddObject(obj, new string[] { }); + return this; } @@ -368,6 +373,7 @@ public IRestRequest AddObject(object obj) public IRestRequest AddParameter(Parameter p) { this.Parameters.Add(p); + return this; } @@ -423,12 +429,12 @@ public IRestRequest AddParameter(string name, object value, ParameterType type) public IRestRequest AddParameter(string name, object value, string contentType, ParameterType type) { return this.AddParameter(new Parameter - { - Name = name, - Value = value, - ContentType = contentType, - Type = type - }); + { + Name = name, + Value = value, + ContentType = contentType, + Type = type + }); } /// @@ -496,17 +502,11 @@ public IRestRequest AddQueryParameter(string name, string value) /// public List Files { get; private set; } - private Method method = Method.GET; - /// /// Determines what HTTP method to use for this request. Supported methods: GET, POST, PUT, DELETE, HEAD, OPTIONS /// Default is GET /// - public Method Method - { - get { return this.method; } - set { this.method = value; } - } + public Method Method { get; set; } /// /// The Resource URL to make the request against. @@ -522,17 +522,11 @@ public Method Method /// public string Resource { get; set; } - private DataFormat requestFormat = DataFormat.Xml; - /// /// Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. /// By default XmlSerializer is used. /// - public DataFormat RequestFormat - { - get { return this.requestFormat; } - set { this.requestFormat = value; } - } + public DataFormat RequestFormat { get; set; } /// /// Used by the default deserializers to determine where to start deserializing from. diff --git a/RestSharp/RestResponse.cs b/RestSharp/RestResponse.cs index 7ffdf9510..e756591f1 100644 --- a/RestSharp/RestResponse.cs +++ b/RestSharp/RestResponse.cs @@ -26,13 +26,14 @@ namespace RestSharp /// public abstract class RestResponseBase { - private string _content; + private string content; /// /// Default constructor /// - public RestResponseBase() + protected RestResponseBase() { + this.ResponseStatus = ResponseStatus.None; Headers = new List(); Cookies = new List(); } @@ -65,16 +66,8 @@ public RestResponseBase() /// public string Content { - get - { - if (_content == null) - { - _content = RawBytes.AsString(); - } - - return _content; - } - set { _content = value; } + get { return this.content ?? (this.content = this.RawBytes.AsString()); } + set { this.content = value; } } /// @@ -112,17 +105,11 @@ public string Content /// public IList Headers { get; protected internal set; } - private ResponseStatus _responseStatus = ResponseStatus.None; - /// /// Status of the request. Will return Error for transport errors. /// HTTP errors will still return ResponseStatus.Completed, check StatusCode instead /// - public ResponseStatus ResponseStatus - { - get { return _responseStatus; } - set { _responseStatus = value; } - } + public ResponseStatus ResponseStatus { get; set; } /// /// Transport or other non-HTTP error generated while attempting request @@ -149,22 +136,22 @@ public class RestResponse : RestResponseBase, IRestResponse public static explicit operator RestResponse(RestResponse response) { return new RestResponse - { - ContentEncoding = response.ContentEncoding, - ContentLength = response.ContentLength, - ContentType = response.ContentType, - Cookies = response.Cookies, - ErrorMessage = response.ErrorMessage, - ErrorException = response.ErrorException, - Headers = response.Headers, - RawBytes = response.RawBytes, - ResponseStatus = response.ResponseStatus, - ResponseUri = response.ResponseUri, - Server = response.Server, - StatusCode = response.StatusCode, - StatusDescription = response.StatusDescription, - Request = response.Request - }; + { + ContentEncoding = response.ContentEncoding, + ContentLength = response.ContentLength, + ContentType = response.ContentType, + Cookies = response.Cookies, + ErrorMessage = response.ErrorMessage, + ErrorException = response.ErrorException, + Headers = response.Headers, + RawBytes = response.RawBytes, + ResponseStatus = response.ResponseStatus, + ResponseUri = response.ResponseUri, + Server = response.Server, + StatusCode = response.StatusCode, + StatusDescription = response.StatusDescription, + Request = response.Request + }; } } diff --git a/RestSharp/Serializers/SerializeAsAttribute.cs b/RestSharp/Serializers/SerializeAsAttribute.cs index 026b9512e..7fcf63e27 100644 --- a/RestSharp/Serializers/SerializeAsAttribute.cs +++ b/RestSharp/Serializers/SerializeAsAttribute.cs @@ -25,7 +25,7 @@ namespace RestSharp.Serializers /// Currently not supported with the JsonSerializer /// When specified at the property level the class-level specification is overridden /// - [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, Inherited = false, AllowMultiple = false)] + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, Inherited = false)] public sealed class SerializeAsAttribute : Attribute { public SerializeAsAttribute() diff --git a/RestSharp/Serializers/XmlSerializer.cs b/RestSharp/Serializers/XmlSerializer.cs index 5b4d176af..70453c3c7 100644 --- a/RestSharp/Serializers/XmlSerializer.cs +++ b/RestSharp/Serializers/XmlSerializer.cs @@ -106,7 +106,7 @@ public string Serialize(object obj) return doc.ToString(); } - private void Map(XElement root, object obj) + private void Map(XContainer root, object obj) { var objType = obj.GetType(); var props = from p in objType.GetProperties() @@ -171,6 +171,7 @@ where p.CanRead && p.CanWrite { var type = item.GetType(); var setting = type.GetAttribute(); + itemTypeName = setting != null && setting.Name.HasValue() ? setting.Name : type.Name; From ed5893ef78e65324a43192e4b16b60c6292a5447 Mon Sep 17 00:00:00 2001 From: Michael Hallett Date: Sat, 15 Aug 2015 22:09:09 -0700 Subject: [PATCH 5/9] more code cleanup; removed var key word in favor of type names; fixed usings so they are surrounded by the appropriate ifdefs; --- .../AsyncRequestBodyTests.cs | 52 +- RestSharp.IntegrationTests/AsyncTests.cs | 83 +- .../AuthenticationTests.cs | 27 +- .../CompressionTests.cs | 22 +- RestSharp.IntegrationTests/FileTests.cs | 26 +- .../Helpers/Extensions.cs | 2 +- .../Helpers/Handlers.cs | 8 +- .../Helpers/SimpleServer.cs | 6 +- .../MultipartFormDataTests.cs | 63 +- .../NonProtocolExceptionHandlingTests.cs | 47 +- .../RequestBodyTests.cs | 36 +- .../RequestHeadTests.cs | 34 +- RestSharp.IntegrationTests/StatusCodeTests.cs | 24 +- .../StructuredSyntaxSuffixTests.cs | 36 +- RestSharp.IntegrationTests/oAuth1Tests.cs | 159 +-- .../Authenticators/HttpBasicAuthenticator.cs | 2 +- RestSharp/Authenticators/JwtAuthenticator.cs | 44 +- RestSharp/Authenticators/NtlmAuthenticator.cs | 6 +- .../OAuth/Extensions/CollectionExtensions.cs | 20 +- .../OAuth/Extensions/OAuthExtensions.cs | 8 +- .../OAuth/Extensions/StringExtensions.cs | 8 +- .../OAuth/Extensions/TimeExtensions.cs | 6 +- .../Authenticators/OAuth/HttpPostParameter.cs | 28 +- RestSharp/Authenticators/OAuth/OAuthTools.cs | 42 +- .../Authenticators/OAuth/OAuthWorkflow.cs | 227 ++-- RestSharp/Authenticators/OAuth/WebPair.cs | 3 +- .../Authenticators/OAuth/WebPairCollection.cs | 8 +- .../OAuth/WebParameterCollection.cs | 2 +- .../Authenticators/OAuth1Authenticator.cs | 145 +- RestSharp/Compression/ZLib/Crc32.cs | 2 +- RestSharp/Compression/ZLib/GZipStream.cs | 118 +- RestSharp/Compression/ZLib/InfTree.cs | 173 +-- RestSharp/Compression/ZLib/Inflate.cs | 1206 ++++++++--------- RestSharp/Compression/ZLib/ZLib.cs | 19 +- RestSharp/Compression/ZLib/ZLibCodec.cs | 28 +- RestSharp/Compression/ZLib/ZLibStream.cs | 172 +-- .../Deserializers/DotNetXmlDeserializer.cs | 5 +- RestSharp/Deserializers/JsonDeserializer.cs | 66 +- .../Deserializers/XmlAttributeDeserializer.cs | 6 +- RestSharp/Deserializers/XmlDeserializer.cs | 170 +-- RestSharp/Extensions/MiscExtensions.cs | 6 +- RestSharp/Extensions/MonoHttp/HtmlEncoder.cs | 177 +-- RestSharp/Extensions/MonoHttp/HttpUtility.cs | 48 +- RestSharp/Extensions/ReflectionExtensions.cs | 11 +- RestSharp/Extensions/StringExtensions.cs | 36 +- RestSharp/FileParameter.cs | 4 +- RestSharp/Http.Async.cs | 39 +- RestSharp/Http.Sync.cs | 15 +- RestSharp/Http.cs | 33 +- RestSharp/IHttp.cs | 2 +- RestSharp/IRestClient.cs | 2 +- RestSharp/RestClient.Async.cs | 84 +- RestSharp/RestClient.Sync.cs | 6 +- RestSharp/RestClient.cs | 116 +- RestSharp/RestClientExtensions.cs | 2 +- RestSharp/RestRequest.cs | 26 +- RestSharp/Serializers/DotNetXmlSerializer.cs | 6 +- RestSharp/Serializers/SerializeAsAttribute.cs | 2 +- RestSharp/Serializers/XmlSerializer.cs | 62 +- RestSharp/SharedAssemblyInfo.cs | 16 +- 60 files changed, 1858 insertions(+), 1974 deletions(-) diff --git a/RestSharp.IntegrationTests/AsyncRequestBodyTests.cs b/RestSharp.IntegrationTests/AsyncRequestBodyTests.cs index 5f6625010..da3364cff 100644 --- a/RestSharp.IntegrationTests/AsyncRequestBodyTests.cs +++ b/RestSharp.IntegrationTests/AsyncRequestBodyTests.cs @@ -18,15 +18,15 @@ public void Can_Not_Be_Added_To_GET_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; request.AddParameter(contentType, bodyData, ParameterType.RequestBody); - var resetEvent = new ManualResetEvent(false); + ManualResetEvent resetEvent = new ManualResetEvent(false); client.ExecuteAsync(request, response => resetEvent.Set()); resetEvent.WaitOne(); @@ -42,9 +42,9 @@ public void Can_Have_No_Body_Added_To_POST_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); - var resetEvent = new ManualResetEvent(false); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + ManualResetEvent resetEvent = new ManualResetEvent(false); client.ExecuteAsync(request, response => resetEvent.Set()); resetEvent.WaitOne(); @@ -60,15 +60,15 @@ public void Can_Be_Added_To_POST_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; request.AddParameter(contentType, bodyData, ParameterType.RequestBody); - var resetEvent = new ManualResetEvent(false); + ManualResetEvent resetEvent = new ManualResetEvent(false); client.ExecuteAsync(request, response => resetEvent.Set()); resetEvent.WaitOne(); @@ -84,15 +84,15 @@ public void Can_Be_Added_To_PUT_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; request.AddParameter(contentType, bodyData, ParameterType.RequestBody); - var resetEvent = new ManualResetEvent(false); + ManualResetEvent resetEvent = new ManualResetEvent(false); client.ExecuteAsync(request, response => resetEvent.Set()); resetEvent.WaitOne(); @@ -108,15 +108,15 @@ public void Can_Be_Added_To_DELETE_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; request.AddParameter(contentType, bodyData, ParameterType.RequestBody); - var resetEvent = new ManualResetEvent(false); + ManualResetEvent resetEvent = new ManualResetEvent(false); client.ExecuteAsync(request, response => resetEvent.Set()); resetEvent.WaitOne(); @@ -132,15 +132,15 @@ public void Can_Not_Be_Added_To_HEAD_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; request.AddParameter(contentType, bodyData, ParameterType.RequestBody); - var resetEvent = new ManualResetEvent(false); + ManualResetEvent resetEvent = new ManualResetEvent(false); client.ExecuteAsync(request, response => resetEvent.Set()); resetEvent.WaitOne(); @@ -156,15 +156,15 @@ public void Can_Be_Added_To_OPTIONS_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; request.AddParameter(contentType, bodyData, ParameterType.RequestBody); - var resetEvent = new ManualResetEvent(false); + ManualResetEvent resetEvent = new ManualResetEvent(false); client.ExecuteAsync(request, response => resetEvent.Set()); resetEvent.WaitOne(); @@ -180,15 +180,15 @@ public void Can_Be_Added_To_PATCH_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; request.AddParameter(contentType, bodyData, ParameterType.RequestBody); - var resetEvent = new ManualResetEvent(false); + ManualResetEvent resetEvent = new ManualResetEvent(false); client.ExecuteAsync(request, response => resetEvent.Set()); resetEvent.WaitOne(); @@ -223,7 +223,7 @@ private class RequestBodyCapturer public static void Capture(HttpListenerContext context) { - var request = context.Request; + HttpListenerRequest request = context.Request; CapturedContentType = request.ContentType; CapturedHasEntityBody = request.HasEntityBody; @@ -232,7 +232,7 @@ public static void Capture(HttpListenerContext context) private static string StreamToString(Stream stream) { - var streamReader = new StreamReader(stream); + StreamReader streamReader = new StreamReader(stream); return streamReader.ReadToEnd(); } } diff --git a/RestSharp.IntegrationTests/AsyncTests.cs b/RestSharp.IntegrationTests/AsyncTests.cs index 98bd0d8ae..64bbe6f42 100644 --- a/RestSharp.IntegrationTests/AsyncTests.cs +++ b/RestSharp.IntegrationTests/AsyncTests.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Net; using System.Threading; +using System.Threading.Tasks; using NUnit.Framework; using RestSharp.IntegrationTests.Helpers; @@ -16,12 +17,12 @@ public void Can_Perform_GET_Async() Uri baseUrl = new Uri("http://localhost:8888/"); const string val = "Basic async test"; - var resetEvent = new ManualResetEvent(false); + ManualResetEvent resetEvent = new ManualResetEvent(false); using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.EchoValue(val))) { - var client = new RestClient(baseUrl); - var request = new RestRequest(""); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest(""); client.ExecuteAsync(request, (response, asyncHandle) => { @@ -40,12 +41,12 @@ public void Can_Perform_GET_Async_Without_Async_Handle() Uri baseUrl = new Uri("http://localhost:8888/"); const string val = "Basic async test"; - var resetEvent = new ManualResetEvent(false); + ManualResetEvent resetEvent = new ManualResetEvent(false); using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.EchoValue(val))) { - var client = new RestClient(baseUrl); - var request = new RestRequest(""); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest(""); client.ExecuteAsync(request, response => { @@ -66,9 +67,9 @@ public void Can_Perform_GET_TaskAsync() using (SimpleServer.Create(baseUrl, Handlers.EchoValue(val))) { - var client = new RestClient(baseUrl); - var request = new RestRequest(""); - var task = client.ExecuteTaskAsync(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest(""); + Task task = client.ExecuteTaskAsync(request); task.Wait(); @@ -85,16 +86,16 @@ public void Can_Handle_Exception_Thrown_By_OnBeforeDeserialization_Handler() using (SimpleServer.Create(baseUrl, Handlers.Generic())) { - var client = new RestClient(baseUrl); - var request = new RestRequest("success"); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("success"); request.OnBeforeDeserialization += r => { throw new Exception(exceptionMessage); }; - var task = client.ExecuteTaskAsync(request); + Task> task = client.ExecuteTaskAsync(request); task.Wait(); - var response = task.Result; + IRestResponse response = task.Result; Assert.AreEqual(exceptionMessage, response.ErrorMessage); Assert.AreEqual(ResponseStatus.Error, response.ResponseStatus); @@ -108,9 +109,9 @@ public void Can_Perform_ExecuteGetTaskAsync_With_Response_Type() using (SimpleServer.Create(baseUrl, Handlers.Generic())) { - var client = new RestClient(baseUrl); - var request = new RestRequest("success"); - var task = client.ExecuteTaskAsync(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("success"); + Task> task = client.ExecuteTaskAsync(request); task.Wait(); @@ -125,9 +126,9 @@ public void Can_Perform_GetTaskAsync_With_Response_Type() using (SimpleServer.Create(baseUrl, Handlers.Generic())) { - var client = new RestClient(baseUrl); - var request = new RestRequest("success"); - var task = client.GetTaskAsync(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("success"); + Task task = client.GetTaskAsync(request); task.Wait(); @@ -143,10 +144,10 @@ public void Can_Cancel_GET_TaskAsync() using (SimpleServer.Create(baseUrl, Handlers.EchoValue(val))) { - var client = new RestClient(baseUrl); - var request = new RestRequest("timeout"); - var cancellationTokenSource = new CancellationTokenSource(); - var task = client.ExecuteTaskAsync(request, cancellationTokenSource.Token); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("timeout"); + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + Task task = client.ExecuteTaskAsync(request, cancellationTokenSource.Token); cancellationTokenSource.Cancel(); @@ -162,10 +163,10 @@ public void Can_Cancel_GET_TaskAsync_With_Response_Type() using (SimpleServer.Create(baseUrl, Handlers.EchoValue(val))) { - var client = new RestClient(baseUrl); - var request = new RestRequest("timeout"); - var cancellationTokenSource = new CancellationTokenSource(); - var task = client.ExecuteTaskAsync(request, cancellationTokenSource.Token); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("timeout"); + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + Task> task = client.ExecuteTaskAsync(request, cancellationTokenSource.Token); cancellationTokenSource.Cancel(); @@ -180,9 +181,9 @@ public void Handles_GET_Request_Errors_TaskAsync() using (SimpleServer.Create(baseUrl, UrlToStatusCodeHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("404"); - var task = client.ExecuteTaskAsync(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("404"); + Task task = client.ExecuteTaskAsync(request); task.Wait(); @@ -197,9 +198,9 @@ public void Handles_GET_Request_Errors_TaskAsync_With_Response_Type() using (SimpleServer.Create(baseUrl, UrlToStatusCodeHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("404"); - var task = client.ExecuteTaskAsync(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("404"); + Task> task = client.ExecuteTaskAsync(request); task.Wait(); @@ -214,17 +215,17 @@ public void Can_Timeout_GET_TaskAsync() using (SimpleServer.Create(baseUrl, Handlers.Generic())) { - var client = new RestClient(baseUrl); - var request = new RestRequest("timeout", Method.GET).AddBody("Body_Content"); + RestClient client = new RestClient(baseUrl); + IRestRequest request = new RestRequest("timeout", Method.GET).AddBody("Body_Content"); // Half the value of ResponseHandler.Timeout request.Timeout = 500; - var task = client.ExecuteTaskAsync(request); + Task task = client.ExecuteTaskAsync(request); task.Wait(); - var response = task.Result; + IRestResponse response = task.Result; Assert.AreEqual(ResponseStatus.TimedOut, response.ResponseStatus); } @@ -237,17 +238,17 @@ public void Can_Timeout_PUT_TaskAsync() using (SimpleServer.Create(baseUrl, Handlers.Generic())) { - var client = new RestClient(baseUrl); - var request = new RestRequest("timeout", Method.PUT).AddBody("Body_Content"); + RestClient client = new RestClient(baseUrl); + IRestRequest request = new RestRequest("timeout", Method.PUT).AddBody("Body_Content"); // Half the value of ResponseHandler.Timeout request.Timeout = 500; - var task = client.ExecuteTaskAsync(request); + Task task = client.ExecuteTaskAsync(request); task.Wait(); - var response = task.Result; + IRestResponse response = task.Result; Assert.AreEqual(ResponseStatus.TimedOut, response.ResponseStatus); } diff --git a/RestSharp.IntegrationTests/AuthenticationTests.cs b/RestSharp.IntegrationTests/AuthenticationTests.cs index 097879043..d0f1f1ab2 100644 --- a/RestSharp.IntegrationTests/AuthenticationTests.cs +++ b/RestSharp.IntegrationTests/AuthenticationTests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Specialized; using System.Diagnostics; using System.Net; using System.Text; @@ -19,12 +20,12 @@ public void Can_Authenticate_With_Basic_Http_Auth() using (SimpleServer.Create(baseUrl.AbsoluteUri, UsernamePasswordEchoHandler)) { - var client = new RestClient(baseUrl) + RestClient client = new RestClient(baseUrl) { Authenticator = new HttpBasicAuthenticator("testuser", "testpassword") }; - var request = new RestRequest("test"); - var response = client.Execute(request); + RestRequest request = new RestRequest("test"); + IRestResponse response = client.Execute(request); Assert.AreEqual("testuser|testpassword", response.Content); } @@ -32,8 +33,8 @@ public void Can_Authenticate_With_Basic_Http_Auth() private static void UsernamePasswordEchoHandler(HttpListenerContext context) { - var header = context.Request.Headers["Authorization"]; - var parts = Encoding.ASCII.GetString(Convert.FromBase64String(header.Substring("Basic ".Length))).Split(':'); + string header = context.Request.Headers["Authorization"]; + string[] parts = Encoding.ASCII.GetString(Convert.FromBase64String(header.Substring("Basic ".Length))).Split(':'); context.Response.OutputStream.WriteStringUtf8(string.Join("|", parts)); } @@ -41,27 +42,27 @@ private static void UsernamePasswordEchoHandler(HttpListenerContext context) //[Test] public void Can_Authenticate_With_OAuth() { - var baseUrl = new Uri("https://api.twitter.com"); - var client = new RestClient(baseUrl) + Uri baseUrl = new Uri("https://api.twitter.com"); + RestClient client = new RestClient(baseUrl) { Authenticator = OAuth1Authenticator.ForRequestToken("CONSUMER_KEY", "CONSUMER_SECRET") }; - var request = new RestRequest("oauth/request_token"); - var response = client.Execute(request); + RestRequest request = new RestRequest("oauth/request_token"); + IRestResponse response = client.Execute(request); Assert.NotNull(response); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); - var qs = HttpUtility.ParseQueryString(response.Content); - var oauthToken = qs["oauth_token"]; - var oauthTokenSecret = qs["oauth_token_secret"]; + NameValueCollection qs = HttpUtility.ParseQueryString(response.Content); + string oauthToken = qs["oauth_token"]; + string oauthTokenSecret = qs["oauth_token_secret"]; Assert.NotNull(oauthToken); Assert.NotNull(oauthTokenSecret); request = new RestRequest("oauth/authorize?oauth_token=" + oauthToken); - var url = client.BuildUri(request).ToString(); + string url = client.BuildUri(request).ToString(); Process.Start(url); diff --git a/RestSharp.IntegrationTests/CompressionTests.cs b/RestSharp.IntegrationTests/CompressionTests.cs index 18991ee63..f34f2af9a 100644 --- a/RestSharp.IntegrationTests/CompressionTests.cs +++ b/RestSharp.IntegrationTests/CompressionTests.cs @@ -16,9 +16,9 @@ public void Can_Handle_Gzip_Compressed_Content() using (SimpleServer.Create(baseUrl.AbsoluteUri, GzipEchoValue("This is some gzipped content"))) { - var client = new RestClient(baseUrl); - var request = new RestRequest(""); - var response = client.Execute(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest(""); + IRestResponse response = client.Execute(request); Assert.AreEqual("This is some gzipped content", response.Content); } @@ -31,9 +31,9 @@ public void Can_Handle_Deflate_Compressed_Content() using (SimpleServer.Create(baseUrl.AbsoluteUri, DeflateEchoValue("This is some deflated content"))) { - var client = new RestClient(baseUrl); - var request = new RestRequest(""); - var response = client.Execute(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest(""); + IRestResponse response = client.Execute(request); Assert.AreEqual("This is some deflated content", response.Content); } @@ -46,9 +46,9 @@ public void Can_Handle_Uncompressed_Content() using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.EchoValue("This is some sample content"))) { - var client = new RestClient(baseUrl); - var request = new RestRequest(""); - var response = client.Execute(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest(""); + IRestResponse response = client.Execute(request); Assert.AreEqual("This is some sample content", response.Content); } @@ -60,7 +60,7 @@ static Action GzipEchoValue(string value) { context.Response.Headers.Add("Content-encoding", "gzip"); - using (var gzip = new GZipStream(context.Response.OutputStream, CompressionMode.Compress, true)) + using (GZipStream gzip = new GZipStream(context.Response.OutputStream, CompressionMode.Compress, true)) { gzip.WriteStringUtf8(value); } @@ -73,7 +73,7 @@ static Action DeflateEchoValue(string value) { context.Response.Headers.Add("Content-encoding", "deflate"); - using (var gzip = new DeflateStream(context.Response.OutputStream, CompressionMode.Compress, true)) + using (DeflateStream gzip = new DeflateStream(context.Response.OutputStream, CompressionMode.Compress, true)) { gzip.WriteStringUtf8(value); } diff --git a/RestSharp.IntegrationTests/FileTests.cs b/RestSharp.IntegrationTests/FileTests.cs index 2dbd3f718..26eecd835 100644 --- a/RestSharp.IntegrationTests/FileTests.cs +++ b/RestSharp.IntegrationTests/FileTests.cs @@ -15,10 +15,10 @@ public void Handles_Binary_File_Download() using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.FileHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("Assets/Koala.jpg"); - var response = client.DownloadData(request); - var expected = File.ReadAllBytes(Environment.CurrentDirectory + "\\Assets\\Koala.jpg"); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("Assets/Koala.jpg"); + byte[] response = client.DownloadData(request); + byte[] expected = File.ReadAllBytes(Environment.CurrentDirectory + "\\Assets\\Koala.jpg"); Assert.AreEqual(expected, response); } @@ -33,20 +33,20 @@ public void Writes_Response_To_Stream() { string tempFile = Path.GetTempFileName(); - using (var writer = File.OpenWrite(tempFile)) + using (FileStream writer = File.OpenWrite(tempFile)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("Assets/Koala.jpg") - { - ResponseWriter = (responseStream) => responseStream.CopyTo(writer) - }; - var response = client.DownloadData(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("Assets/Koala.jpg") + { + ResponseWriter = (responseStream) => responseStream.CopyTo(writer) + }; + byte[] response = client.DownloadData(request); Assert.Null(response); } - var fromTemp = File.ReadAllBytes(tempFile); - var expected = File.ReadAllBytes(Environment.CurrentDirectory + "\\Assets\\Koala.jpg"); + byte[] fromTemp = File.ReadAllBytes(tempFile); + byte[] expected = File.ReadAllBytes(Environment.CurrentDirectory + "\\Assets\\Koala.jpg"); Assert.AreEqual(expected, fromTemp); } diff --git a/RestSharp.IntegrationTests/Helpers/Extensions.cs b/RestSharp.IntegrationTests/Helpers/Extensions.cs index 2d172fced..9cc908bce 100644 --- a/RestSharp.IntegrationTests/Helpers/Extensions.cs +++ b/RestSharp.IntegrationTests/Helpers/Extensions.cs @@ -7,7 +7,7 @@ public static class Extensions { public static void WriteStringUtf8(this Stream target, string value) { - var encoded = Encoding.UTF8.GetBytes(value); + byte[] encoded = Encoding.UTF8.GetBytes(value); target.Write(encoded, 0, encoded.Length); } diff --git a/RestSharp.IntegrationTests/Helpers/Handlers.cs b/RestSharp.IntegrationTests/Helpers/Handlers.cs index 756b073c2..bfa4227cf 100644 --- a/RestSharp.IntegrationTests/Helpers/Handlers.cs +++ b/RestSharp.IntegrationTests/Helpers/Handlers.cs @@ -30,9 +30,9 @@ public static Action EchoValue(string value) /// public static void FileHandler(HttpListenerContext context) { - var pathToFile = Path.Combine(context.Request.Url.Segments.Select(s => s.Replace("/", "")).ToArray()); + string pathToFile = Path.Combine(context.Request.Url.Segments.Select(s => s.Replace("/", "")).ToArray()); - using (var reader = new StreamReader(pathToFile)) + using (StreamReader reader = new StreamReader(pathToFile)) reader.BaseStream.CopyTo(context.Response.OutputStream); } @@ -58,8 +58,8 @@ public static void FileHandler(HttpListenerContext context) { return ctx => { - var methodName = ctx.Request.Url.Segments.Last(); - var method = typeof(T).GetMethod(methodName, + string methodName = ctx.Request.Url.Segments.Last(); + MethodInfo method = typeof(T).GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); if (method.IsStatic) diff --git a/RestSharp.IntegrationTests/Helpers/SimpleServer.cs b/RestSharp.IntegrationTests/Helpers/SimpleServer.cs index e0a8067a1..f8514bb44 100644 --- a/RestSharp.IntegrationTests/Helpers/SimpleServer.cs +++ b/RestSharp.IntegrationTests/Helpers/SimpleServer.cs @@ -20,8 +20,8 @@ private SimpleServer(HttpListener listener, Action handler) public static SimpleServer Create(string url, Action handler, AuthenticationSchemes authenticationSchemes = AuthenticationSchemes.Anonymous) { - var listener = new HttpListener { Prefixes = { url }, AuthenticationSchemes = authenticationSchemes }; - var server = new SimpleServer(listener, handler); + HttpListener listener = new HttpListener { Prefixes = { url }, AuthenticationSchemes = authenticationSchemes }; + SimpleServer server = new SimpleServer(listener, handler); server.Start(); @@ -39,7 +39,7 @@ public void Start() this.thread = new Thread(() => { - var context = this.listener.GetContext(); + HttpListenerContext context = this.listener.GetContext(); this.handler(context); diff --git a/RestSharp.IntegrationTests/MultipartFormDataTests.cs b/RestSharp.IntegrationTests/MultipartFormDataTests.cs index 2f82b398b..544bc7c65 100644 --- a/RestSharp.IntegrationTests/MultipartFormDataTests.cs +++ b/RestSharp.IntegrationTests/MultipartFormDataTests.cs @@ -2,6 +2,7 @@ using System.IO; using System.Net; using System.Threading; +using System.Threading.Tasks; using NUnit.Framework; using RestSharp.IntegrationTests.Helpers; @@ -37,9 +38,9 @@ public void MultipartFormData_WithParameterAndFile_Async() using (SimpleServer.Create(baseUrl, EchoHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; - var directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()).Parent; + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; + DirectoryInfo directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()).Parent; if (directoryInfo != null) { @@ -51,7 +52,7 @@ public void MultipartFormData_WithParameterAndFile_Async() request.AddParameter("controlName", "test", "application/json", ParameterType.RequestBody); - var task = client.ExecuteTaskAsync(request) + Task task = client.ExecuteTaskAsync(request) .ContinueWith(x => { Assert.AreEqual(this.expectedFileAndBodyRequestContent, x.Result.Content); @@ -68,9 +69,9 @@ public void MultipartFormData_WithParameterAndFile() using (SimpleServer.Create(baseUrl, EchoHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; - var directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()).Parent; + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; + DirectoryInfo directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()).Parent; if (directoryInfo != null) { @@ -82,7 +83,7 @@ public void MultipartFormData_WithParameterAndFile() request.AddParameter("controlName", "test", "application/json", ParameterType.RequestBody); - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.AreEqual(this.expectedFileAndBodyRequestContent, response.Content); } @@ -94,8 +95,8 @@ public void MultipartFormDataAsync() using (SimpleServer.Create(baseUrl, EchoHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; AddParameters(request); @@ -114,12 +115,12 @@ public void MultipartFormData() using (SimpleServer.Create(baseUrl, EchoHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; AddParameters(request); - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.AreEqual(this.expected, response.Content); } @@ -132,8 +133,8 @@ public void AlwaysMultipartFormData_WithParameter_Execute() using (SimpleServer.Create(baseUrl, EchoHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("?json_route=/posts") + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("?json_route=/posts") { AlwaysMultipartFormData = true, Method = Method.POST, @@ -141,7 +142,7 @@ public void AlwaysMultipartFormData_WithParameter_Execute() request.AddParameter("title", "test", ParameterType.RequestBody); - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.Null(response.ErrorException); } @@ -154,16 +155,16 @@ public void AlwaysMultipartFormData_WithParameter_ExecuteTaskAsync() using (SimpleServer.Create(baseUrl, EchoHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("?json_route=/posts") - { - AlwaysMultipartFormData = true, - Method = Method.POST, - }; + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("?json_route=/posts") + { + AlwaysMultipartFormData = true, + Method = Method.POST, + }; request.AddParameter("title", "test", ParameterType.RequestBody); - var task = client.ExecuteTaskAsync(request).ContinueWith(x => { Assert.Null(x.Result.ErrorException); }); + Task task = client.ExecuteTaskAsync(request).ContinueWith(x => { Assert.Null(x.Result.ErrorException); }); task.Wait(); } @@ -176,18 +177,18 @@ public void AlwaysMultipartFormData_WithParameter_ExecuteAsync() using (SimpleServer.Create(baseUrl, EchoHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("?json_route=/posts") - { - AlwaysMultipartFormData = true, - Method = Method.POST, - }; + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("?json_route=/posts") + { + AlwaysMultipartFormData = true, + Method = Method.POST, + }; request.AddParameter("title", "test", ParameterType.RequestBody); IRestResponse syncResponse = null; - using (var eventWaitHandle = new AutoResetEvent(false)) + using (AutoResetEvent eventWaitHandle = new AutoResetEvent(false)) { client.ExecuteAsync(request, response => { @@ -206,7 +207,7 @@ private static void EchoHandler(HttpListenerContext obj) { obj.Response.StatusCode = 200; - var streamReader = new StreamReader(obj.Request.InputStream); + StreamReader streamReader = new StreamReader(obj.Request.InputStream); obj.Response.OutputStream.WriteStringUtf8(streamReader.ReadToEnd()); } diff --git a/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs b/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs index eacfd8ee6..0600d3fb6 100644 --- a/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs +++ b/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs @@ -1,5 +1,6 @@ using System.Net; using System.Threading; +using System.Threading.Tasks; using NUnit.Framework; using RestSharp.IntegrationTests.Helpers; @@ -15,9 +16,9 @@ public class NonProtocolExceptionHandlingTests [Test] public void Handles_Non_Existent_Domain() { - var client = new RestClient("http://nonexistantdomainimguessing.org"); - var request = new RestRequest("foo"); - var response = client.Execute(request); + RestClient client = new RestClient("http://nonexistantdomainimguessing.org"); + RestRequest request = new RestRequest("foo"); + IRestResponse response = client.Execute(request); Assert.AreEqual(ResponseStatus.Error, response.ResponseStatus); } @@ -30,17 +31,17 @@ public class StupidClass [Test] public void Task_Handles_Non_Existent_Domain() { - var client = new RestClient("http://192.168.1.200:8001"); - var request = new RestRequest("/") - { - RequestFormat = DataFormat.Json, - Method = Method.GET - }; - var task = client.ExecuteTaskAsync(request); + RestClient client = new RestClient("http://192.168.1.200:8001"); + RestRequest request = new RestRequest("/") + { + RequestFormat = DataFormat.Json, + Method = Method.GET + }; + Task> task = client.ExecuteTaskAsync(request); task.Wait(); - var response = task.Result; + IRestResponse response = task.Result; Assert.IsInstanceOf(response.ErrorException); Assert.AreEqual("Unable to connect to the remote server", response.ErrorException.Message); @@ -59,9 +60,9 @@ public void Handles_Server_Timeout_Error() using (SimpleServer.Create(baseUrl, TimeoutHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("404") { Timeout = 500 }; - var response = client.Execute(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("404") { Timeout = 500 }; + IRestResponse response = client.Execute(request); Assert.NotNull(response.ErrorException); Assert.IsInstanceOf(response.ErrorException); @@ -74,12 +75,12 @@ public void Handles_Server_Timeout_Error_Async() { const string baseUrl = "http://localhost:8888/"; - var resetEvent = new ManualResetEvent(false); + ManualResetEvent resetEvent = new ManualResetEvent(false); using (SimpleServer.Create(baseUrl, TimeoutHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("404") { Timeout = 500 }; + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("404") { Timeout = 500 }; IRestResponse response = null; client.ExecuteAsync(request, responseCb => @@ -105,9 +106,9 @@ public void Handles_Server_Timeout_Error_AsyncTask() using (SimpleServer.Create(baseUrl, TimeoutHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("404") { Timeout = 500 }; - var task = client.ExecuteTaskAsync(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("404") { Timeout = 500 }; + Task task = client.ExecuteTaskAsync(request); task.Wait(); @@ -134,9 +135,9 @@ public void Handles_Server_Timeout_Error_With_Deserializer() using (SimpleServer.Create(baseUrl, TimeoutHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("404") { Timeout = 500 }; - var response = client.Execute(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("404") { Timeout = 500 }; + IRestResponse response = client.Execute(request); Assert.Null(response.Data); Assert.NotNull(response.ErrorException); diff --git a/RestSharp.IntegrationTests/RequestBodyTests.cs b/RestSharp.IntegrationTests/RequestBodyTests.cs index b0be84ddc..71f9317eb 100644 --- a/RestSharp.IntegrationTests/RequestBodyTests.cs +++ b/RestSharp.IntegrationTests/RequestBodyTests.cs @@ -17,8 +17,8 @@ public void Can_Not_Be_Added_To_GET_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; @@ -38,8 +38,8 @@ public void Can_Have_No_Body_Added_To_POST_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); client.Execute(request); @@ -54,8 +54,8 @@ public void Can_Be_Added_To_POST_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; @@ -75,8 +75,8 @@ public void Can_Be_Added_To_PUT_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; @@ -96,8 +96,8 @@ public void Can_Be_Added_To_DELETE_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; @@ -117,8 +117,8 @@ public void Can_Not_Be_Added_To_HEAD_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; @@ -138,8 +138,8 @@ public void Can_Be_Added_To_OPTIONS_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; @@ -159,8 +159,8 @@ public void Can_Be_Added_To_PATCH_Request() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestBodyCapturer.RESOURCE, httpMethod); const string contentType = "text/plain"; const string bodyData = "abc123 foo bar baz BING!"; @@ -199,7 +199,7 @@ private class RequestBodyCapturer public static void Capture(HttpListenerContext context) { - var request = context.Request; + HttpListenerRequest request = context.Request; CapturedContentType = request.ContentType; CapturedHasEntityBody = request.HasEntityBody; @@ -208,7 +208,7 @@ public static void Capture(HttpListenerContext context) private static string StreamToString(Stream stream) { - var streamReader = new StreamReader(stream); + StreamReader streamReader = new StreamReader(stream); return streamReader.ReadToEnd(); } } diff --git a/RestSharp.IntegrationTests/RequestHeadTests.cs b/RestSharp.IntegrationTests/RequestHeadTests.cs index 07b6fb0c6..4d9b4cd54 100644 --- a/RestSharp.IntegrationTests/RequestHeadTests.cs +++ b/RestSharp.IntegrationTests/RequestHeadTests.cs @@ -24,14 +24,14 @@ public void Does_Not_Pass_Default_Credentials_When_Server_Does_Not_Negotiate() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestHeadCapturer.RESOURCE, httpMethod) { UseDefaultCredentials = true }; + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestHeadCapturer.RESOURCE, httpMethod) { UseDefaultCredentials = true }; client.Execute(request); Assert.NotNull(RequestHeadCapturer.CapturedHeaders); - var keys = RequestHeadCapturer.CapturedHeaders.Keys.Cast().ToArray(); + string[] keys = RequestHeadCapturer.CapturedHeaders.Keys.Cast().ToArray(); Assert.False(keys.Contains("Authorization"), "Authorization header was present in HTTP request from client, even though server does not use the Negotiate scheme"); @@ -45,14 +45,14 @@ public void Passes_Default_Credentials_When_UseDefaultCredentials_Is_True() using (SimpleServer.Create(BASE_URL, Handlers.Generic(), AuthenticationSchemes.Negotiate)) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestHeadCapturer.RESOURCE, httpMethod) { UseDefaultCredentials = true }; - var response = client.Execute(request); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestHeadCapturer.RESOURCE, httpMethod) { UseDefaultCredentials = true }; + IRestResponse response = client.Execute(request); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.NotNull(RequestHeadCapturer.CapturedHeaders); - var keys = RequestHeadCapturer.CapturedHeaders.Keys.Cast().ToArray(); + string[] keys = RequestHeadCapturer.CapturedHeaders.Keys.Cast().ToArray(); Assert.True(keys.Contains("Authorization"), "Authorization header not present in HTTP request from client, even though UseDefaultCredentials = true"); @@ -66,15 +66,15 @@ public void Does_Not_Pass_Default_Credentials_When_UseDefaultCredentials_Is_Fals using (SimpleServer.Create(BASE_URL, Handlers.Generic(), AuthenticationSchemes.Negotiate)) { - var client = new RestClient(BASE_URL); - var request = new RestRequest(RequestHeadCapturer.RESOURCE, httpMethod) - { - // UseDefaultCredentials is currently false by default, - // but to make the test more robust in case that ever - // changes, it's better to explicitly set it here. - UseDefaultCredentials = false - }; - var response = client.Execute(request); + RestClient client = new RestClient(BASE_URL); + RestRequest request = new RestRequest(RequestHeadCapturer.RESOURCE, httpMethod) + { + // UseDefaultCredentials is currently false by default, + // but to make the test more robust in case that ever + // changes, it's better to explicitly set it here. + UseDefaultCredentials = false + }; + IRestResponse response = client.Execute(request); Assert.AreEqual(HttpStatusCode.Unauthorized, response.StatusCode); Assert.Null(RequestHeadCapturer.CapturedHeaders); @@ -94,7 +94,7 @@ public static void Initialize() public static void Capture(HttpListenerContext context) { - var request = context.Request; + HttpListenerRequest request = context.Request; CapturedHeaders = request.Headers; } diff --git a/RestSharp.IntegrationTests/StatusCodeTests.cs b/RestSharp.IntegrationTests/StatusCodeTests.cs index ef8405ddf..bd97052d2 100644 --- a/RestSharp.IntegrationTests/StatusCodeTests.cs +++ b/RestSharp.IntegrationTests/StatusCodeTests.cs @@ -16,9 +16,9 @@ public void Handles_GET_Request_404_Error() using (SimpleServer.Create(baseUrl.AbsoluteUri, UrlToStatusCodeHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("404"); - var response = client.Execute(request); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("404"); + IRestResponse response = client.Execute(request); Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode); } @@ -31,12 +31,12 @@ public void Handles_GET_Request_404_Error_With_Body() using (SimpleServer.Create(baseUrl.AbsoluteUri, UrlToStatusCodeHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest("404"); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("404"); request.AddBody("This is the body"); - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode); } @@ -54,8 +54,8 @@ public void Handles_Different_Root_Element_On_Http_Error() using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.Generic())) { - var client = new RestClient(baseUrl); - var request = new RestRequest("error") { RootElement = "Success" }; + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("error") { RootElement = "Success" }; request.OnBeforeDeserialization = resp => { @@ -65,7 +65,7 @@ public void Handles_Different_Root_Element_On_Http_Error() } }; - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); Assert.AreEqual("Not found!", response.Data.Message); @@ -79,8 +79,8 @@ public void Handles_Default_Root_Element_On_No_Error() using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.Generic())) { - var client = new RestClient(baseUrl); - var request = new RestRequest("success") { RootElement = "Success" }; + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest("success") { RootElement = "Success" }; request.OnBeforeDeserialization = resp => { @@ -90,7 +90,7 @@ public void Handles_Default_Root_Element_On_No_Error() } }; - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.AreEqual("Works!", response.Data.Message); diff --git a/RestSharp.IntegrationTests/StructuredSyntaxSuffixTests.cs b/RestSharp.IntegrationTests/StructuredSyntaxSuffixTests.cs index 5eac5678a..9835be01c 100644 --- a/RestSharp.IntegrationTests/StructuredSyntaxSuffixTests.cs +++ b/RestSharp.IntegrationTests/StructuredSyntaxSuffixTests.cs @@ -33,13 +33,13 @@ public void By_default_content_types_with_JSON_structured_syntax_suffix_should_d using (SimpleServer.Create(baseUrl.AbsoluteUri, QueryStringBasedContentAndContentTypeHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest(); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest(); request.AddParameter("ct", "application/vnd.somebody.something+json"); request.AddParameter("c", JSON_CONTENT); - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.AreEqual("Bob", response.Data.Name); Assert.AreEqual(50, response.Data.Age); @@ -53,13 +53,13 @@ public void By_default_content_types_with_XML_structured_syntax_suffix_should_de using (SimpleServer.Create(baseUrl.AbsoluteUri, QueryStringBasedContentAndContentTypeHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest(); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest(); request.AddParameter("ct", "application/vnd.somebody.something+xml"); request.AddParameter("c", XML_CONTENT); - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.AreEqual("Bob", response.Data.Name); Assert.AreEqual(50, response.Data.Age); @@ -73,17 +73,17 @@ public void Content_type_that_matches_the_structured_syntax_suffix_format_but_wa using (SimpleServer.Create(baseUrl.AbsoluteUri, QueryStringBasedContentAndContentTypeHandler)) { - var client = new RestClient(baseUrl); + RestClient client = new RestClient(baseUrl); // In spite of the content type (+xml), treat this specific content type as JSON client.AddHandler("application/vnd.somebody.something+xml", new JsonDeserializer()); - var request = new RestRequest(); + RestRequest request = new RestRequest(); request.AddParameter("ct", "application/vnd.somebody.something+xml"); request.AddParameter("c", JSON_CONTENT); - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.AreEqual("Bob", response.Data.Name); Assert.AreEqual(50, response.Data.Age); @@ -97,17 +97,17 @@ public void Should_allow_wildcard_content_types_to_be_defined() using (SimpleServer.Create(baseUrl.AbsoluteUri, QueryStringBasedContentAndContentTypeHandler)) { - var client = new RestClient(baseUrl); + RestClient client = new RestClient(baseUrl); // In spite of the content type, handle ALL structured syntax suffixes of "+xml" as JSON client.AddHandler("*+xml", new JsonDeserializer()); - var request = new RestRequest(); + RestRequest request = new RestRequest(); request.AddParameter("ct", "application/vnd.somebody.something+xml"); request.AddParameter("c", JSON_CONTENT); - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.AreEqual("Bob", response.Data.Name); Assert.AreEqual(50, response.Data.Age); @@ -121,13 +121,13 @@ public void By_default_application_json_content_type_should_deserialize_as_JSON( using (SimpleServer.Create(baseUrl.AbsoluteUri, QueryStringBasedContentAndContentTypeHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest(); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest(); request.AddParameter("ct", "application/json"); request.AddParameter("c", JSON_CONTENT); - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.AreEqual("Bob", response.Data.Name); Assert.AreEqual(50, response.Data.Age); @@ -141,13 +141,13 @@ public void By_default_text_xml_content_type_should_deserialize_as_XML() using (SimpleServer.Create(baseUrl.AbsoluteUri, QueryStringBasedContentAndContentTypeHandler)) { - var client = new RestClient(baseUrl); - var request = new RestRequest(); + RestClient client = new RestClient(baseUrl); + RestRequest request = new RestRequest(); request.AddParameter("ct", "text/xml"); request.AddParameter("c", XML_CONTENT); - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.AreEqual("Bob", response.Data.Name); Assert.AreEqual(50, response.Data.Age); diff --git a/RestSharp.IntegrationTests/oAuth1Tests.cs b/RestSharp.IntegrationTests/oAuth1Tests.cs index c4a1a4db2..0c356c269 100644 --- a/RestSharp.IntegrationTests/oAuth1Tests.cs +++ b/RestSharp.IntegrationTests/oAuth1Tests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Diagnostics; using System.IO; using System.Linq; @@ -23,20 +24,20 @@ public void Can_Authenticate_With_OAuth() const string consumerKey = ""; const string consumerSecret = ""; - var baseUrl = new Uri("https://api.twitter.com"); - var client = new RestClient(baseUrl) - { - Authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret) - }; - var request = new RestRequest("oauth/request_token", Method.POST); - var response = client.Execute(request); + Uri baseUrl = new Uri("https://api.twitter.com"); + RestClient client = new RestClient(baseUrl) + { + Authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret) + }; + RestRequest request = new RestRequest("oauth/request_token", Method.POST); + IRestResponse response = client.Execute(request); Assert.NotNull(response); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); - var qs = HttpUtility.ParseQueryString(response.Content); - var oauthToken = qs["oauth_token"]; - var oauthTokenSecret = qs["oauth_token_secret"]; + NameValueCollection qs = HttpUtility.ParseQueryString(response.Content); + string oauthToken = qs["oauth_token"]; + string oauthTokenSecret = qs["oauth_token_secret"]; Assert.NotNull(oauthToken); Assert.NotNull(oauthTokenSecret); @@ -44,7 +45,7 @@ public void Can_Authenticate_With_OAuth() request = new RestRequest("oauth/authorize"); request.AddParameter("oauth_token", oauthToken); - var url = client.BuildUri(request).ToString(); + string url = client.BuildUri(request).ToString(); Process.Start(url); @@ -105,24 +106,24 @@ public void Can_Authenticate_Twitter() Assert.True(File.Exists(@"..\..\config.json")); - var config = SimpleJson.DeserializeObject(File.ReadAllText(@"..\..\config.json")) as JsonObject; + JsonObject config = SimpleJson.DeserializeObject(File.ReadAllText(@"..\..\config.json")) as JsonObject; if (config != null) { - var client = new RestClient("https://api.twitter.com/1.1") - { - Authenticator = OAuth1Authenticator.ForProtectedResource( - (string) config["ConsumerKey"], - (string) config["ConsumerSecret"], - (string) config["AccessToken"], - (string) config["AccessSecret"]) - }; + RestClient client = new RestClient("https://api.twitter.com/1.1") + { + Authenticator = OAuth1Authenticator.ForProtectedResource( + (string) config["ConsumerKey"], + (string) config["ConsumerSecret"], + (string) config["AccessToken"], + (string) config["AccessSecret"]) + }; - var request = new RestRequest("account/verify_credentials.json"); + RestRequest request = new RestRequest("account/verify_credentials.json"); request.AddParameter("include_entities", "true", ParameterType.QueryString); - var response = client.Execute(request); + IRestResponse response = client.Execute(request); Assert.NotNull(response); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); @@ -158,35 +159,35 @@ public void Can_Authenticate_Netflix_With_OAuth() const string consumerKey = ""; const string consumerSecret = ""; - var baseUrl = new Uri("http://api.netflix.com"); - var client = new RestClient(baseUrl) - { - Authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret) - }; - var request = new RestRequest("oauth/request_token"); - var response = client.Execute(request); + Uri baseUrl = new Uri("http://api.netflix.com"); + RestClient client = new RestClient(baseUrl) + { + Authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret) + }; + RestRequest request = new RestRequest("oauth/request_token"); + IRestResponse response = client.Execute(request); Assert.NotNull(response); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); - var qs = HttpUtility.ParseQueryString(response.Content); - var oauthToken = qs["oauth_token"]; - var oauthTokenSecret = qs["oauth_token_secret"]; - var applicationName = qs["application_name"]; + NameValueCollection qs = HttpUtility.ParseQueryString(response.Content); + string oauthToken = qs["oauth_token"]; + string oauthTokenSecret = qs["oauth_token_secret"]; + string applicationName = qs["application_name"]; Assert.NotNull(oauthToken); Assert.NotNull(oauthTokenSecret); Assert.NotNull(applicationName); - var baseSslUrl = new Uri("https://api-user.netflix.com"); - var sslClient = new RestClient(baseSslUrl); + Uri baseSslUrl = new Uri("https://api-user.netflix.com"); + RestClient sslClient = new RestClient(baseSslUrl); request = new RestRequest("oauth/login"); request.AddParameter("oauth_token", oauthToken); request.AddParameter("oauth_consumer_key", consumerKey); request.AddParameter("application_name", applicationName); - var url = sslClient.BuildUri(request).ToString(); + string url = sslClient.BuildUri(request).ToString(); Process.Start(url); @@ -202,7 +203,7 @@ public void Can_Authenticate_Netflix_With_OAuth() oauthToken = qs["oauth_token"]; oauthTokenSecret = qs["oauth_token_secret"]; - var userId = qs["user_id"]; + string userId = qs["user_id"]; Assert.NotNull(oauthToken); Assert.NotNull(oauthTokenSecret); @@ -214,7 +215,7 @@ public void Can_Authenticate_Netflix_With_OAuth() request.AddUrlSegment("user_id", userId); request.AddParameter("max_results", "2"); - var queueResponse = client.Execute(request); + IRestResponse queueResponse = client.Execute(request); Assert.NotNull(queueResponse); Assert.AreEqual(HttpStatusCode.OK, queueResponse.StatusCode); @@ -225,8 +226,8 @@ public void Can_Authenticate_Netflix_With_OAuth() [Test] public void Properly_Encodes_Parameter_Names() { - var postData = new WebParameterCollection { { "name[first]", "Chuck" }, { "name[last]", "Testa" } }; - var sortedParams = OAuthTools.SortParametersExcludingSignature(postData); + WebParameterCollection postData = new WebParameterCollection { { "name[first]", "Chuck" }, { "name[last]", "Testa" } }; + WebParameterCollection sortedParams = OAuthTools.SortParametersExcludingSignature(postData); Assert.AreEqual("name%5Bfirst%5D", sortedParams[0].Name); } @@ -235,12 +236,15 @@ public void Properly_Encodes_Parameter_Names() public void Use_RFC_3986_Encoding_For_Auth_Signature_Base() { // reserved characters for 2396 and 3986 - var reserved2396Characters = new[] { ";", "/", "?", ":", "@", "&", "=", "+", "$", "," }; // http://www.ietf.org/rfc/rfc2396.txt - var additionalReserved3986Characters = new[] { "!", "*", "'", "(", ")" }; // http://www.ietf.org/rfc/rfc3986.txt - var reservedCharacterString = string.Join(string.Empty, reserved2396Characters.Union(additionalReserved3986Characters)); + // http://www.ietf.org/rfc/rfc2396.txt + string[] reserved2396Characters = new[] { ";", "/", "?", ":", "@", "&", "=", "+", "$", "," }; + // http://www.ietf.org/rfc/rfc3986.txt + string[] additionalReserved3986Characters = new[] { "!", "*", "'", "(", ")" }; + string reservedCharacterString = string.Join(string.Empty, + reserved2396Characters.Union(additionalReserved3986Characters)); // act - var escapedString = OAuthTools.UrlEncodeRelaxed(reservedCharacterString); + string escapedString = OAuthTools.UrlEncodeRelaxed(reservedCharacterString); // assert Assert.AreEqual("%3B%2F%3F%3A%40%26%3D%2B%24%2C%21%2A%27%28%29", escapedString); @@ -254,20 +258,21 @@ public void Can_Authenticate_LinkedIN_With_OAuth() const string consumerSecret = "TODO_CONSUMER_SECRET_HERE"; // request token - var client = new RestClient - { - BaseUrl = new Uri("https://api.linkedin.com/uas/oauth"), - Authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret, "http://localhost") - }; - var requestTokenRequest = new RestRequest("requestToken"); - var requestTokenResponse = client.Execute(requestTokenRequest); + RestClient client = new RestClient + { + BaseUrl = new Uri("https://api.linkedin.com/uas/oauth"), + Authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret, + "http://localhost") + }; + RestRequest requestTokenRequest = new RestRequest("requestToken"); + IRestResponse requestTokenResponse = client.Execute(requestTokenRequest); Assert.NotNull(requestTokenResponse); Assert.AreEqual(HttpStatusCode.OK, requestTokenResponse.StatusCode); - var requestTokenResponseParameters = HttpUtility.ParseQueryString(requestTokenResponse.Content); - var requestToken = requestTokenResponseParameters["oauth_token"]; - var requestSecret = requestTokenResponseParameters["oauth_token_secret"]; + NameValueCollection requestTokenResponseParameters = HttpUtility.ParseQueryString(requestTokenResponse.Content); + string requestToken = requestTokenResponseParameters["oauth_token"]; + string requestSecret = requestTokenResponseParameters["oauth_token_secret"]; Assert.NotNull(requestToken); Assert.NotNull(requestSecret); @@ -275,7 +280,7 @@ public void Can_Authenticate_LinkedIN_With_OAuth() // redirect user requestTokenRequest = new RestRequest("authenticate?oauth_token=" + requestToken); - var redirectUri = client.BuildUri(requestTokenRequest); + Uri redirectUri = client.BuildUri(requestTokenRequest); Process.Start(redirectUri.ToString()); @@ -290,21 +295,21 @@ public void Can_Authenticate_LinkedIN_With_OAuth() Debugger.Break(); // get the access token - var requestTokenQueryParameters = HttpUtility.ParseQueryString(new Uri(requestUrl).Query); - var requestVerifier = requestTokenQueryParameters["oauth_verifier"]; + NameValueCollection requestTokenQueryParameters = HttpUtility.ParseQueryString(new Uri(requestUrl).Query); + string requestVerifier = requestTokenQueryParameters["oauth_verifier"]; client.Authenticator = OAuth1Authenticator.ForAccessToken( consumerKey, consumerSecret, requestToken, requestSecret, requestVerifier); - var requestAccessTokenRequest = new RestRequest("accessToken"); - var requestActionTokenResponse = client.Execute(requestAccessTokenRequest); + RestRequest requestAccessTokenRequest = new RestRequest("accessToken"); + IRestResponse requestActionTokenResponse = client.Execute(requestAccessTokenRequest); Assert.NotNull(requestActionTokenResponse); Assert.AreEqual(HttpStatusCode.OK, requestActionTokenResponse.StatusCode); - var requestActionTokenResponseParameters = HttpUtility.ParseQueryString(requestActionTokenResponse.Content); - var accessToken = requestActionTokenResponseParameters["oauth_token"]; - var accessSecret = requestActionTokenResponseParameters["oauth_token_secret"]; + NameValueCollection requestActionTokenResponseParameters = HttpUtility.ParseQueryString(requestActionTokenResponse.Content); + string accessToken = requestActionTokenResponseParameters["oauth_token"]; + string accessSecret = requestActionTokenResponseParameters["oauth_token_secret"]; Assert.NotNull(accessToken); Assert.NotNull(accessSecret); @@ -320,16 +325,16 @@ public void Can_Retrieve_Member_Profile_Field_Field_Selector_From_LinkedIN() const string accessSecret = "TODO_ACCES_SECRET_HERE"; // arrange - var client = new RestClient - { - BaseUrl = new Uri("http://api.linkedin.com/v1"), - Authenticator = OAuth1Authenticator.ForProtectedResource(consumerKey, consumerSecret, - accessToken, accessSecret) - }; - var request = new RestRequest("people/~:(id,first-name,last-name)"); + RestClient client = new RestClient + { + BaseUrl = new Uri("http://api.linkedin.com/v1"), + Authenticator = OAuth1Authenticator.ForProtectedResource(consumerKey, + consumerSecret, accessToken, accessSecret) + }; + RestRequest request = new RestRequest("people/~:(id,first-name,last-name)"); // act - var response = client.Execute(request); + IRestResponse response = client.Execute(request); // assert Assert.NotNull(response); @@ -348,12 +353,12 @@ public void Can_Query_Vimeo() const string consumerSecret = "TODO_CONSUMER_SECRET_HERE"; // arrange - var client = new RestClient - { - BaseUrl = new Uri("http://vimeo.com/api/rest/v2"), - Authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret) - }; - var request = new RestRequest(); + RestClient client = new RestClient + { + BaseUrl = new Uri("http://vimeo.com/api/rest/v2"), + Authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret) + }; + RestRequest request = new RestRequest(); request.AddParameter("format", "json"); request.AddParameter("method", "vimeo.videos.search"); @@ -361,7 +366,7 @@ public void Can_Query_Vimeo() request.AddParameter("full_response", 1); // act - var response = client.Execute(request); + IRestResponse response = client.Execute(request); // assert Assert.NotNull(response); diff --git a/RestSharp/Authenticators/HttpBasicAuthenticator.cs b/RestSharp/Authenticators/HttpBasicAuthenticator.cs index 8c5bb5f39..de95d3342 100644 --- a/RestSharp/Authenticators/HttpBasicAuthenticator.cs +++ b/RestSharp/Authenticators/HttpBasicAuthenticator.cs @@ -26,7 +26,7 @@ public class HttpBasicAuthenticator : IAuthenticator public HttpBasicAuthenticator(string username, string password) { - var token = Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", username, password))); + string token = Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", username, password))); this.authHeader = string.Format("Basic {0}", token); } diff --git a/RestSharp/Authenticators/JwtAuthenticator.cs b/RestSharp/Authenticators/JwtAuthenticator.cs index 0c397c6c9..2b994e14c 100644 --- a/RestSharp/Authenticators/JwtAuthenticator.cs +++ b/RestSharp/Authenticators/JwtAuthenticator.cs @@ -20,32 +20,32 @@ namespace RestSharp.Authenticators { - /// - /// JSON WEB TOKEN (JWT) Authenticator class. - /// https://tools.ietf.org/html/draft-ietf-oauth-json-web-token - /// - public class JwtAuthenticator : IAuthenticator - { - readonly string authHeader; + /// + /// JSON WEB TOKEN (JWT) Authenticator class. + /// https://tools.ietf.org/html/draft-ietf-oauth-json-web-token + /// + public class JwtAuthenticator : IAuthenticator + { + readonly string authHeader; - public JwtAuthenticator(string accessToken) - { - if (accessToken == null) - { - throw new ArgumentNullException("accessToken"); - } + public JwtAuthenticator(string accessToken) + { + if (accessToken == null) + { + throw new ArgumentNullException("accessToken"); + } - this.authHeader = string.Format("Bearer {0}", accessToken); - } + this.authHeader = string.Format("Bearer {0}", accessToken); + } - public void Authenticate(IRestClient client, IRestRequest request) - { - // only add the Authorization parameter if it hasn't been added by a previous Execute - if (!request.Parameters.Any(p => p.Type.Equals(ParameterType.HttpHeader) && - p.Name.Equals("Authorization", StringComparison.OrdinalIgnoreCase))) + public void Authenticate(IRestClient client, IRestRequest request) + { + // only add the Authorization parameter if it hasn't been added by a previous Execute + if (!request.Parameters.Any(p => p.Type.Equals(ParameterType.HttpHeader) && + p.Name.Equals("Authorization", StringComparison.OrdinalIgnoreCase))) { request.AddParameter("Authorization", this.authHeader, ParameterType.HttpHeader); } - } - } + } + } } diff --git a/RestSharp/Authenticators/NtlmAuthenticator.cs b/RestSharp/Authenticators/NtlmAuthenticator.cs index cdd3d10e5..569b0aa37 100644 --- a/RestSharp/Authenticators/NtlmAuthenticator.cs +++ b/RestSharp/Authenticators/NtlmAuthenticator.cs @@ -14,10 +14,11 @@ // limitations under the License. #endregion +#if FRAMEWORK + using System; using System.Net; -#if FRAMEWORK namespace RestSharp.Authenticators { /// @@ -30,7 +31,7 @@ public class NtlmAuthenticator : IAuthenticator /// /// Authenticate with the credentials of the currently logged in user /// - public NtlmAuthenticator() + public NtlmAuthenticator() : this(CredentialCache.DefaultCredentials) { } /// @@ -59,4 +60,5 @@ public void Authenticate(IRestClient client, IRestRequest request) } } } + #endif diff --git a/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs index b1a421868..a8f326ce7 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs @@ -20,7 +20,7 @@ public static IEnumerable And(this T item, T other) public static IEnumerable And(this IEnumerable items, T item) { - foreach (var i in items) + foreach (T i in items) { yield return i; } @@ -40,7 +40,7 @@ public static IEnumerable ToEnumerable(this object[] items) where T : clas public static void ForEach(this IEnumerable items, Action action) { - foreach (var item in items) + foreach (T item in items) { action(item); } @@ -49,7 +49,7 @@ public static void ForEach(this IEnumerable items, Action action) #if !WINDOWS_PHONE && !SILVERLIGHT public static void AddRange(this IDictionary collection, NameValueCollection range) { - foreach (var key in range.AllKeys) + foreach (string key in range.AllKeys) { collection.Add(key, range[key]); } @@ -57,16 +57,16 @@ public static void AddRange(this IDictionary collection, NameVal public static string ToQueryString(this NameValueCollection collection) { - var sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); if (collection.Count > 0) { sb.Append("?"); } - var count = 0; + int count = 0; - foreach (var key in collection.AllKeys) + foreach (string key in collection.AllKeys) { sb.AppendFormat("{0}={1}", key, collection[key].UrlEncode()); count++; @@ -85,11 +85,11 @@ public static string ToQueryString(this NameValueCollection collection) public static string Concatenate(this WebParameterCollection collection, string separator, string spacer) { - var sb = new StringBuilder(); - var total = collection.Count; - var count = 0; + StringBuilder sb = new StringBuilder(); + int total = collection.Count; + int count = 0; - foreach (var item in collection) + foreach (WebPair item in collection) { sb.Append(item.Name); sb.Append(separator); diff --git a/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs index d5b1c1456..0b54708f3 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs @@ -8,8 +8,8 @@ internal static class OAuthExtensions { public static string ToRequestValue(this OAuthSignatureMethod signatureMethod) { - var value = signatureMethod.ToString().ToUpper(); - var shaIndex = value.IndexOf("SHA1"); + string value = signatureMethod.ToString().ToUpper(); + int shaIndex = value.IndexOf("SHA1"); return shaIndex > -1 ? value.Insert(shaIndex, "-") : value; } @@ -31,8 +31,8 @@ public static OAuthSignatureMethod FromRequestValue(this string signatureMethod) public static string HashWith(this string input, HashAlgorithm algorithm) { - var data = Encoding.UTF8.GetBytes(input); - var hash = algorithm.ComputeHash(data); + byte[] data = Encoding.UTF8.GetBytes(input); + byte[] hash = algorithm.ComputeHash(data); return Convert.ToBase64String(hash); } diff --git a/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs index c9d656885..172d29a7f 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs @@ -67,10 +67,10 @@ public static byte[] GetBytes(this string input) public static string PercentEncode(this string s) { - var bytes = s.GetBytes(); - var sb = new StringBuilder(); + byte[] bytes = s.GetBytes(); + StringBuilder sb = new StringBuilder(); - foreach (var b in bytes) + foreach (byte b in bytes) { sb.Append(string.Format("%{0:X2}", b)); } @@ -88,7 +88,7 @@ public static IDictionary ParseQueryString(this string query) return new Dictionary(); } - var parts = query.Split('&'); + string[] parts = query.Split('&'); return parts.Select(part => part.Split('=')) .ToDictionary(pair => pair[0], pair => pair[1]); diff --git a/RestSharp/Authenticators/OAuth/Extensions/TimeExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/TimeExtensions.cs index 0dbe54f78..3adff676d 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/TimeExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/TimeExtensions.cs @@ -11,7 +11,7 @@ public static DateTime FromNow(this TimeSpan value) public static DateTime FromUnixTime(this long seconds) { - var time = new DateTime(1970, 1, 1); + DateTime time = new DateTime(1970, 1, 1); time = time.AddSeconds(seconds); @@ -20,8 +20,8 @@ public static DateTime FromUnixTime(this long seconds) public static long ToUnixTime(this DateTime dateTime) { - var timeSpan = (dateTime - new DateTime(1970, 1, 1)); - var timestamp = (long) timeSpan.TotalSeconds; + TimeSpan timeSpan = (dateTime - new DateTime(1970, 1, 1)); + long timestamp = (long) timeSpan.TotalSeconds; return timestamp; } diff --git a/RestSharp/Authenticators/OAuth/HttpPostParameter.cs b/RestSharp/Authenticators/OAuth/HttpPostParameter.cs index 405054065..d44f51f94 100644 --- a/RestSharp/Authenticators/OAuth/HttpPostParameter.cs +++ b/RestSharp/Authenticators/OAuth/HttpPostParameter.cs @@ -19,26 +19,26 @@ public HttpPostParameter(string name, string value) public static HttpPostParameter CreateFile(string name, string fileName, string filePath, string contentType) { - var parameter = new HttpPostParameter(name, string.Empty) - { - Type = HttpPostParameterType.File, - FileName = fileName, - FilePath = filePath, - ContentType = contentType, - }; + HttpPostParameter parameter = new HttpPostParameter(name, string.Empty) + { + Type = HttpPostParameterType.File, + FileName = fileName, + FilePath = filePath, + ContentType = contentType, + }; return parameter; } public static HttpPostParameter CreateFile(string name, string fileName, Stream fileStream, string contentType) { - var parameter = new HttpPostParameter(name, string.Empty) - { - Type = HttpPostParameterType.File, - FileName = fileName, - FileStream = fileStream, - ContentType = contentType, - }; + HttpPostParameter parameter = new HttpPostParameter(name, string.Empty) + { + Type = HttpPostParameterType.File, + FileName = fileName, + FileStream = fileStream, + ContentType = contentType, + }; return parameter; } diff --git a/RestSharp/Authenticators/OAuth/OAuthTools.cs b/RestSharp/Authenticators/OAuth/OAuthTools.cs index ca797a0a2..bed1e6505 100644 --- a/RestSharp/Authenticators/OAuth/OAuthTools.cs +++ b/RestSharp/Authenticators/OAuth/OAuthTools.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; @@ -27,7 +28,7 @@ internal static class OAuthTools static OAuthTools() { #if !SILVERLIGHT && !WINDOWS_PHONE - var bytes = new byte[4]; + byte[] bytes = new byte[4]; rng.GetNonZeroBytes(bytes); random = new Random(BitConverter.ToInt32(bytes, 0)); @@ -51,11 +52,11 @@ public static string GetNonce() { const string chars = (LOWER + DIGIT); - var nonce = new char[16]; + char[] nonce = new char[16]; lock (randomLock) { - for (var i = 0; i < nonce.Length; i++) + for (int i = 0; i < nonce.Length; i++) { nonce[i] = chars[random.Next(0, chars.Length)]; } @@ -82,7 +83,8 @@ public static string GetTimestamp() /// public static string GetTimestamp(DateTime dateTime) { - var timestamp = dateTime.ToUnixTime(); + long timestamp = dateTime.ToUnixTime(); + return timestamp.ToString(); } @@ -167,8 +169,8 @@ public static string UrlEncodeStrict(string value) /// public static string NormalizeRequestParameters(WebParameterCollection parameters) { - var copy = SortParametersExcludingSignature(parameters); - var concatenated = copy.Concatenate("=", "&"); + WebParameterCollection copy = SortParametersExcludingSignature(parameters); + string concatenated = copy.Concatenate("=", "&"); return concatenated; } @@ -180,8 +182,8 @@ public static string NormalizeRequestParameters(WebParameterCollection parameter /// A sorted parameter collection public static WebParameterCollection SortParametersExcludingSignature(WebParameterCollection parameters) { - var copy = new WebParameterCollection(parameters); - var exclusions = copy.Where(n => n.Name.EqualsIgnoreCase("oauth_signature")); + WebParameterCollection copy = new WebParameterCollection(parameters); + IEnumerable exclusions = copy.Where(n => n.Name.EqualsIgnoreCase("oauth_signature")); copy.RemoveAll(exclusions); copy.ForEach(p => { p.Name = UrlEncodeStrict(p.Name); p.Value = UrlEncodeStrict(p.Value); }); @@ -207,11 +209,11 @@ public static string ConstructRequestUrl(Uri url) throw new ArgumentNullException("url"); } - var sb = new StringBuilder(); - var requestUrl = "{0}://{1}".FormatWith(url.Scheme, url.Host); - var qualified = ":{0}".FormatWith(url.Port); - var basic = url.Scheme == "http" && url.Port == 80; - var secure = url.Scheme == "https" && url.Port == 443; + StringBuilder sb = new StringBuilder(); + string requestUrl = "{0}://{1}".FormatWith(url.Scheme, url.Host); + string qualified = ":{0}".FormatWith(url.Port); + bool basic = url.Scheme == "http" && url.Port == 80; + bool secure = url.Scheme == "https" && url.Port == 443; sb.Append(requestUrl); sb.Append(!basic && !secure ? qualified : ""); @@ -232,12 +234,12 @@ public static string ConstructRequestUrl(Uri url) /// A signature base string public static string ConcatenateRequestElements(string method, string url, WebParameterCollection parameters) { - var sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); // Separating &'s are not URL encoded - var requestMethod = method.ToUpper().Then("&"); - var requestUrl = UrlEncodeRelaxed(ConstructRequestUrl(url.AsUri())).Then("&"); - var requestParameters = UrlEncodeRelaxed(NormalizeRequestParameters(parameters)); + string requestMethod = method.ToUpper().Then("&"); + string requestUrl = UrlEncodeRelaxed(ConstructRequestUrl(url.AsUri())).Then("&"); + string requestParameters = UrlEncodeRelaxed(NormalizeRequestParameters(parameters)); sb.Append(requestMethod); sb.Append(requestUrl); @@ -318,8 +320,8 @@ public static string GetSignature(OAuthSignatureMethod signatureMethod, OAuthSig { case OAuthSignatureMethod.HmacSha1: { - var crypto = new HMACSHA1(); - var key = "{0}&{1}".FormatWith(consumerSecret, tokenSecret); + HMACSHA1 crypto = new HMACSHA1(); + string key = "{0}&{1}".FormatWith(consumerSecret, tokenSecret); crypto.Key = encoding.GetBytes(key); signature = signatureBase.HashWith(crypto); @@ -338,7 +340,7 @@ public static string GetSignature(OAuthSignatureMethod signatureMethod, OAuthSig throw new NotImplementedException("Only HMAC-SHA1 is currently supported."); } - var result = signatureTreatment == OAuthSignatureTreatment.Escaped + string result = signatureTreatment == OAuthSignatureTreatment.Escaped ? UrlEncodeRelaxed(signature) : signature; diff --git a/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs b/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs index b2251023d..9e663d47e 100644 --- a/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs +++ b/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs @@ -3,6 +3,7 @@ using RestSharp.Authenticators.OAuth.Extensions; #if !SILVERLIGHT && !WINDOWS_PHONE +using System.Collections.Specialized; using RestSharp.Extensions.MonoHttp; #endif @@ -80,29 +81,29 @@ public virtual OAuthWebQueryInfo BuildRequestTokenInfo(string method, WebParamet parameters = new WebParameterCollection(); } - var timestamp = OAuthTools.GetTimestamp(); - var nonce = OAuthTools.GetNonce(); + string timestamp = OAuthTools.GetTimestamp(); + string nonce = OAuthTools.GetNonce(); AddAuthParameters(parameters, timestamp, nonce); - var signatureBase = OAuthTools.ConcatenateRequestElements(method, RequestTokenUrl, parameters); - var signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret); - - var info = new OAuthWebQueryInfo - { - WebMethod = method, - ParameterHandling = ParameterHandling, - ConsumerKey = ConsumerKey, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, - Signature = signature, - Timestamp = timestamp, - Nonce = nonce, - Version = Version ?? "1.0", - Callback = OAuthTools.UrlEncodeRelaxed(CallbackUrl ?? ""), - TokenSecret = TokenSecret, - ConsumerSecret = ConsumerSecret - }; + string signatureBase = OAuthTools.ConcatenateRequestElements(method, RequestTokenUrl, parameters); + string signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret); + + OAuthWebQueryInfo info = new OAuthWebQueryInfo + { + WebMethod = method, + ParameterHandling = ParameterHandling, + ConsumerKey = ConsumerKey, + SignatureMethod = SignatureMethod.ToRequestValue(), + SignatureTreatment = SignatureTreatment, + Signature = signature, + Timestamp = timestamp, + Nonce = nonce, + Version = Version ?? "1.0", + Callback = OAuthTools.UrlEncodeRelaxed(CallbackUrl ?? ""), + TokenSecret = TokenSecret, + ConsumerSecret = ConsumerSecret + }; return info; } @@ -136,32 +137,32 @@ public virtual OAuthWebQueryInfo BuildAccessTokenInfo(string method, WebParamete parameters = new WebParameterCollection(); } - var uri = new Uri(AccessTokenUrl); - var timestamp = OAuthTools.GetTimestamp(); - var nonce = OAuthTools.GetNonce(); + Uri uri = new Uri(AccessTokenUrl); + string timestamp = OAuthTools.GetTimestamp(); + string nonce = OAuthTools.GetNonce(); AddAuthParameters(parameters, timestamp, nonce); - var signatureBase = OAuthTools.ConcatenateRequestElements(method, uri.ToString(), parameters); - var signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret, TokenSecret); - - var info = new OAuthWebQueryInfo - { - WebMethod = method, - ParameterHandling = ParameterHandling, - ConsumerKey = ConsumerKey, - Token = Token, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, - Signature = signature, - Timestamp = timestamp, - Nonce = nonce, - Version = Version ?? "1.0", - Verifier = Verifier, - Callback = CallbackUrl, - TokenSecret = TokenSecret, - ConsumerSecret = ConsumerSecret, - }; + string signatureBase = OAuthTools.ConcatenateRequestElements(method, uri.ToString(), parameters); + string signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret, TokenSecret); + + OAuthWebQueryInfo info = new OAuthWebQueryInfo + { + WebMethod = method, + ParameterHandling = ParameterHandling, + ConsumerKey = ConsumerKey, + Token = Token, + SignatureMethod = SignatureMethod.ToRequestValue(), + SignatureTreatment = SignatureTreatment, + Signature = signature, + Timestamp = timestamp, + Nonce = nonce, + Version = Version ?? "1.0", + Verifier = Verifier, + Callback = CallbackUrl, + TokenSecret = TokenSecret, + ConsumerSecret = ConsumerSecret, + }; return info; } @@ -183,32 +184,32 @@ public virtual OAuthWebQueryInfo BuildClientAuthAccessTokenInfo(string method, W parameters = new WebParameterCollection(); } - var uri = new Uri(AccessTokenUrl); - var timestamp = OAuthTools.GetTimestamp(); - var nonce = OAuthTools.GetNonce(); + Uri uri = new Uri(AccessTokenUrl); + string timestamp = OAuthTools.GetTimestamp(); + string nonce = OAuthTools.GetNonce(); AddXAuthParameters(parameters, timestamp, nonce); - var signatureBase = OAuthTools.ConcatenateRequestElements(method, uri.ToString(), parameters); - var signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret); - - var info = new OAuthWebQueryInfo - { - WebMethod = method, - ParameterHandling = ParameterHandling, - ClientMode = "client_auth", - ClientUsername = ClientUsername, - ClientPassword = ClientPassword, - ConsumerKey = ConsumerKey, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, - Signature = signature, - Timestamp = timestamp, - Nonce = nonce, - Version = Version ?? "1.0", - TokenSecret = TokenSecret, - ConsumerSecret = ConsumerSecret - }; + string signatureBase = OAuthTools.ConcatenateRequestElements(method, uri.ToString(), parameters); + string signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret); + + OAuthWebQueryInfo info = new OAuthWebQueryInfo + { + WebMethod = method, + ParameterHandling = ParameterHandling, + ClientMode = "client_auth", + ClientUsername = ClientUsername, + ClientPassword = ClientPassword, + ConsumerKey = ConsumerKey, + SignatureMethod = SignatureMethod.ToRequestValue(), + SignatureTreatment = SignatureTreatment, + Signature = signature, + Timestamp = timestamp, + Nonce = nonce, + Version = Version ?? "1.0", + TokenSecret = TokenSecret, + ConsumerSecret = ConsumerSecret + }; return info; } @@ -224,17 +225,17 @@ public virtual OAuthWebQueryInfo BuildProtectedResourceInfo(string method, WebPa } // Include url parameters in query pool - var uri = new Uri(url); + Uri uri = new Uri(url); #if !SILVERLIGHT && !WINDOWS_PHONE - var urlParameters = HttpUtility.ParseQueryString(uri.Query); + NameValueCollection urlParameters = HttpUtility.ParseQueryString(uri.Query); #else - var urlParameters = uri.Query.ParseQueryString(); + IDictionary urlParameters = uri.Query.ParseQueryString(); #endif #if !SILVERLIGHT && !WINDOWS_PHONE - foreach (var parameter in urlParameters.AllKeys) + foreach (string parameter in urlParameters.AllKeys) #else - foreach (var parameter in urlParameters.Keys) + foreach (string parameter in urlParameters.Keys) #endif { switch (method.ToUpperInvariant()) @@ -249,31 +250,31 @@ public virtual OAuthWebQueryInfo BuildProtectedResourceInfo(string method, WebPa } } - var timestamp = OAuthTools.GetTimestamp(); - var nonce = OAuthTools.GetNonce(); + string timestamp = OAuthTools.GetTimestamp(); + string nonce = OAuthTools.GetNonce(); AddAuthParameters(parameters, timestamp, nonce); - var signatureBase = OAuthTools.ConcatenateRequestElements(method, url, parameters); - var signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret, + string signatureBase = OAuthTools.ConcatenateRequestElements(method, url, parameters); + string signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret, TokenSecret); - var info = new OAuthWebQueryInfo - { - WebMethod = method, - ParameterHandling = ParameterHandling, - ConsumerKey = ConsumerKey, - Token = Token, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, - Signature = signature, - Timestamp = timestamp, - Nonce = nonce, - Version = Version ?? "1.0", - Callback = CallbackUrl, - ConsumerSecret = ConsumerSecret, - TokenSecret = TokenSecret - }; + OAuthWebQueryInfo info = new OAuthWebQueryInfo + { + WebMethod = method, + ParameterHandling = ParameterHandling, + ConsumerKey = ConsumerKey, + Token = Token, + SignatureMethod = SignatureMethod.ToRequestValue(), + SignatureTreatment = SignatureTreatment, + Signature = signature, + Timestamp = timestamp, + Nonce = nonce, + Version = Version ?? "1.0", + Callback = CallbackUrl, + ConsumerSecret = ConsumerSecret, + TokenSecret = TokenSecret + }; return info; } @@ -357,14 +358,14 @@ private void ValidateProtectedResourceState() private void AddAuthParameters(ICollection parameters, string timestamp, string nonce) { - var authParameters = new WebParameterCollection - { - new WebPair("oauth_consumer_key", ConsumerKey), - new WebPair("oauth_nonce", nonce), - new WebPair("oauth_signature_method", SignatureMethod.ToRequestValue()), - new WebPair("oauth_timestamp", timestamp), - new WebPair("oauth_version", Version ?? "1.0") - }; + WebParameterCollection authParameters = new WebParameterCollection + { + new WebPair("oauth_consumer_key", ConsumerKey), + new WebPair("oauth_nonce", nonce), + new WebPair("oauth_signature_method", SignatureMethod.ToRequestValue()), + new WebPair("oauth_timestamp", timestamp), + new WebPair("oauth_version", Version ?? "1.0") + }; if (!Token.IsNullOrBlank()) { @@ -386,7 +387,7 @@ private void AddAuthParameters(ICollection parameters, string timestamp authParameters.Add(new WebPair("oauth_session_handle", SessionHandle)); } - foreach (var authParameter in authParameters) + foreach (WebPair authParameter in authParameters) { parameters.Add(authParameter); } @@ -394,19 +395,19 @@ private void AddAuthParameters(ICollection parameters, string timestamp private void AddXAuthParameters(ICollection parameters, string timestamp, string nonce) { - var authParameters = new WebParameterCollection - { - new WebPair("x_auth_username", ClientUsername), - new WebPair("x_auth_password", ClientPassword), - new WebPair("x_auth_mode", "client_auth"), - new WebPair("oauth_consumer_key", ConsumerKey), - new WebPair("oauth_signature_method", SignatureMethod.ToRequestValue()), - new WebPair("oauth_timestamp", timestamp), - new WebPair("oauth_nonce", nonce), - new WebPair("oauth_version", Version ?? "1.0") - }; - - foreach (var authParameter in authParameters) + WebParameterCollection authParameters = new WebParameterCollection + { + new WebPair("x_auth_username", ClientUsername), + new WebPair("x_auth_password", ClientPassword), + new WebPair("x_auth_mode", "client_auth"), + new WebPair("oauth_consumer_key", ConsumerKey), + new WebPair("oauth_signature_method", SignatureMethod.ToRequestValue()), + new WebPair("oauth_timestamp", timestamp), + new WebPair("oauth_nonce", nonce), + new WebPair("oauth_version", Version ?? "1.0") + }; + + foreach (WebPair authParameter in authParameters) { parameters.Add(authParameter); } diff --git a/RestSharp/Authenticators/OAuth/WebPair.cs b/RestSharp/Authenticators/OAuth/WebPair.cs index 3ba6480d5..63b490dec 100644 --- a/RestSharp/Authenticators/OAuth/WebPair.cs +++ b/RestSharp/Authenticators/OAuth/WebPair.cs @@ -1,4 +1,5 @@ -namespace RestSharp.Authenticators.OAuth + +namespace RestSharp.Authenticators.OAuth { internal class WebPair { diff --git a/RestSharp/Authenticators/OAuth/WebPairCollection.cs b/RestSharp/Authenticators/OAuth/WebPairCollection.cs index cbd9e6342..89bda9714 100644 --- a/RestSharp/Authenticators/OAuth/WebPairCollection.cs +++ b/RestSharp/Authenticators/OAuth/WebPairCollection.cs @@ -86,7 +86,7 @@ public virtual void AddRange(IEnumerable collection) public virtual void Sort(Comparison comparison) { - var sorted = new List(this.parameters); + List sorted = new List(this.parameters); sorted.Sort(comparison); @@ -95,15 +95,15 @@ public virtual void Sort(Comparison comparison) public virtual bool RemoveAll(IEnumerable parametersToRemove) { - var array = parametersToRemove.ToArray(); - var success = array.Aggregate(true, (current, parameter) => current & this.parameters.Remove(parameter)); + WebPair[] array = parametersToRemove.ToArray(); + bool success = array.Aggregate(true, (current, parameter) => current & this.parameters.Remove(parameter)); return success && array.Length > 0; } public virtual void Add(string name, string value) { - var pair = new WebPair(name, value); + WebPair pair = new WebPair(name, value); this.parameters.Add(pair); } diff --git a/RestSharp/Authenticators/OAuth/WebParameterCollection.cs b/RestSharp/Authenticators/OAuth/WebParameterCollection.cs index e4b1f8392..373a991e7 100644 --- a/RestSharp/Authenticators/OAuth/WebParameterCollection.cs +++ b/RestSharp/Authenticators/OAuth/WebParameterCollection.cs @@ -22,7 +22,7 @@ public WebParameterCollection(IDictionary collection) public override void Add(string name, string value) { - var parameter = new WebParameter(name, value); + WebParameter parameter = new WebParameter(name, value); base.Add(parameter); } diff --git a/RestSharp/Authenticators/OAuth1Authenticator.cs b/RestSharp/Authenticators/OAuth1Authenticator.cs index 4b015cd02..795093ec3 100644 --- a/RestSharp/Authenticators/OAuth1Authenticator.cs +++ b/RestSharp/Authenticators/OAuth1Authenticator.cs @@ -15,6 +15,7 @@ #endregion using System; +using System.Collections.Generic; using System.Linq; using System.Text; using RestSharp.Authenticators.OAuth; @@ -71,22 +72,22 @@ public class OAuth1Authenticator : IAuthenticator public static OAuth1Authenticator ForRequestToken(string consumerKey, string consumerSecret) { - var authenticator = new OAuth1Authenticator - { - ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, - SignatureMethod = OAuthSignatureMethod.HmacSha1, - SignatureTreatment = OAuthSignatureTreatment.Escaped, - ConsumerKey = consumerKey, - ConsumerSecret = consumerSecret, - Type = OAuthType.RequestToken - }; + OAuth1Authenticator authenticator = new OAuth1Authenticator + { + ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, + SignatureMethod = OAuthSignatureMethod.HmacSha1, + SignatureTreatment = OAuthSignatureTreatment.Escaped, + ConsumerKey = consumerKey, + ConsumerSecret = consumerSecret, + Type = OAuthType.RequestToken + }; return authenticator; } public static OAuth1Authenticator ForRequestToken(string consumerKey, string consumerSecret, string callbackUrl) { - var authenticator = ForRequestToken(consumerKey, consumerSecret); + OAuth1Authenticator authenticator = ForRequestToken(consumerKey, consumerSecret); authenticator.CallbackUrl = callbackUrl; @@ -96,17 +97,17 @@ public static OAuth1Authenticator ForRequestToken(string consumerKey, string con public static OAuth1Authenticator ForAccessToken(string consumerKey, string consumerSecret, string token, string tokenSecret) { - var authenticator = new OAuth1Authenticator - { - ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, - SignatureMethod = OAuthSignatureMethod.HmacSha1, - SignatureTreatment = OAuthSignatureTreatment.Escaped, - ConsumerKey = consumerKey, - ConsumerSecret = consumerSecret, - Token = token, - TokenSecret = tokenSecret, - Type = OAuthType.AccessToken - }; + OAuth1Authenticator authenticator = new OAuth1Authenticator + { + ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, + SignatureMethod = OAuthSignatureMethod.HmacSha1, + SignatureTreatment = OAuthSignatureTreatment.Escaped, + ConsumerKey = consumerKey, + ConsumerSecret = consumerSecret, + Token = token, + TokenSecret = tokenSecret, + Type = OAuthType.AccessToken + }; return authenticator; } @@ -114,7 +115,7 @@ public static OAuth1Authenticator ForAccessToken(string consumerKey, string cons public static OAuth1Authenticator ForAccessToken(string consumerKey, string consumerSecret, string token, string tokenSecret, string verifier) { - var authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret); + OAuth1Authenticator authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret); authenticator.Verifier = verifier; @@ -124,7 +125,7 @@ public static OAuth1Authenticator ForAccessToken(string consumerKey, string cons public static OAuth1Authenticator ForAccessTokenRefresh(string consumerKey, string consumerSecret, string token, string tokenSecret, string sessionHandle) { - var authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret); + OAuth1Authenticator authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret); authenticator.SessionHandle = sessionHandle; @@ -134,7 +135,7 @@ public static OAuth1Authenticator ForAccessTokenRefresh(string consumerKey, stri public static OAuth1Authenticator ForAccessTokenRefresh(string consumerKey, string consumerSecret, string token, string tokenSecret, string verifier, string sessionHandle) { - var authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret); + OAuth1Authenticator authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret); authenticator.SessionHandle = sessionHandle; authenticator.Verifier = verifier; @@ -145,17 +146,17 @@ public static OAuth1Authenticator ForAccessTokenRefresh(string consumerKey, stri public static OAuth1Authenticator ForClientAuthentication(string consumerKey, string consumerSecret, string username, string password) { - var authenticator = new OAuth1Authenticator - { - ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, - SignatureMethod = OAuthSignatureMethod.HmacSha1, - SignatureTreatment = OAuthSignatureTreatment.Escaped, - ConsumerKey = consumerKey, - ConsumerSecret = consumerSecret, - ClientUsername = username, - ClientPassword = password, - Type = OAuthType.ClientAuthentication - }; + OAuth1Authenticator authenticator = new OAuth1Authenticator + { + ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, + SignatureMethod = OAuthSignatureMethod.HmacSha1, + SignatureTreatment = OAuthSignatureTreatment.Escaped, + ConsumerKey = consumerKey, + ConsumerSecret = consumerSecret, + ClientUsername = username, + ClientPassword = password, + Type = OAuthType.ClientAuthentication + }; return authenticator; } @@ -163,54 +164,54 @@ public static OAuth1Authenticator ForClientAuthentication(string consumerKey, st public static OAuth1Authenticator ForProtectedResource(string consumerKey, string consumerSecret, string accessToken, string accessTokenSecret) { - var authenticator = new OAuth1Authenticator - { - Type = OAuthType.ProtectedResource, - ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, - SignatureMethod = OAuthSignatureMethod.HmacSha1, - SignatureTreatment = OAuthSignatureTreatment.Escaped, - ConsumerKey = consumerKey, - ConsumerSecret = consumerSecret, - Token = accessToken, - TokenSecret = accessTokenSecret - }; + OAuth1Authenticator authenticator = new OAuth1Authenticator + { + Type = OAuthType.ProtectedResource, + ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, + SignatureMethod = OAuthSignatureMethod.HmacSha1, + SignatureTreatment = OAuthSignatureTreatment.Escaped, + ConsumerKey = consumerKey, + ConsumerSecret = consumerSecret, + Token = accessToken, + TokenSecret = accessTokenSecret + }; return authenticator; } public void Authenticate(IRestClient client, IRestRequest request) { - var workflow = new OAuthWorkflow - { - ConsumerKey = ConsumerKey, - ConsumerSecret = ConsumerSecret, - ParameterHandling = ParameterHandling, - SignatureMethod = SignatureMethod, - SignatureTreatment = SignatureTreatment, - Verifier = Verifier, - Version = Version, - CallbackUrl = CallbackUrl, - SessionHandle = SessionHandle, - Token = Token, - TokenSecret = TokenSecret, - ClientUsername = ClientUsername, - ClientPassword = ClientPassword - }; + OAuthWorkflow workflow = new OAuthWorkflow + { + ConsumerKey = ConsumerKey, + ConsumerSecret = ConsumerSecret, + ParameterHandling = ParameterHandling, + SignatureMethod = SignatureMethod, + SignatureTreatment = SignatureTreatment, + Verifier = Verifier, + Version = Version, + CallbackUrl = CallbackUrl, + SessionHandle = SessionHandle, + Token = Token, + TokenSecret = TokenSecret, + ClientUsername = ClientUsername, + ClientPassword = ClientPassword + }; AddOAuthData(client, request, workflow); } private void AddOAuthData(IRestClient client, IRestRequest request, OAuthWorkflow workflow) { - var url = client.BuildUri(request).ToString(); - var queryStringStart = url.IndexOf('?'); + string url = client.BuildUri(request).ToString(); + int queryStringStart = url.IndexOf('?'); if (queryStringStart != -1) url = url.Substring(0, queryStringStart); OAuthWebQueryInfo oauth; - var method = request.Method.ToString().ToUpperInvariant(); - var parameters = new WebParameterCollection(); + string method = request.Method.ToString().ToUpperInvariant(); + WebParameterCollection parameters = new WebParameterCollection(); // include all GET and POST parameters before generating the signature // according to the RFC 5849 - The OAuth 1.0 Protocol @@ -298,7 +299,7 @@ private void AddOAuthData(IRestClient client, IRestRequest request, OAuthWorkflo private string GetAuthorizationHeader(WebPairCollection parameters) { - var sb = new StringBuilder("OAuth "); + StringBuilder sb = new StringBuilder("OAuth "); if (!Realm.IsNullOrBlank()) { @@ -307,23 +308,23 @@ private string GetAuthorizationHeader(WebPairCollection parameters) parameters.Sort((l, r) => l.Name.CompareTo(r.Name)); - var parameterCount = 0; - var oathParameters = + int parameterCount = 0; + List oathParameters = parameters.Where(p => !p.Name.IsNullOrBlank() && !p.Value.IsNullOrBlank() && (p.Name.StartsWith("oauth_") || p.Name.StartsWith("x_auth_"))) .ToList(); - foreach (var parameter in oathParameters) + foreach (WebPair parameter in oathParameters) { parameterCount++; - var format = parameterCount < oathParameters.Count ? "{0}=\"{1}\"," : "{0}=\"{1}\""; + string format = parameterCount < oathParameters.Count ? "{0}=\"{1}\"," : "{0}=\"{1}\""; sb.Append(format.FormatWith(parameter.Name, parameter.Value)); } - var authorization = sb.ToString(); + string authorization = sb.ToString(); return authorization; } diff --git a/RestSharp/Compression/ZLib/Crc32.cs b/RestSharp/Compression/ZLib/Crc32.cs index 1cd559229..4fc7754c8 100644 --- a/RestSharp/Compression/ZLib/Crc32.cs +++ b/RestSharp/Compression/ZLib/Crc32.cs @@ -65,7 +65,7 @@ static Crc32() for (uint i = 0; i < 256; i++) { - var dwCrc = i; + uint dwCrc = i; for (uint j = 8; j > 0; j--) { diff --git a/RestSharp/Compression/ZLib/GZipStream.cs b/RestSharp/Compression/ZLib/GZipStream.cs index e507b2528..a2501f0e9 100644 --- a/RestSharp/Compression/ZLib/GZipStream.cs +++ b/RestSharp/Compression/ZLib/GZipStream.cs @@ -273,7 +273,7 @@ public string FileName /// A tuning knob to trade speed for effectiveness. public GZipStream(Stream stream) { - BaseStream = new ZlibBaseStream(stream, ZlibStreamFlavor.GZIP, false); + BaseStream = new ZlibBaseStream(stream, ZlibStreamFlavor.Gzip, false); } #region Zlib properties @@ -283,13 +283,13 @@ public GZipStream(Stream stream) /// virtual public FlushType FlushMode { - get { return (BaseStream.flushMode); } + get { return (BaseStream.FlushMode); } set { if (disposed) throw new ObjectDisposedException("GZipStream"); - BaseStream.flushMode = value; + BaseStream.FlushMode = value; } } @@ -311,7 +311,7 @@ virtual public FlushType FlushMode /// public int BufferSize { - get { return BaseStream.bufferSize; } + get { return BaseStream.BufferSize; } set { if (disposed) @@ -323,7 +323,7 @@ public int BufferSize if (value < ZlibConstants.WORKING_BUFFER_SIZE_MIN) throw new ZlibException(string.Format("Don't be silly. {0} bytes?? Use a bigger buffer.", value)); - BaseStream.bufferSize = value; + BaseStream.BufferSize = value; } } @@ -384,7 +384,7 @@ public override bool CanRead if (disposed) throw new ObjectDisposedException("GZipStream"); - return BaseStream.stream.CanRead; + return BaseStream.Stream.CanRead; } } @@ -412,7 +412,7 @@ public override bool CanWrite if (disposed) throw new ObjectDisposedException("GZipStream"); - return BaseStream.stream.CanWrite; + return BaseStream.Stream.CanWrite; } } @@ -530,77 +530,77 @@ public override void SetLength(long value) internal static DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); internal static Encoding Iso8859Dash1 = Encoding.GetEncoding("iso-8859-1"); - private int EmitHeader() - { - byte[] commentBytes = (Comment == null) ? null : Iso8859Dash1.GetBytes(Comment); - byte[] filenameBytes = (FileName == null) ? null : Iso8859Dash1.GetBytes(FileName); + //private int EmitHeader() + //{ + // byte[] commentBytes = (Comment == null) ? null : Iso8859Dash1.GetBytes(Comment); + // byte[] filenameBytes = (FileName == null) ? null : Iso8859Dash1.GetBytes(FileName); - int cbLength = (Comment == null) ? 0 : commentBytes.Length + 1; - int fnLength = (FileName == null) ? 0 : filenameBytes.Length + 1; + // int cbLength = (Comment == null) ? 0 : commentBytes.Length + 1; + // int fnLength = (FileName == null) ? 0 : filenameBytes.Length + 1; - int bufferLength = 10 + cbLength + fnLength; - byte[] header = new byte[bufferLength]; - int i = 0; + // int bufferLength = 10 + cbLength + fnLength; + // byte[] header = new byte[bufferLength]; + // int i = 0; - // ID - header[i++] = 0x1F; - header[i++] = 0x8B; + // // ID + // header[i++] = 0x1F; + // header[i++] = 0x8B; - // compression method - header[i++] = 8; + // // compression method + // header[i++] = 8; - byte flag = 0; + // byte flag = 0; - if (Comment != null) - flag ^= 0x10; + // if (Comment != null) + // flag ^= 0x10; - if (FileName != null) - flag ^= 0x8; + // if (FileName != null) + // flag ^= 0x8; - // flag - header[i++] = flag; + // // flag + // header[i++] = flag; - // mtime - if (!LastModified.HasValue) - LastModified = DateTime.Now; + // // mtime + // if (!LastModified.HasValue) + // LastModified = DateTime.Now; - TimeSpan delta = LastModified.Value - UnixEpoch; - int timet = (int) delta.TotalSeconds; - Array.Copy(BitConverter.GetBytes(timet), 0, header, i, 4); + // TimeSpan delta = LastModified.Value - UnixEpoch; + // int timet = (int) delta.TotalSeconds; + // Array.Copy(BitConverter.GetBytes(timet), 0, header, i, 4); - i += 4; + // i += 4; - // xflg - header[i++] = 0; // this field is totally useless - // OS - header[i++] = 0xFF; // 0xFF == unspecified + // // xflg + // header[i++] = 0; // this field is totally useless + // // OS + // header[i++] = 0xFF; // 0xFF == unspecified - // extra field length - only if FEXTRA is set, which it is not. - //header[i++]= 0; - //header[i++]= 0; + // // extra field length - only if FEXTRA is set, which it is not. + // //header[i++]= 0; + // //header[i++]= 0; - // filename - if (fnLength != 0) - { - Array.Copy(filenameBytes, 0, header, i, fnLength - 1); + // // filename + // if (fnLength != 0) + // { + // Array.Copy(filenameBytes, 0, header, i, fnLength - 1); - i += fnLength - 1; - header[i++] = 0; // terminate - } + // i += fnLength - 1; + // header[i++] = 0; // terminate + // } - // comment - if (cbLength != 0) - { - Array.Copy(commentBytes, 0, header, i, cbLength - 1); + // // comment + // if (cbLength != 0) + // { + // Array.Copy(commentBytes, 0, header, i, cbLength - 1); - i += cbLength - 1; - header[i++] = 0; // terminate - } + // i += cbLength - 1; + // header[i++] = 0; // terminate + // } - BaseStream.stream.Write(header, 0, header.Length); + // BaseStream.stream.Write(header, 0, header.Length); - return header.Length; // bytes written - } + // return header.Length; // bytes written + //} public override void Write(byte[] buffer, int offset, int count) { diff --git a/RestSharp/Compression/ZLib/InfTree.cs b/RestSharp/Compression/ZLib/InfTree.cs index 8d1e1af09..0d0881610 100644 --- a/RestSharp/Compression/ZLib/InfTree.cs +++ b/RestSharp/Compression/ZLib/InfTree.cs @@ -70,21 +70,21 @@ sealed internal class InfTree { private const int MANY = 1440; private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = -1; - private const int Z_STREAM_ERROR = -2; + //private const int Z_STREAM_END = 1; + //private const int Z_NEED_DICT = 2; + //private const int Z_ERRNO = -1; + //private const int Z_STREAM_ERROR = -2; private const int Z_DATA_ERROR = -3; private const int Z_MEM_ERROR = -4; private const int Z_BUF_ERROR = -5; - private const int Z_VERSION_ERROR = -6; + //private const int Z_VERSION_ERROR = -6; - internal const int fixed_bl = 9; - internal const int fixed_bd = 5; + internal const int FIXED_BL = 9; + internal const int FIXED_BD = 5; // UPGRADE_NOTE: Final was removed from the declaration of 'fixed_tl'. // "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] fixed_tl = + internal static readonly int[] FixedTl = { 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 192, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 160, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 224, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 144, 83, 7, 59, @@ -138,8 +138,9 @@ sealed internal class InfTree 0, 8, 143, 0, 8, 79, 0, 9, 255 }; - //UPGRADE_NOTE: Final was removed from the declaration of 'fixed_td'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] fixed_td = + // UPGRADE_NOTE: Final was removed from the declaration of 'fixed_td'. + // "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] FixedTd = { 80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5, 4097, 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385, 80, 5, 3, 88, 5, 513, 84, 5, 33, 92, 5, 8193, 82, 5, 9, 90, 5, 2049, 86, 5, 129, 192, 5, 24577, 80, 5, 2, 87, 5, 385, 83, 5, 25, @@ -148,29 +149,33 @@ sealed internal class InfTree }; // Tables for deflate from PKZIP's appnote.txt. - //UPGRADE_NOTE: Final was removed from the declaration of 'cplens'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cplens = + // UPGRADE_NOTE: Final was removed from the declaration of 'cplens'. + // "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] Cplens = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 }; // see note #13 above about 258 - //UPGRADE_NOTE: Final was removed from the declaration of 'cplext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cplext = + // UPGRADE_NOTE: Final was removed from the declaration of 'cplext'. + // "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] Cplext = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112 }; - //UPGRADE_NOTE: Final was removed from the declaration of 'cpdist'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cpdist = + // UPGRADE_NOTE: Final was removed from the declaration of 'cpdist'. + // "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] Cpdist = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 }; - //UPGRADE_NOTE: Final was removed from the declaration of 'cpdext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cpdext = + // UPGRADE_NOTE: Final was removed from the declaration of 'cpdext'. + // "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] Cpdext = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 }; @@ -178,12 +183,12 @@ sealed internal class InfTree // If BMAX needs to be larger than 16, then h and x[] should be uLong. internal const int BMAX = 15; // maximum bit length of any code - internal int[] hn = null; // hufts used in space - internal int[] v = null; // work area for huft_build - internal int[] c = null; // bit length count table - internal int[] r = null; // table entry for structure assignment - internal int[] u = null; // table stack - internal int[] x = null; // bit offsets, then code stack + internal int[] Hn; // hufts used in space + internal int[] V; // work area for huft_build + internal int[] C; // bit length count table + internal int[] R; // table entry for structure assignment + internal int[] U; // table stack + internal int[] X; // bit offsets, then code stack private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[] t, int[] m, int[] hp, int[] hn, int[] v) { @@ -213,11 +218,11 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ do { - c[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX + this.C[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX } while (i != 0); - if (c[0] == n) + if (this.C[0] == n) { // null input--all zero length codes t[0] = -1; @@ -231,7 +236,7 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ for (j = 1; j <= BMAX; j++) { - if (c[j] != 0) + if (this.C[j] != 0) break; } @@ -244,7 +249,7 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ for (i = BMAX; i != 0; i--) { - if (c[i] != 0) + if (this.C[i] != 0) break; } @@ -260,28 +265,28 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ // Adjust last length count to fill out codes, if needed for (y = 1 << j; j < i; j++, y <<= 1) { - if ((y -= c[j]) < 0) + if ((y -= this.C[j]) < 0) { return Z_DATA_ERROR; } } - if ((y -= c[i]) < 0) + if ((y -= this.C[i]) < 0) { return Z_DATA_ERROR; } - c[i] += y; + this.C[i] += y; // Generate starting offsets into the value table for each length - x[1] = j = 0; + this.X[1] = j = 0; p = 1; xp = 2; while (--i != 0) { // note that i == g from above - x[xp] = (j += c[p]); + this.X[xp] = (j += this.C[p]); xp++; p++; } @@ -294,27 +299,27 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ { if ((j = b[bindex + p]) != 0) { - v[x[j]++] = i; + v[this.X[j]++] = i; } p++; } while (++i < n); - n = x[g]; // set n to length of v + n = this.X[g]; // set n to length of v // Generate the Huffman codes and for each, make the table entries - x[0] = i = 0; // first Huffman code is zero + this.X[0] = i = 0; // first Huffman code is zero p = 0; // grab values in bit order h = -1; // no tables yet--level -1 w = -l; // bits decoded == (l * h) - u[0] = 0; // just to keep compilers happy + this.U[0] = 0; // just to keep compilers happy q = 0; // ditto z = 0; // ditto // go through the bit lengths (k already is bits in shortest code) for (; k <= g; k++) { - int a = c[k]; // counter for codes of length k + int a = this.C[k]; // counter for codes of length k while (a-- != 0) { @@ -342,10 +347,10 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ while (++j < z) { // try smaller tables up to z bits - if ((f <<= 1) <= c[++xp]) + if ((f <<= 1) <= this.C[++xp]) break; // enough codes to use up j bits - f -= c[xp]; // else deduct codes from patterns + f -= this.C[xp]; // else deduct codes from patterns } } } @@ -359,18 +364,18 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ return Z_DATA_ERROR; // overflow of MANY } - u[h] = q = hn[0]; // DEBUG + this.U[h] = q = hn[0]; // DEBUG hn[0] += z; // connect to last table, if there is one if (h != 0) { - x[h] = i; // save pattern for backing up - r[0] = (sbyte)j; // bits in this table - r[1] = (sbyte)l; // bits to dump before this table - j = SharedUtils.URShift(i, (w - l)); - r[2] = q - u[h - 1] - j; // offset to this table - Array.Copy(r, 0, hp, (u[h - 1] + j) * 3, 3); // connect to last table + this.X[h] = i; // save pattern for backing up + this.R[0] = (sbyte)j; // bits in this table + this.R[1] = (sbyte)l; // bits to dump before this table + j = SharedUtils.UrShift(i, (w - l)); + this.R[2] = q - this.U[h - 1] - j; // offset to this table + Array.Copy(this.R, 0, hp, (this.U[h - 1] + j) * 3, 3); // connect to last table } else { @@ -379,33 +384,33 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ } // set up table entry in r - r[1] = (sbyte)(k - w); + this.R[1] = (sbyte)(k - w); if (p >= n) { - r[0] = 128 + 64; // out of values--invalid code + this.R[0] = 128 + 64; // out of values--invalid code } else if (v[p] < s) { - r[0] = (sbyte)(v[p] < 256 ? 0 : 32 + 64); // 256 is end-of-block - r[2] = v[p++]; // simple code is just the value + this.R[0] = (sbyte)(v[p] < 256 ? 0 : 32 + 64); // 256 is end-of-block + this.R[2] = v[p++]; // simple code is just the value } else { - r[0] = (sbyte)(e[v[p] - s] + 16 + 64); // non-simple--look up in lists - r[2] = d[v[p++] - s]; + this.R[0] = (sbyte)(e[v[p] - s] + 16 + 64); // non-simple--look up in lists + this.R[2] = d[v[p++] - s]; } // fill code-like entries with r f = 1 << (k - w); - for (j = SharedUtils.URShift(i, w); j < z; j += f) + for (j = SharedUtils.UrShift(i, w); j < z; j += f) { - Array.Copy(r, 0, hp, (q + j) * 3, 3); + Array.Copy(this.R, 0, hp, (q + j) * 3, 3); } // backwards increment the k-bit code i - for (j = 1 << (k - 1); (i & j) != 0; j = SharedUtils.URShift(j, 1)) + for (j = 1 << (k - 1); (i & j) != 0; j = SharedUtils.UrShift(j, 1)) { i ^= j; } @@ -415,7 +420,7 @@ private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[ // backup over finished tables int mask = (1 << w) - 1; // (1 << w) - 1, to avoid cc -O bug on HP - while ((i & mask) != x[h]) + while ((i & mask) != this.X[h]) { h--; // don't need to update q w -= l; @@ -432,9 +437,9 @@ internal int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZlibCodec { int result; - initWorkArea(19); - hn[0] = 0; - result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v); + this.InitWorkArea(19); + this.Hn[0] = 0; + result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, this.Hn, this.V); if (result == Z_DATA_ERROR) { @@ -454,9 +459,9 @@ internal int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, int result; // build literal/length tree - initWorkArea(288); - hn[0] = 0; - result = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v); + this.InitWorkArea(288); + this.Hn[0] = 0; + result = huft_build(c, 0, nl, 257, Cplens, Cplext, tl, bl, hp, this.Hn, this.V); if (result != Z_OK || bl[0] == 0) { @@ -474,8 +479,8 @@ internal int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, } // build distance tree - initWorkArea(288); - result = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v); + this.InitWorkArea(288); + result = huft_build(c, nl, nd, 0, Cpdist, Cpdext, td, bd, hp, this.Hn, this.V); if (result != Z_OK || (bd[0] == 0 && nl > 257)) { @@ -502,50 +507,50 @@ internal int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, internal static int inflate_trees_fixed(int[] bl, int[] bd, int[][] tl, int[][] td, ZlibCodec z) { - bl[0] = fixed_bl; - bd[0] = fixed_bd; - tl[0] = fixed_tl; - td[0] = fixed_td; + bl[0] = FIXED_BL; + bd[0] = FIXED_BD; + tl[0] = FixedTl; + td[0] = FixedTd; return Z_OK; } - private void initWorkArea(int vsize) + private void InitWorkArea(int vsize) { - if (hn == null) + if (this.Hn == null) { - hn = new int[1]; - v = new int[vsize]; - c = new int[BMAX + 1]; - r = new int[3]; - u = new int[BMAX]; - x = new int[BMAX + 1]; + this.Hn = new int[1]; + this.V = new int[vsize]; + this.C = new int[BMAX + 1]; + this.R = new int[3]; + this.U = new int[BMAX]; + this.X = new int[BMAX + 1]; } - if (v.Length < vsize) + if (this.V.Length < vsize) { - v = new int[vsize]; + this.V = new int[vsize]; } for (int i = 0; i < vsize; i++) { - v[i] = 0; + this.V[i] = 0; } for (int i = 0; i < BMAX + 1; i++) { - c[i] = 0; + this.C[i] = 0; } for (int i = 0; i < 3; i++) { - r[i] = 0; + this.R[i] = 0; } // for(int i=0; i n) t = n; @@ -359,16 +359,16 @@ internal int Process(int r) if (t > m) t = m; - Array.Copy(codec.InputBuffer, p, window, q, t); + Array.Copy(this.Codec.InputBuffer, p, this.Window, q, t); p += t; n -= t; q += t; m -= t; - if ((left -= t) != 0) + if ((this.Left -= t) != 0) break; - mode = last != 0 ? DRY : TYPE; + this.Mode = this.Last != 0 ? DRY : TYPE; break; case TABLE: @@ -380,63 +380,63 @@ internal int Process(int r) } else { - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); } n--; - b |= (codec.InputBuffer[p++] & 0xff) << k; + b |= (this.Codec.InputBuffer[p++] & 0xff) << k; k += 8; } - table = t = (b & 0x3fff); + this.Table = t = (b & 0x3fff); if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) { - mode = BAD; - codec.Message = "too many length or distance symbols"; + this.Mode = BAD; + this.Codec.Message = "too many length or distance symbols"; r = ZlibConstants.Z_DATA_ERROR; - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); } t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); - if (blens == null || blens.Length < t) + if (this.Blens == null || this.Blens.Length < t) { - blens = new int[t]; + this.Blens = new int[t]; } else { for (int i = 0; i < t; i++) { - blens[i] = 0; + this.Blens[i] = 0; } } { - b = SharedUtils.URShift(b, (14)); + b = SharedUtils.UrShift(b, (14)); k -= (14); } - index = 0; - mode = BTREE; + this.Index = 0; + this.Mode = BTREE; goto case BTREE; case BTREE: - while (index < 4 + (SharedUtils.URShift(table, 10))) + while (this.Index < 4 + (SharedUtils.UrShift(this.Table, 10))) { while (k < (3)) { @@ -446,36 +446,36 @@ internal int Process(int r) } else { - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); } n--; - b |= (codec.InputBuffer[p++] & 0xff) << k; + b |= (this.Codec.InputBuffer[p++] & 0xff) << k; k += 8; } - blens[Border[index++]] = b & 7; + this.Blens[Border[this.Index++]] = b & 7; { - b = SharedUtils.URShift(b, (3)); + b = SharedUtils.UrShift(b, (3)); k -= (3); } } - while (index < 19) + while (this.Index < 19) { - blens[Border[index++]] = 0; + this.Blens[Border[this.Index++]] = 0; } - bb[0] = 7; - t = inftree.inflate_trees_bits(blens, bb, tb, hufts, codec); + this.Bb[0] = 7; + t = this.Inftree.inflate_trees_bits(this.Blens, this.Bb, this.Tb, this.Hufts, this.Codec); if (t != ZlibConstants.Z_OK) { @@ -483,37 +483,37 @@ internal int Process(int r) if (r == ZlibConstants.Z_DATA_ERROR) { - blens = null; - mode = BAD; + this.Blens = null; + this.Mode = BAD; } - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); } - index = 0; - mode = DTREE; + this.Index = 0; + this.Mode = DTREE; goto case DTREE; case DTREE: while (true) { - t = table; + t = this.Table; - if (!(index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))) + if (!(this.Index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))) { break; } int c; - t = bb[0]; + t = this.Bb[0]; while (k < (t)) { @@ -523,34 +523,34 @@ internal int Process(int r) } else { - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); } n--; - b |= (codec.InputBuffer[p++] & 0xff) << k; + b |= (this.Codec.InputBuffer[p++] & 0xff) << k; k += 8; } - if (tb[0] == -1) + if (this.Tb[0] == -1) { //System.err.println("null..."); } - t = hufts[(tb[0] + (b & inflateMask[t])) * 3 + 1]; - c = hufts[(tb[0] + (b & inflateMask[t])) * 3 + 2]; + t = this.Hufts[(this.Tb[0] + (b & inflateMask[t])) * 3 + 1]; + c = this.Hufts[(this.Tb[0] + (b & inflateMask[t])) * 3 + 2]; if (c < 16) { - b = SharedUtils.URShift(b, (t)); + b = SharedUtils.UrShift(b, (t)); k -= (t); - blens[index++] = c; + this.Blens[this.Index++] = c; } else { @@ -566,175 +566,175 @@ internal int Process(int r) } else { - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); } n--; - b |= (codec.InputBuffer[p++] & 0xff) << k; + b |= (this.Codec.InputBuffer[p++] & 0xff) << k; k += 8; } - b = SharedUtils.URShift(b, (t)); + b = SharedUtils.UrShift(b, (t)); k -= (t); j += (b & inflateMask[i]); - b = SharedUtils.URShift(b, (i)); + b = SharedUtils.UrShift(b, (i)); k -= (i); - i = index; - t = table; + i = this.Index; + t = this.Table; if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) { - blens = null; - mode = BAD; - codec.Message = "invalid bit length repeat"; + this.Blens = null; + this.Mode = BAD; + this.Codec.Message = "invalid bit length repeat"; r = ZlibConstants.Z_DATA_ERROR; - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); } - c = c == 16 ? blens[i - 1] : 0; + c = c == 16 ? this.Blens[i - 1] : 0; do { - blens[i++] = c; + this.Blens[i++] = c; } while (--j != 0); - index = i; + this.Index = i; } } - tb[0] = -1; + this.Tb[0] = -1; { int[] bl = { 9 }; // must be <= 9 for lookahead assumptions int[] bd = { 6 }; // must be <= 9 for lookahead assumptions int[] tl = new int[1]; int[] td = new int[1]; - t = table; - t = inftree.inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), blens, bl, bd, tl, td, hufts, codec); + t = this.Table; + t = this.Inftree.inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), this.Blens, bl, bd, tl, td, this.Hufts, this.Codec); if (t != ZlibConstants.Z_OK) { if (t == ZlibConstants.Z_DATA_ERROR) { - blens = null; - mode = BAD; + this.Blens = null; + this.Mode = BAD; } r = t; - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); } - codes.Init(bl[0], bd[0], hufts, tl[0], hufts, td[0]); + this.Codes.Init(bl[0], bd[0], this.Hufts, tl[0], this.Hufts, td[0]); } - mode = CODES; + this.Mode = CODES; goto case CODES; case CODES: - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; - - if ((r = codes.Process(this, r)) != ZlibConstants.Z_STREAM_END) + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; + + if ((r = this.Codes.Process(this, r)) != ZlibConstants.Z_STREAM_END) return Flush(r); r = ZlibConstants.Z_OK; - p = codec.NextIn; - n = codec.AvailableBytesIn; - b = bitb; - k = bitk; - q = write; - m = q < this.read ? this.read - q - 1 : this.end - q; - - if (last == 0) + p = this.Codec.NextIn; + n = this.Codec.AvailableBytesIn; + b = this.Bitb; + k = this.Bitk; + q = this.Write; + m = q < this.Read ? this.Read - q - 1 : this.End - q; + + if (this.Last == 0) { - mode = TYPE; + this.Mode = TYPE; break; } - mode = DRY; + this.Mode = DRY; goto case DRY; case DRY: - write = q; + this.Write = q; r = Flush(r); - q = write; + q = this.Write; - m = q < this.read ? this.read - q - 1 : this.end - q; + //m = q < this.Read ? this.Read - q - 1 : this.End - q; - if (read != write) + if (this.Read != this.Write) { - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); } - mode = DONE; + this.Mode = DONE; goto case DONE; case DONE: r = ZlibConstants.Z_STREAM_END; - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); case BAD: r = ZlibConstants.Z_DATA_ERROR; - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); default: r = ZlibConstants.Z_STREAM_ERROR; - bitb = b; - bitk = k; - codec.AvailableBytesIn = n; - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - write = q; + this.Bitb = b; + this.Bitk = k; + this.Codec.AvailableBytesIn = n; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Write = q; return Flush(r); } @@ -744,22 +744,22 @@ internal int Process(int r) internal void Free() { Reset(null); - window = null; - hufts = null; + this.Window = null; + this.Hufts = null; //ZFREE(z, s); } internal void SetDictionary(byte[] d, int start, int n) { - Array.Copy(d, start, window, 0, n); - read = write = n; + Array.Copy(d, start, this.Window, 0, n); + this.Read = this.Write = n; } // Returns true if inflate is currently at the end of a block generated // by Z_SYNC_FLUSH or Z_FULL_FLUSH. internal int SyncPoint() { - return mode == LENS ? 1 : 0; + return this.Mode == LENS ? 1 : 0; } // copy as much as possible from the sliding window to the output area @@ -770,66 +770,66 @@ internal int Flush(int r) int q; // local copies of source and destination pointers - p = codec.NextOut; - q = read; + p = this.Codec.NextOut; + q = this.Read; // compute number of bytes to copy as far as end of window - n = (q <= this.write ? this.write : this.end) - q; + n = (q <= this.Write ? this.Write : this.End) - q; - if (n > codec.AvailableBytesOut) - n = codec.AvailableBytesOut; + if (n > this.Codec.AvailableBytesOut) + n = this.Codec.AvailableBytesOut; if (n != 0 && r == ZlibConstants.Z_BUF_ERROR) r = ZlibConstants.Z_OK; // update counters - codec.AvailableBytesOut -= n; - codec.TotalBytesOut += n; + this.Codec.AvailableBytesOut -= n; + this.Codec.TotalBytesOut += n; // update check information - if (checkfn != null) - codec.adler32 = check = Adler.Adler32(check, window, q, n); + if (this.Checkfn != null) + this.Codec.Adler32 = this.Check = Adler.Adler32(this.Check, this.Window, q, n); // copy as far as end of window - Array.Copy(window, q, codec.OutputBuffer, p, n); + Array.Copy(this.Window, q, this.Codec.OutputBuffer, p, n); p += n; q += n; // see if more to copy at beginning of window - if (q == end) + if (q == this.End) { // wrap pointers q = 0; - if (write == end) - write = 0; + if (this.Write == this.End) + this.Write = 0; // compute bytes to copy - n = write - q; + n = this.Write - q; - if (n > codec.AvailableBytesOut) - n = codec.AvailableBytesOut; + if (n > this.Codec.AvailableBytesOut) + n = this.Codec.AvailableBytesOut; if (n != 0 && r == ZlibConstants.Z_BUF_ERROR) r = ZlibConstants.Z_OK; // update counters - codec.AvailableBytesOut -= n; - codec.TotalBytesOut += n; + this.Codec.AvailableBytesOut -= n; + this.Codec.TotalBytesOut += n; // update check information - if (checkfn != null) - codec.adler32 = check = Adler.Adler32(check, window, q, n); + if (this.Checkfn != null) + this.Codec.Adler32 = this.Check = Adler.Adler32(this.Check, this.Window, q, n); // copy - Array.Copy(window, q, codec.OutputBuffer, p, n); + Array.Copy(this.Window, q, this.Codec.OutputBuffer, p, n); p += n; q += n; } // update pointers - codec.NextOut = p; - read = q; + this.Codec.NextOut = p; + this.Read = q; // done return r; @@ -875,39 +875,39 @@ sealed internal class InflateCodes private const int END = 8; // x: got eob and all data flushed private const int BADCODE = 9; // x: got error - internal int mode; // current inflate_codes mode + internal int Mode; // current inflate_codes mode // mode dependent information - internal int len; + internal int Len; - internal int[] tree; // pointer into tree - internal int tree_index; - internal int need; // bits needed - internal int lit; + internal int[] Tree; // pointer into tree + internal int TreeIndex; + internal int Need; // bits needed + internal int Lit; // if EXT or COPY, where and how much - internal int get_Renamed; // bits to get for extra - internal int dist; // distance back to copy from + internal int GetRenamed; // bits to get for extra + internal int Dist; // distance back to copy from - internal byte lbits; // ltree bits decoded per branch - internal byte dbits; // dtree bits decoder per branch - internal int[] ltree; // literal/length/eob tree - internal int ltree_index; // literal/length/eob tree - internal int[] dtree; // distance tree - internal int dtree_index; // distance tree + internal byte Lbits; // ltree bits decoded per branch + internal byte Dbits; // dtree bits decoder per branch + internal int[] Ltree; // literal/length/eob tree + internal int LtreeIndex; // literal/length/eob tree + internal int[] Dtree; // distance tree + internal int DtreeIndex; // distance tree - internal InflateCodes() { } + //internal InflateCodes() { } - internal void Init(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index) + internal void Init(int bl, int bd, int[] tl, int tlIndex, int[] td, int tdIndex) { - mode = START; - lbits = (byte) bl; - dbits = (byte) bd; - ltree = tl; - ltree_index = tl_index; - dtree = td; - dtree_index = td_index; - tree = null; + this.Mode = START; + this.Lbits = (byte) bl; + this.Dbits = (byte) bd; + this.Ltree = tl; + this.LtreeIndex = tlIndex; + this.Dtree = td; + this.DtreeIndex = tdIndex; + this.Tree = null; } internal int Process(InflateBlocks blocks, int r) @@ -919,15 +919,15 @@ internal int Process(InflateBlocks blocks, int r) int q; // output window write pointer int m; // bytes to end of window or read pointer - ZlibCodec z = blocks.codec; + ZlibCodec z = blocks.Codec; // copy input/output information to locals (UPDATE macro restores) p = z.NextIn; n = z.AvailableBytesIn; - b = blocks.bitb; - k = blocks.bitk; - q = blocks.write; - m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + b = blocks.Bitb; + k = blocks.Bitk; + q = blocks.Write; + m = q < blocks.Read ? blocks.Read - q - 1 : blocks.End - q; // process input and output based on current state while (true) @@ -936,43 +936,43 @@ internal int Process(InflateBlocks blocks, int r) int tindex; // temporary pointer int e; // extra bits or operation - switch (mode) + switch (this.Mode) { // waiting for "i:"=input, "o:"=output, "x:"=nothing case START: // x: set up for LEN if (m >= 258 && n >= 10) { - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; - r = InflateFast(lbits, dbits, ltree, ltree_index, dtree, dtree_index, blocks, z); + blocks.Write = q; + r = InflateFast(this.Lbits, this.Dbits, this.Ltree, this.LtreeIndex, this.Dtree, this.DtreeIndex, blocks, z); p = z.NextIn; n = z.AvailableBytesIn; - b = blocks.bitb; - k = blocks.bitk; - q = blocks.write; - m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + b = blocks.Bitb; + k = blocks.Bitk; + q = blocks.Write; + m = q < blocks.Read ? blocks.Read - q - 1 : blocks.End - q; if (r != ZlibConstants.Z_OK) { - mode = (r == ZlibConstants.Z_STREAM_END) ? WASH : BADCODE; + this.Mode = (r == ZlibConstants.Z_STREAM_END) ? WASH : BADCODE; break; } } - need = lbits; - tree = ltree; - tree_index = ltree_index; - mode = LEN; + this.Need = this.Lbits; + this.Tree = this.Ltree; + this.TreeIndex = this.LtreeIndex; + this.Mode = LEN; goto case LEN; case LEN: // i: get length/literal/eob next - j = need; + j = this.Need; while (k < (j)) { @@ -980,12 +980,12 @@ internal int Process(InflateBlocks blocks, int r) r = ZlibConstants.Z_OK; else { - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); } @@ -995,17 +995,17 @@ internal int Process(InflateBlocks blocks, int r) k += 8; } - tindex = (tree_index + (b & inflateMask[j])) * 3; + tindex = (this.TreeIndex + (b & inflateMask[j])) * 3; - b = SharedUtils.URShift(b, (tree[tindex + 1])); - k -= (tree[tindex + 1]); - e = tree[tindex]; + b = SharedUtils.UrShift(b, (this.Tree[tindex + 1])); + k -= (this.Tree[tindex + 1]); + e = this.Tree[tindex]; if (e == 0) { // literal - lit = tree[tindex + 2]; - mode = LIT; + this.Lit = this.Tree[tindex + 2]; + this.Mode = LIT; break; } @@ -1013,9 +1013,9 @@ internal int Process(InflateBlocks blocks, int r) if ((e & 16) != 0) { // length - get_Renamed = e & 15; - len = tree[tindex + 2]; - mode = LENEXT; + this.GetRenamed = e & 15; + this.Len = this.Tree[tindex + 2]; + this.Mode = LENEXT; break; } @@ -1023,8 +1023,8 @@ internal int Process(InflateBlocks blocks, int r) if ((e & 64) == 0) { // next table - need = e; - tree_index = tindex / 3 + tree[tindex + 2]; + this.Need = e; + this.TreeIndex = tindex / 3 + this.Tree[tindex + 2]; break; } @@ -1032,25 +1032,25 @@ internal int Process(InflateBlocks blocks, int r) if ((e & 32) != 0) { // end of block - mode = WASH; + this.Mode = WASH; break; } - mode = BADCODE; // invalid code + this.Mode = BADCODE; // invalid code z.Message = "invalid literal/length code"; r = ZlibConstants.Z_DATA_ERROR; - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); case LENEXT: // i: getting length extra (have base) - j = get_Renamed; + j = this.GetRenamed; while (k < (j)) { @@ -1059,12 +1059,12 @@ internal int Process(InflateBlocks blocks, int r) else { - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); } @@ -1074,20 +1074,20 @@ internal int Process(InflateBlocks blocks, int r) k += 8; } - len += (b & inflateMask[j]); + this.Len += (b & inflateMask[j]); b >>= j; k -= j; - need = dbits; - tree = dtree; - tree_index = dtree_index; - mode = DIST; + this.Need = this.Dbits; + this.Tree = this.Dtree; + this.TreeIndex = this.DtreeIndex; + this.Mode = DIST; goto case DIST; case DIST: // i: get distance next - j = need; + j = this.Need; while (k < (j)) { @@ -1095,12 +1095,12 @@ internal int Process(InflateBlocks blocks, int r) r = ZlibConstants.Z_OK; else { - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); } @@ -1110,18 +1110,18 @@ internal int Process(InflateBlocks blocks, int r) k += 8; } - tindex = (tree_index + (b & inflateMask[j])) * 3; + tindex = (this.TreeIndex + (b & inflateMask[j])) * 3; - b >>= tree[tindex + 1]; - k -= tree[tindex + 1]; - e = (tree[tindex]); + b >>= this.Tree[tindex + 1]; + k -= this.Tree[tindex + 1]; + e = (this.Tree[tindex]); if ((e & 16) != 0) { // distance - get_Renamed = e & 15; - dist = tree[tindex + 2]; - mode = DISTEXT; + this.GetRenamed = e & 15; + this.Dist = this.Tree[tindex + 2]; + this.Mode = DISTEXT; break; } @@ -1129,26 +1129,26 @@ internal int Process(InflateBlocks blocks, int r) if ((e & 64) == 0) { // next table - need = e; - tree_index = tindex / 3 + tree[tindex + 2]; + this.Need = e; + this.TreeIndex = tindex / 3 + this.Tree[tindex + 2]; break; } - mode = BADCODE; // invalid code + this.Mode = BADCODE; // invalid code z.Message = "invalid distance code"; r = ZlibConstants.Z_DATA_ERROR; - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); case DISTEXT: // i: getting distance extra - j = get_Renamed; + j = this.GetRenamed; while (k < (j)) { @@ -1156,12 +1156,12 @@ internal int Process(InflateBlocks blocks, int r) r = ZlibConstants.Z_OK; else { - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); } @@ -1171,103 +1171,103 @@ internal int Process(InflateBlocks blocks, int r) k += 8; } - dist += (b & inflateMask[j]); + this.Dist += (b & inflateMask[j]); b >>= j; k -= j; - mode = COPY; + this.Mode = COPY; goto case COPY; case COPY: // o: copying bytes in window, waiting for space - int f = q - this.dist; // pointer to copy strings from + int f = q - this.Dist; // pointer to copy strings from while (f < 0) { // modulo window size-"while" instead - f += blocks.end; // of "if" handles invalid distances + f += blocks.End; // of "if" handles invalid distances } - while (len != 0) + while (this.Len != 0) { if (m == 0) { - if (q == blocks.end && blocks.read != 0) + if (q == blocks.End && blocks.Read != 0) { q = 0; - m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + m = q < blocks.Read ? blocks.Read - q - 1 : blocks.End - q; } if (m == 0) { - blocks.write = q; + blocks.Write = q; r = blocks.Flush(r); - q = blocks.write; - m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + q = blocks.Write; + m = q < blocks.Read ? blocks.Read - q - 1 : blocks.End - q; - if (q == blocks.end && blocks.read != 0) + if (q == blocks.End && blocks.Read != 0) { q = 0; - m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + m = q < blocks.Read ? blocks.Read - q - 1 : blocks.End - q; } if (m == 0) { - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); } } } - blocks.window[q++] = blocks.window[f++]; + blocks.Window[q++] = blocks.Window[f++]; m--; - if (f == blocks.end) + if (f == blocks.End) f = 0; - len--; + this.Len--; } - mode = START; + this.Mode = START; break; case LIT: // o: got literal, waiting for output space if (m == 0) { - if (q == blocks.end && blocks.read != 0) + if (q == blocks.End && blocks.Read != 0) { q = 0; - m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + m = q < blocks.Read ? blocks.Read - q - 1 : blocks.End - q; } if (m == 0) { - blocks.write = q; + blocks.Write = q; r = blocks.Flush(r); - q = blocks.write; - m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + q = blocks.Write; + m = q < blocks.Read ? blocks.Read - q - 1 : blocks.End - q; - if (q == blocks.end && blocks.read != 0) + if (q == blocks.End && blocks.Read != 0) { q = 0; - m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + m = q < blocks.Read ? blocks.Read - q - 1 : blocks.End - q; } if (m == 0) { - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); } @@ -1275,9 +1275,9 @@ internal int Process(InflateBlocks blocks, int r) } r = ZlibConstants.Z_OK; - blocks.window[q++] = (byte) lit; + blocks.Window[q++] = (byte) this.Lit; m--; - mode = START; + this.Mode = START; break; @@ -1290,57 +1290,57 @@ internal int Process(InflateBlocks blocks, int r) p--; // can always return one } - blocks.write = q; + blocks.Write = q; r = blocks.Flush(r); - q = blocks.write; - m = q < blocks.read ? blocks.read - q - 1 : blocks.end - q; + q = blocks.Write; + //m = q < blocks.Read ? blocks.Read - q - 1 : blocks.End - q; - if (blocks.read != blocks.write) + if (blocks.Read != blocks.Write) { - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); } - mode = END; + this.Mode = END; goto case END; case END: r = ZlibConstants.Z_STREAM_END; - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); case BADCODE: // x: got error r = ZlibConstants.Z_DATA_ERROR; - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); default: r = ZlibConstants.Z_STREAM_ERROR; - blocks.bitb = b; - blocks.bitk = k; + blocks.Bitb = b; + blocks.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.write = q; + blocks.Write = q; return blocks.Flush(r); } @@ -1352,7 +1352,7 @@ internal int Process(InflateBlocks blocks, int r) // at least ten. The ten bytes are six bytes for the longest length/ // distance pair plus four bytes for overloading the bit buffer. - internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InflateBlocks s, ZlibCodec z) + internal int InflateFast(int bl, int bd, int[] tl, int tlIndex, int[] td, int tdIndex, InflateBlocks s, ZlibCodec z) { int b; // bit buffer int k; // bits in bit buffer @@ -1367,10 +1367,10 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t // load input, output, bit values p = z.NextIn; n = z.AvailableBytesIn; - b = s.bitb; - k = s.bitk; - q = s.write; - m = q < s.read ? s.read - q - 1 : s.end - q; + b = s.Bitb; + k = s.Bitk; + q = s.Write; + m = q < s.Read ? s.Read - q - 1 : s.End - q; // initialize masks ml = inflateMask[bl]; @@ -1391,16 +1391,16 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t int t = b & ml; // temporary pointer int[] tp = tl; // temporary pointer - int tp_index = tl_index; // temporary pointer - int tp_index_t_3 = (tp_index + t) * 3; // (tp_index+t)*3 + int tpIndex = tlIndex; // temporary pointer + int tpIndexT3 = (tpIndex + t) * 3; // (tp_index+t)*3 int e; // extra bits or operation - if ((e = tp[tp_index_t_3]) == 0) + if ((e = tp[tpIndexT3]) == 0) { - b >>= (tp[tp_index_t_3 + 1]); - k -= (tp[tp_index_t_3 + 1]); + b >>= (tp[tpIndexT3 + 1]); + k -= (tp[tpIndexT3 + 1]); - s.window[q++] = (byte) tp[tp_index_t_3 + 2]; + s.Window[q++] = (byte) tp[tpIndexT3 + 2]; m--; continue; @@ -1408,13 +1408,13 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t do { - b >>= (tp[tp_index_t_3 + 1]); - k -= (tp[tp_index_t_3 + 1]); + b >>= (tp[tpIndexT3 + 1]); + k -= (tp[tpIndexT3 + 1]); if ((e & 16) != 0) { e &= 15; - c = tp[tp_index_t_3 + 2] + (b & inflateMask[e]); + c = tp[tpIndexT3 + 2] + (b & inflateMask[e]); b >>= e; k -= e; @@ -1430,14 +1430,14 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t t = b & md; tp = td; - tp_index = td_index; - tp_index_t_3 = (tp_index + t) * 3; - e = tp[tp_index_t_3]; + tpIndex = tdIndex; + tpIndexT3 = (tpIndex + t) * 3; + e = tp[tpIndexT3]; do { - b >>= (tp[tp_index_t_3 + 1]); - k -= (tp[tp_index_t_3 + 1]); + b >>= (tp[tpIndexT3 + 1]); + k -= (tp[tpIndexT3 + 1]); if ((e & 16) != 0) { @@ -1452,7 +1452,7 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t k += 8; } - int d = tp[tp_index_t_3 + 2] + (b & inflateMask[e]); // distance back to copy from + int d = tp[tpIndexT3 + 2] + (b & inflateMask[e]); // distance back to copy from b >>= (e); k -= (e); @@ -1470,13 +1470,13 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t if (q - r > 0 && 2 > (q - r)) { - s.window[q++] = s.window[r++]; // minimum count is three, - s.window[q++] = s.window[r++]; // so unroll loop a little + s.Window[q++] = s.Window[r++]; // minimum count is three, + s.Window[q++] = s.Window[r++]; // so unroll loop a little c -= 2; } else { - Array.Copy(s.window, r, s.window, q, 2); + Array.Copy(s.Window, r, s.Window, q, 2); q += 2; r += 2; c -= 2; @@ -1489,11 +1489,11 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t do { - r += s.end; // force pointer in window + r += s.End; // force pointer in window } while (r < 0); // covers invalid distances - e = s.end - r; + e = s.End - r; if (c > e) { @@ -1504,16 +1504,16 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t { do { - s.window[q++] = s.window[r++]; + s.Window[q++] = s.Window[r++]; } while (--e != 0); } else { - Array.Copy(s.window, r, s.window, q, e); + Array.Copy(s.Window, r, s.Window, q, e); q += e; - r += e; - e = 0; + //r += e; + //e = 0; } r = 0; // copy rest from start of window @@ -1525,26 +1525,26 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t { do { - s.window[q++] = s.window[r++]; + s.Window[q++] = s.Window[r++]; } while (--c != 0); } else { - Array.Copy(s.window, r, s.window, q, c); + Array.Copy(s.Window, r, s.Window, q, c); q += c; - r += c; - c = 0; + //r += c; + //c = 0; } break; } if ((e & 64) == 0) { - t += tp[tp_index_t_3 + 2]; + t += tp[tpIndexT3 + 2]; t += (b & inflateMask[e]); - tp_index_t_3 = (tp_index + t) * 3; - e = tp[tp_index_t_3]; + tpIndexT3 = (tpIndex + t) * 3; + e = tp[tpIndexT3]; } else { @@ -1554,12 +1554,12 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t n += c; p -= c; k -= (c << 3); - s.bitb = b; - s.bitk = k; + s.Bitb = b; + s.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - s.write = q; + s.Write = q; return ZlibConstants.Z_DATA_ERROR; } @@ -1571,15 +1571,15 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t if ((e & 64) == 0) { - t += tp[tp_index_t_3 + 2]; + t += tp[tpIndexT3 + 2]; t += (b & inflateMask[e]); - tp_index_t_3 = (tp_index + t) * 3; + tpIndexT3 = (tpIndex + t) * 3; - if ((e = tp[tp_index_t_3]) == 0) + if ((e = tp[tpIndexT3]) == 0) { - b >>= (tp[tp_index_t_3 + 1]); - k -= (tp[tp_index_t_3 + 1]); - s.window[q++] = (byte) tp[tp_index_t_3 + 2]; + b >>= (tp[tpIndexT3 + 1]); + k -= (tp[tpIndexT3 + 1]); + s.Window[q++] = (byte) tp[tpIndexT3 + 2]; m--; break; @@ -1593,12 +1593,12 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t n += c; p -= c; k -= (c << 3); - s.bitb = b; - s.bitk = k; + s.Bitb = b; + s.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - s.write = q; + s.Write = q; return ZlibConstants.Z_STREAM_END; } @@ -1610,12 +1610,12 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t n += c; p -= c; k -= (c << 3); - s.bitb = b; - s.bitk = k; + s.Bitb = b; + s.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - s.write = q; + s.Write = q; return ZlibConstants.Z_DATA_ERROR; } @@ -1631,12 +1631,12 @@ internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int t p -= c; k -= (c << 3); - s.bitb = b; - s.bitk = k; + s.Bitb = b; + s.Bitk = k; z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - s.write = q; + s.Write = q; return ZlibConstants.Z_OK; } @@ -1662,18 +1662,18 @@ internal sealed class InflateManager private const int DONE = 12; // finished check, done private const int BAD = 13; // got an error--stay here - internal int mode; // current inflate mode - internal ZlibCodec codec; // pointer back to this zlib stream + internal int Mode; // current inflate mode + internal ZlibCodec Codec; // pointer back to this zlib stream // mode dependent information - internal int method; // if FLAGS, method byte + internal int Method; // if FLAGS, method byte // if CHECK, check values to compare - internal long[] was = new long[1]; // computed check value - internal long need; // stream check value + internal long[] Was = new long[1]; // computed check value + internal long Need; // stream check value // if BAD, inflateSync's marker bytes count - internal int marker; + internal int Marker; // mode independent information //internal int nowrap; // flag for no wrapper @@ -1685,8 +1685,8 @@ internal bool HandleRfc1950HeaderBytes set { this.handleRfc1950HeaderBytes = value; } } - internal int wbits; // log2(window size) (8..15, defaults to 15) - internal InflateBlocks blocks; // current inflate_blocks state + internal int Wbits; // log2(window size) (8..15, defaults to 15) + internal InflateBlocks Blocks; // current inflate_blocks state public InflateManager() { } @@ -1697,29 +1697,29 @@ public InflateManager(bool expectRfc1950HeaderBytes) internal int Reset() { - codec.TotalBytesIn = codec.TotalBytesOut = 0; - codec.Message = null; - mode = HandleRfc1950HeaderBytes ? METHOD : BLOCKS; - blocks.Reset(null); + this.Codec.TotalBytesIn = this.Codec.TotalBytesOut = 0; + this.Codec.Message = null; + this.Mode = HandleRfc1950HeaderBytes ? METHOD : BLOCKS; + this.Blocks.Reset(null); return ZlibConstants.Z_OK; } internal int End() { - if (blocks != null) - blocks.Free(); + if (this.Blocks != null) + this.Blocks.Free(); - blocks = null; + this.Blocks = null; return ZlibConstants.Z_OK; } internal int Initialize(ZlibCodec codec, int w) { - this.codec = codec; + this.Codec = codec; codec.Message = null; - blocks = null; + this.Blocks = null; // handle undocumented nowrap option (no zlib header or check) //nowrap = 0; @@ -1738,9 +1738,9 @@ internal int Initialize(ZlibCodec codec, int w) //return ZlibConstants.Z_STREAM_ERROR; } - wbits = w; + this.Wbits = w; - blocks = new InflateBlocks(codec, HandleRfc1950HeaderBytes ? this : null, 1 << w); + this.Blocks = new InflateBlocks(codec, HandleRfc1950HeaderBytes ? this : null, 1 << w); // reset state Reset(); @@ -1753,7 +1753,7 @@ internal int Inflate(FlushType flush) int r; int f = (int) flush; - if (codec.InputBuffer == null) + if (this.Codec.InputBuffer == null) throw new ZlibException("InputBuffer is null. "); f = (f == (int) FlushType.Finish) @@ -1763,131 +1763,131 @@ internal int Inflate(FlushType flush) while (true) { - switch (mode) + switch (this.Mode) { case METHOD: - if (codec.AvailableBytesIn == 0) + if (this.Codec.AvailableBytesIn == 0) return r; r = f; - codec.AvailableBytesIn--; - codec.TotalBytesIn++; + this.Codec.AvailableBytesIn--; + this.Codec.TotalBytesIn++; - if (((method = codec.InputBuffer[codec.NextIn++]) & 0xf) != Z_DEFLATED) + if (((this.Method = this.Codec.InputBuffer[this.Codec.NextIn++]) & 0xf) != Z_DEFLATED) { - mode = BAD; - codec.Message = string.Format("unknown compression method (0x{0:X2})", method); - marker = 5; // can't try inflateSync + this.Mode = BAD; + this.Codec.Message = string.Format("unknown compression method (0x{0:X2})", this.Method); + this.Marker = 5; // can't try inflateSync break; } - if ((method >> 4) + 8 > wbits) + if ((this.Method >> 4) + 8 > this.Wbits) { - mode = BAD; - codec.Message = string.Format("invalid window size ({0})", (method >> 4) + 8); - marker = 5; // can't try inflateSync + this.Mode = BAD; + this.Codec.Message = string.Format("invalid window size ({0})", (this.Method >> 4) + 8); + this.Marker = 5; // can't try inflateSync break; } - mode = FLAG; + this.Mode = FLAG; goto case FLAG; case FLAG: - if (codec.AvailableBytesIn == 0) + if (this.Codec.AvailableBytesIn == 0) return r; r = f; - codec.AvailableBytesIn--; - codec.TotalBytesIn++; - int b = (this.codec.InputBuffer[this.codec.NextIn++]) & 0xff; + this.Codec.AvailableBytesIn--; + this.Codec.TotalBytesIn++; + int b = (this.Codec.InputBuffer[this.Codec.NextIn++]) & 0xff; - if ((((method << 8) + b) % 31) != 0) + if ((((this.Method << 8) + b) % 31) != 0) { - mode = BAD; - codec.Message = "incorrect header check"; - marker = 5; // can't try inflateSync + this.Mode = BAD; + this.Codec.Message = "incorrect header check"; + this.Marker = 5; // can't try inflateSync break; } if ((b & PRESET_DICT) == 0) { - mode = BLOCKS; + this.Mode = BLOCKS; break; } - mode = DICT4; + this.Mode = DICT4; goto case DICT4; case DICT4: - if (codec.AvailableBytesIn == 0) + if (this.Codec.AvailableBytesIn == 0) return r; r = f; - codec.AvailableBytesIn--; - codec.TotalBytesIn++; - need = ((codec.InputBuffer[codec.NextIn++] & 0xff) << 24) & unchecked((int) 0xff000000L); - mode = DICT3; + this.Codec.AvailableBytesIn--; + this.Codec.TotalBytesIn++; + this.Need = ((this.Codec.InputBuffer[this.Codec.NextIn++] & 0xff) << 24) & unchecked((int) 0xff000000L); + this.Mode = DICT3; goto case DICT3; case DICT3: - if (codec.AvailableBytesIn == 0) + if (this.Codec.AvailableBytesIn == 0) return r; r = f; - codec.AvailableBytesIn--; - codec.TotalBytesIn++; - need += (((codec.InputBuffer[codec.NextIn++] & 0xff) << 16) & 0xff0000L); - mode = DICT2; + this.Codec.AvailableBytesIn--; + this.Codec.TotalBytesIn++; + this.Need += (((this.Codec.InputBuffer[this.Codec.NextIn++] & 0xff) << 16) & 0xff0000L); + this.Mode = DICT2; goto case DICT2; case DICT2: - if (codec.AvailableBytesIn == 0) + if (this.Codec.AvailableBytesIn == 0) return r; r = f; - codec.AvailableBytesIn--; - codec.TotalBytesIn++; - need += (((codec.InputBuffer[codec.NextIn++] & 0xff) << 8) & 0xff00L); - mode = DICT1; + this.Codec.AvailableBytesIn--; + this.Codec.TotalBytesIn++; + this.Need += (((this.Codec.InputBuffer[this.Codec.NextIn++] & 0xff) << 8) & 0xff00L); + this.Mode = DICT1; goto case DICT1; case DICT1: - if (codec.AvailableBytesIn == 0) + if (this.Codec.AvailableBytesIn == 0) return r; - r = f; - codec.AvailableBytesIn--; - codec.TotalBytesIn++; - need += (codec.InputBuffer[codec.NextIn++] & 0xffL); - codec.adler32 = need; - mode = DICT0; + //r = f; + this.Codec.AvailableBytesIn--; + this.Codec.TotalBytesIn++; + this.Need += (this.Codec.InputBuffer[this.Codec.NextIn++] & 0xffL); + this.Codec.Adler32 = this.Need; + this.Mode = DICT0; return ZlibConstants.Z_NEED_DICT; case DICT0: - mode = BAD; - codec.Message = "need dictionary"; - marker = 0; // can try inflateSync + this.Mode = BAD; + this.Codec.Message = "need dictionary"; + this.Marker = 0; // can try inflateSync return ZlibConstants.Z_STREAM_ERROR; case BLOCKS: - r = blocks.Process(r); + r = this.Blocks.Process(r); if (r == ZlibConstants.Z_DATA_ERROR) { - mode = BAD; - marker = 0; // can try inflateSync + this.Mode = BAD; + this.Marker = 0; // can try inflateSync break; } @@ -1899,84 +1899,84 @@ internal int Inflate(FlushType flush) return r; r = f; - blocks.Reset(was); + this.Blocks.Reset(this.Was); if (!HandleRfc1950HeaderBytes) { - mode = DONE; + this.Mode = DONE; break; } - mode = CHECK4; + this.Mode = CHECK4; goto case CHECK4; case CHECK4: - if (codec.AvailableBytesIn == 0) + if (this.Codec.AvailableBytesIn == 0) return r; r = f; - codec.AvailableBytesIn--; - codec.TotalBytesIn++; - need = ((codec.InputBuffer[codec.NextIn++] & 0xff) << 24) & unchecked((int) 0xff000000L); - mode = CHECK3; + this.Codec.AvailableBytesIn--; + this.Codec.TotalBytesIn++; + this.Need = ((this.Codec.InputBuffer[this.Codec.NextIn++] & 0xff) << 24) & unchecked((int) 0xff000000L); + this.Mode = CHECK3; goto case CHECK3; case CHECK3: - if (codec.AvailableBytesIn == 0) + if (this.Codec.AvailableBytesIn == 0) return r; r = f; - codec.AvailableBytesIn--; - codec.TotalBytesIn++; - need += (((codec.InputBuffer[codec.NextIn++] & 0xff) << 16) & 0xff0000L); - mode = CHECK2; + this.Codec.AvailableBytesIn--; + this.Codec.TotalBytesIn++; + this.Need += (((this.Codec.InputBuffer[this.Codec.NextIn++] & 0xff) << 16) & 0xff0000L); + this.Mode = CHECK2; goto case CHECK2; case CHECK2: - if (codec.AvailableBytesIn == 0) + if (this.Codec.AvailableBytesIn == 0) return r; r = f; - codec.AvailableBytesIn--; - codec.TotalBytesIn++; - need += (((codec.InputBuffer[codec.NextIn++] & 0xff) << 8) & 0xff00L); - mode = CHECK1; + this.Codec.AvailableBytesIn--; + this.Codec.TotalBytesIn++; + this.Need += (((this.Codec.InputBuffer[this.Codec.NextIn++] & 0xff) << 8) & 0xff00L); + this.Mode = CHECK1; goto case CHECK1; case CHECK1: - if (codec.AvailableBytesIn == 0) + if (this.Codec.AvailableBytesIn == 0) return r; r = f; - codec.AvailableBytesIn--; - codec.TotalBytesIn++; - need += (codec.InputBuffer[codec.NextIn++] & 0xffL); + this.Codec.AvailableBytesIn--; + this.Codec.TotalBytesIn++; + this.Need += (this.Codec.InputBuffer[this.Codec.NextIn++] & 0xffL); unchecked { - if (((int) (was[0])) != ((int) (need))) + if (((int) (this.Was[0])) != ((int) (this.Need))) { - mode = BAD; - codec.Message = "incorrect data check"; - marker = 5; // can't try inflateSync + this.Mode = BAD; + this.Codec.Message = "incorrect data check"; + this.Marker = 5; // can't try inflateSync break; } } - mode = DONE; + this.Mode = DONE; goto case DONE; case DONE: return ZlibConstants.Z_STREAM_END; case BAD: - throw new ZlibException(string.Format("Bad state ({0})", codec.Message)); + throw new ZlibException(string.Format("Bad state ({0})", this.Codec.Message)); //return ZlibConstants.Z_DATA_ERROR; default: @@ -1991,24 +1991,24 @@ internal int SetDictionary(byte[] dictionary) int index = 0; int length = dictionary.Length; - if (mode != DICT0) + if (this.Mode != DICT0) throw new ZlibException("Stream error."); - if (Adler.Adler32(1L, dictionary, 0, dictionary.Length) != codec.adler32) + if (Adler.Adler32(1L, dictionary, 0, dictionary.Length) != this.Codec.Adler32) { return ZlibConstants.Z_DATA_ERROR; } - codec.adler32 = Adler.Adler32(0, null, 0, 0); + this.Codec.Adler32 = Adler.Adler32(0, null, 0, 0); - if (length >= (1 << wbits)) + if (length >= (1 << this.Wbits)) { - length = (1 << wbits) - 1; + length = (1 << this.Wbits) - 1; index = dictionary.Length - length; } - blocks.SetDictionary(dictionary, index, length); - mode = BLOCKS; + this.Blocks.SetDictionary(dictionary, index, length); + this.Mode = BLOCKS; return ZlibConstants.Z_OK; } @@ -2023,26 +2023,26 @@ internal int Sync() long r, w; // temporaries to save total_in and total_out // set up - if (mode != BAD) + if (this.Mode != BAD) { - mode = BAD; - marker = 0; + this.Mode = BAD; + this.Marker = 0; } - if ((n = codec.AvailableBytesIn) == 0) + if ((n = this.Codec.AvailableBytesIn) == 0) return ZlibConstants.Z_BUF_ERROR; - p = codec.NextIn; - m = marker; + p = this.Codec.NextIn; + m = this.Marker; // search while (n != 0 && m < 4) { - if (codec.InputBuffer[p] == mark[m]) + if (this.Codec.InputBuffer[p] == mark[m]) { m++; } - else if (codec.InputBuffer[p] != 0) + else if (this.Codec.InputBuffer[p] != 0) { m = 0; } @@ -2056,10 +2056,10 @@ internal int Sync() } // restore - codec.TotalBytesIn += p - codec.NextIn; - codec.NextIn = p; - codec.AvailableBytesIn = n; - marker = m; + this.Codec.TotalBytesIn += p - this.Codec.NextIn; + this.Codec.NextIn = p; + this.Codec.AvailableBytesIn = n; + this.Marker = m; // return no joy or set up to restart on a new block if (m != 4) @@ -2067,12 +2067,12 @@ internal int Sync() return ZlibConstants.Z_DATA_ERROR; } - r = codec.TotalBytesIn; - w = codec.TotalBytesOut; + r = this.Codec.TotalBytesIn; + w = this.Codec.TotalBytesOut; Reset(); - codec.TotalBytesIn = r; - codec.TotalBytesOut = w; - mode = BLOCKS; + this.Codec.TotalBytesIn = r; + this.Codec.TotalBytesOut = w; + this.Mode = BLOCKS; return ZlibConstants.Z_OK; } @@ -2085,7 +2085,7 @@ internal int Sync() // waiting for these length bytes. internal int SyncPoint(ZlibCodec z) { - return blocks.SyncPoint(); + return this.Blocks.SyncPoint(); } } } diff --git a/RestSharp/Compression/ZLib/ZLib.cs b/RestSharp/Compression/ZLib/ZLib.cs index 11e52c491..7710e257a 100644 --- a/RestSharp/Compression/ZLib/ZLib.cs +++ b/RestSharp/Compression/ZLib/ZLib.cs @@ -67,7 +67,6 @@ using System; using System.IO; using System.Text; -using Interop = System.Runtime.InteropServices; namespace RestSharp.Compression.ZLib { @@ -97,7 +96,7 @@ internal class SharedUtils /// Number to operate on /// Ammount of bits to shift /// The resulting number from the shift operation - public static int URShift(int number, int bits) + public static int UrShift(int number, int bits) { return (int)((uint)number >> bits); } @@ -108,7 +107,7 @@ public static int URShift(int number, int bits) /// Number to operate on /// Ammount of bits to shift /// The resulting number from the shift operation - public static long URShift(long number, int bits) + public static long UrShift(long number, int bits) { return (long)((ulong)number >> bits); } @@ -219,7 +218,7 @@ internal sealed class Adler private static int BASE = 65521; // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 - private static int NMAX = 5552; + private static int nmax = 5552; static internal long Adler32(long adler, byte[] buf, int index, int len) { @@ -233,7 +232,7 @@ static internal long Adler32(long adler, byte[] buf, int index, int len) while (len > 0) { - int k = len < NMAX ? len : NMAX; + int k = len < nmax ? len : nmax; len -= k; @@ -273,16 +272,6 @@ static internal long Adler32(long adler, byte[] buf, int index, int len) return (s2 << 16) | s1; } - - /* - private java.util.zip.Adler32 adler=new java.util.zip.Adler32(); - long adler32(long value, byte[] buf, int index, int len){ - if(value==1) {adler.reset();} - if(buf==null) {adler.reset();} - else{adler.update(buf, index, len);} - return adler.getValue(); - } - */ } } diff --git a/RestSharp/Compression/ZLib/ZLibCodec.cs b/RestSharp/Compression/ZLib/ZLibCodec.cs index 778e3c907..4d2e81379 100644 --- a/RestSharp/Compression/ZLib/ZLibCodec.cs +++ b/RestSharp/Compression/ZLib/ZLibCodec.cs @@ -132,9 +132,7 @@ sealed internal class ZlibCodec /// public string Message; - internal InflateManager istate; - - internal long adler32; + internal InflateManager Istate; /// /// The number of Window Bits to use. @@ -150,7 +148,7 @@ sealed internal class ZlibCodec /// /// The Adler32 checksum on the data transferred through the codec so far. You probably don't need to look at this. /// - public long Adler32 { get { return adler32; } } + public long Adler32 { get; internal set; } /// /// Create a ZlibCodec that decompresses. @@ -238,9 +236,9 @@ public int InitializeInflate(int windowBits, bool expectRfc1950Header) //if (dstate != null) // throw new ZlibException("You may not call InitializeInflate() after calling InitializeDeflate()."); - istate = new InflateManager(expectRfc1950Header); + this.Istate = new InflateManager(expectRfc1950Header); - return istate.Initialize(this, windowBits); + return this.Istate.Initialize(this, windowBits); } /// @@ -308,10 +306,10 @@ public int InitializeInflate(int windowBits, bool expectRfc1950Header) /// Z_OK if everything goes well. public int Inflate(FlushType flush) { - if (istate == null) + if (this.Istate == null) throw new ZlibException("No Inflate State!"); - return istate.Inflate(flush); + return this.Istate.Inflate(flush); } /// @@ -325,12 +323,12 @@ public int Inflate(FlushType flush) /// Z_OK if everything goes well. public int EndInflate() { - if (istate == null) + if (this.Istate == null) throw new ZlibException("No Inflate State!"); - int ret = istate.End(); + int ret = this.Istate.End(); - istate = null; + this.Istate = null; return ret; } @@ -341,10 +339,10 @@ public int EndInflate() /// Z_OK if everything goes well. public int SyncInflate() { - if (istate == null) + if (this.Istate == null) throw new ZlibException("No Inflate State!"); - return istate.Sync(); + return this.Istate.Sync(); } /// @@ -354,8 +352,8 @@ public int SyncInflate() /// Z_OK if all goes well. public int SetDictionary(byte[] dictionary) { - if (istate != null) - return istate.SetDictionary(dictionary); + if (this.Istate != null) + return this.Istate.SetDictionary(dictionary); throw new ZlibException("No Inflate state!"); } diff --git a/RestSharp/Compression/ZLib/ZLibStream.cs b/RestSharp/Compression/ZLib/ZLibStream.cs index 7be720f83..6698e9676 100644 --- a/RestSharp/Compression/ZLib/ZLibStream.cs +++ b/RestSharp/Compression/ZLib/ZLibStream.cs @@ -28,7 +28,9 @@ #if WINDOWS_PHONE using System; +using System.Collections.Generic; using System.IO; +using System.Text; namespace RestSharp.Compression.ZLib { @@ -71,12 +73,12 @@ namespace RestSharp.Compression.ZLib /// internal class ZlibStream : Stream { - internal ZlibBaseStream baseStream; + internal ZlibBaseStream BaseStream; bool disposed; public ZlibStream(Stream stream) { - baseStream = new ZlibBaseStream(stream, ZlibStreamFlavor.ZLIB, false); + this.BaseStream = new ZlibBaseStream(stream, ZlibStreamFlavor.Zlib, false); } #region Zlib properties @@ -87,13 +89,13 @@ public ZlibStream(Stream stream) /// virtual public FlushType FlushMode { - get { return (baseStream.flushMode); } + get { return (this.BaseStream.FlushMode); } set { if (disposed) throw new ObjectDisposedException("ZlibStream"); - baseStream.flushMode = value; + this.BaseStream.FlushMode = value; } } @@ -115,32 +117,32 @@ virtual public FlushType FlushMode /// public int BufferSize { - get { return baseStream.bufferSize; } + get { return this.BaseStream.BufferSize; } set { if (disposed) throw new ObjectDisposedException("ZlibStream"); - if (baseStream.workingBuffer != null) + if (this.BaseStream.workingBuffer != null) throw new ZlibException("The working buffer is already set."); if (value < ZlibConstants.WORKING_BUFFER_SIZE_MIN) throw new ZlibException(string.Format("Don't be silly. {0} bytes?? Use a bigger buffer.", value)); - baseStream.bufferSize = value; + this.BaseStream.BufferSize = value; } } /// Returns the total number of bytes input so far. virtual public long TotalIn { - get { return baseStream.z.TotalBytesIn; } + get { return this.BaseStream.z.TotalBytesIn; } } /// Returns the total number of bytes output so far. virtual public long TotalOut { - get { return baseStream.z.TotalBytesOut; } + get { return this.BaseStream.z.TotalBytesOut; } } #endregion @@ -160,8 +162,8 @@ protected override void Dispose(bool disposing) { if (!disposed) { - if (disposing && (baseStream != null)) - baseStream.Close(); + if (disposing && (this.BaseStream != null)) + this.BaseStream.Close(); disposed = true; } @@ -185,7 +187,7 @@ public override bool CanRead if (disposed) throw new ObjectDisposedException("ZlibStream"); - return baseStream.stream.CanRead; + return this.BaseStream.Stream.CanRead; } } @@ -213,7 +215,7 @@ public override bool CanWrite if (disposed) throw new ObjectDisposedException("ZlibStream"); - return baseStream.stream.CanWrite; + return this.BaseStream.Stream.CanWrite; } } @@ -225,7 +227,7 @@ public override void Flush() if (disposed) throw new ObjectDisposedException("ZlibStream"); - baseStream.Flush(); + this.BaseStream.Flush(); } /// @@ -249,13 +251,13 @@ public override long Position { get { - switch (this.baseStream.streamMode) + switch (this.BaseStream.streamMode) { case ZlibBaseStream.StreamMode.Writer: - return this.baseStream.z.TotalBytesOut; + return this.BaseStream.z.TotalBytesOut; case ZlibBaseStream.StreamMode.Reader: - return this.baseStream.z.TotalBytesIn; + return this.BaseStream.z.TotalBytesIn; } return 0; @@ -290,13 +292,13 @@ public override int Read(byte[] buffer, int offset, int count) if (disposed) throw new ObjectDisposedException("ZlibStream"); - return baseStream.Read(buffer, offset, count); + return this.BaseStream.Read(buffer, offset, count); } /// /// Calling this method always throws a NotImplementedException. /// - public override long Seek(long offset, System.IO.SeekOrigin origin) + public override long Seek(long offset, SeekOrigin origin) { throw new NotImplementedException(); } @@ -338,7 +340,7 @@ public override void Write(byte[] buffer, int offset, int count) if (disposed) throw new ObjectDisposedException("ZlibStream"); - baseStream.Write(buffer, offset, count); + this.BaseStream.Write(buffer, offset, count); } #endregion @@ -354,11 +356,11 @@ public static string UncompressString(byte[] compressed) { // workitem 8460 byte[] working = new byte[1024]; - var encoding = System.Text.Encoding.UTF8; + Encoding encoding = Encoding.UTF8; - using (var output = new MemoryStream()) + using (MemoryStream output = new MemoryStream()) { - using (var input = new MemoryStream(compressed)) + using (MemoryStream input = new MemoryStream(compressed)) { using (Stream decompressor = new ZlibStream(input)) { @@ -372,7 +374,9 @@ public static string UncompressString(byte[] compressed) // reset to allow read from start output.Seek(0, SeekOrigin.Begin); - var sr = new StreamReader(output, encoding); + + StreamReader sr = new StreamReader(output, encoding); + return sr.ReadToEnd(); } } @@ -391,9 +395,9 @@ public static byte[] UncompressBuffer(byte[] compressed) // workitem 8460 byte[] working = new byte[1024]; - using (var output = new MemoryStream()) + using (MemoryStream output = new MemoryStream()) { - using (var input = new MemoryStream(compressed)) + using (MemoryStream input = new MemoryStream(compressed)) { using (Stream decompressor = new ZlibStream(input)) { @@ -412,9 +416,9 @@ public static byte[] UncompressBuffer(byte[] compressed) internal enum ZlibStreamFlavor { - ZLIB = 1950, - DEFLATE = 1951, - GZIP = 1952 + Zlib = 1950, + Deflate = 1951, + Gzip = 1952 } internal class ZlibBaseStream : Stream @@ -422,13 +426,13 @@ internal class ZlibBaseStream : Stream protected internal ZlibCodec z; // deferred init... new ZlibCodec(); protected internal StreamMode streamMode = StreamMode.Undefined; - protected internal FlushType flushMode; - protected internal ZlibStreamFlavor flavor; - protected internal bool leaveOpen; + protected internal FlushType FlushMode; + protected internal ZlibStreamFlavor Flavor; + protected internal bool LeaveOpen; protected internal byte[] workingBuffer; - protected internal int bufferSize = ZlibConstants.WORKING_BUFFER_SIZE_DEFAULT; - protected internal byte[] buf1 = new byte[1]; - protected internal Stream stream; + protected internal int BufferSize = ZlibConstants.WORKING_BUFFER_SIZE_DEFAULT; + protected internal byte[] Buf1 = new byte[1]; + protected internal Stream Stream; // workitem 7159 Crc32 crc; @@ -441,14 +445,14 @@ internal class ZlibBaseStream : Stream public ZlibBaseStream(Stream stream, ZlibStreamFlavor flavor, bool leaveOpen) { - flushMode = FlushType.None; + this.FlushMode = FlushType.None; //_workingBuffer = new byte[WORKING_BUFFER_SIZE_DEFAULT]; - this.stream = stream; - this.leaveOpen = leaveOpen; - this.flavor = flavor; + this.Stream = stream; + this.LeaveOpen = leaveOpen; + this.Flavor = flavor; // workitem 7159 - if (flavor == ZlibStreamFlavor.GZIP) + if (flavor == ZlibStreamFlavor.Gzip) { crc = new Crc32(); } @@ -460,7 +464,7 @@ private ZlibCodec Z { if (z == null) { - bool wantRfc1950Header = (flavor == ZlibStreamFlavor.ZLIB); + bool wantRfc1950Header = (this.Flavor == ZlibStreamFlavor.Zlib); z = new ZlibCodec(); z.InitializeInflate(wantRfc1950Header); @@ -472,7 +476,7 @@ private ZlibCodec Z private byte[] WorkingBuffer { - get { return workingBuffer ?? (workingBuffer = new byte[bufferSize]); } + get { return workingBuffer ?? (workingBuffer = new byte[this.BufferSize]); } } // workitem 7813 - totally unnecessary @@ -516,23 +520,23 @@ public override void Write(byte[] buffer, int offset, int count) //int rc = (_wantCompress) // ? _z.Deflate(_flushMode) // : _z.Inflate(_flushMode); - int rc = z.Inflate(flushMode); + int rc = z.Inflate(this.FlushMode); if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) throw new ZlibException("inflating: " + z.Message); - stream.Write(workingBuffer, 0, workingBuffer.Length - z.AvailableBytesOut); + this.Stream.Write(workingBuffer, 0, workingBuffer.Length - z.AvailableBytesOut); done = z.AvailableBytesIn == 0 && z.AvailableBytesOut != 0; // If GZIP and de-compress, we're done when 8 bytes remain. - if (flavor == ZlibStreamFlavor.GZIP) + if (this.Flavor == ZlibStreamFlavor.Gzip) done = (z.AvailableBytesIn == 8 && z.AvailableBytesOut != 0); } while (!done); } - private void finish() + private void Finish() { if (z == null) return; @@ -559,13 +563,13 @@ private void finish() if (workingBuffer.Length - z.AvailableBytesOut > 0) { - stream.Write(workingBuffer, 0, workingBuffer.Length - z.AvailableBytesOut); + this.Stream.Write(workingBuffer, 0, workingBuffer.Length - z.AvailableBytesOut); } done = z.AvailableBytesIn == 0 && z.AvailableBytesOut != 0; // If GZIP and de-compress, we're done when 8 bytes remain. - if (flavor == ZlibStreamFlavor.GZIP) + if (this.Flavor == ZlibStreamFlavor.Gzip) done = (z.AvailableBytesIn == 8 && z.AvailableBytesOut != 0); } while (!done); @@ -573,7 +577,7 @@ private void finish() Flush(); // workitem 7159 - if (flavor == ZlibStreamFlavor.GZIP) + if (this.Flavor == ZlibStreamFlavor.Gzip) { //Console.WriteLine("GZipStream: Last write"); throw new ZlibException("Writing with decompression is not supported."); @@ -581,7 +585,7 @@ private void finish() break; case StreamMode.Reader: - if (flavor == ZlibStreamFlavor.GZIP) + if (this.Flavor == ZlibStreamFlavor.Gzip) { // workitem 8501: handle edge case (decompress empty stream) if (z.TotalBytesOut == 0L) @@ -598,25 +602,25 @@ private void finish() Array.Copy(z.InputBuffer, z.NextIn, trailer, 0, trailer.Length); - int crc32_expected = BitConverter.ToInt32(trailer, 0); - int crc32_actual = crc.Crc32Result; - int isize_expected = BitConverter.ToInt32(trailer, 4); - int isize_actual = (int) (z.TotalBytesOut & 0x00000000FFFFFFFF); + int crc32Expected = BitConverter.ToInt32(trailer, 0); + int crc32Actual = crc.Crc32Result; + int isizeExpected = BitConverter.ToInt32(trailer, 4); + int isizeActual = (int) (z.TotalBytesOut & 0x00000000FFFFFFFF); // Console.WriteLine("GZipStream: slurped trailer crc(0x{0:X8}) isize({1})", crc32_expected, isize_expected); // Console.WriteLine("GZipStream: calc'd data crc(0x{0:X8}) isize({1})", crc32_actual, isize_actual); - if (crc32_actual != crc32_expected) - throw new ZlibException(string.Format("Bad CRC32 in GZIP stream. (actual({0:X8})!=expected({1:X8}))", crc32_actual, crc32_expected)); + if (crc32Actual != crc32Expected) + throw new ZlibException(string.Format("Bad CRC32 in GZIP stream. (actual({0:X8})!=expected({1:X8}))", crc32Actual, crc32Expected)); - if (isize_actual != isize_expected) - throw new ZlibException(string.Format("Bad size in GZIP stream. (actual({0})!=expected({1}))", isize_actual, isize_expected)); + if (isizeActual != isizeExpected) + throw new ZlibException(string.Format("Bad size in GZIP stream. (actual({0})!=expected({1}))", isizeActual, isizeExpected)); } break; } } - private void end() + private void End() { if (Z == null) return; @@ -635,30 +639,30 @@ private void end() public override void Close() { - if (stream == null) + if (this.Stream == null) return; try { - finish(); + this.Finish(); } finally { - end(); + this.End(); - if (!leaveOpen) - stream.Close(); + if (!this.LeaveOpen) + this.Stream.Close(); - stream = null; + this.Stream = null; } } public override void Flush() { - stream.Flush(); + this.Stream.Flush(); } - public override long Seek(long offset, System.IO.SeekOrigin origin) + public override long Seek(long offset, SeekOrigin origin) { throw new NotImplementedException(); //_outStream.Seek(offset, origin); @@ -666,7 +670,7 @@ public override long Seek(long offset, System.IO.SeekOrigin origin) public override void SetLength(long value) { - stream.SetLength(value); + this.Stream.SetLength(value); } #if NOT @@ -687,21 +691,21 @@ public int Read() private string ReadZeroTerminatedString() { - var list = new System.Collections.Generic.List(); + List list = new List(); bool done = false; do { // workitem 7740 - int n = stream.Read(buf1, 0, 1); + int n = this.Stream.Read(this.Buf1, 0, 1); if (n != 1) throw new ZlibException("Unexpected EOF reading GZIP header."); - if (this.buf1[0] == 0) + if (this.Buf1[0] == 0) done = true; else - list.Add(this.buf1[0]); + list.Add(this.Buf1[0]); } while (!done); byte[] a = list.ToArray(); @@ -714,7 +718,7 @@ private int _ReadAndValidateGzipHeader() int totalBytesRead = 0; // read the header on the first read byte[] header = new byte[10]; - int n = stream.Read(header, 0, header.Length); + int n = this.Stream.Read(header, 0, header.Length); // workitem 8501: handle edge case (decompress empty stream) if (n == 0) @@ -734,13 +738,13 @@ private int _ReadAndValidateGzipHeader() if ((header[3] & 0x04) == 0x04) { // read and discard extra field - n = stream.Read(header, 0, 2); // 2-byte length field + n = this.Stream.Read(header, 0, 2); // 2-byte length field totalBytesRead += n; short extraLength = (short) (header[0] + header[1] * 256); byte[] extra = new byte[extraLength]; - n = stream.Read(extra, 0, extra.Length); + n = this.Stream.Read(extra, 0, extra.Length); if (n != extraLength) throw new ZlibException("Unexpected end-of-file reading GZIP header."); @@ -755,7 +759,7 @@ private int _ReadAndValidateGzipHeader() GzipComment = ReadZeroTerminatedString(); if ((header[3] & 0x02) == 0x02) - Read(buf1, 0, 1); // CRC16, ignore + Read(this.Buf1, 0, 1); // CRC16, ignore return totalBytesRead; } @@ -770,7 +774,7 @@ public override int Read(byte[] buffer, int offset, int count) if (streamMode == StreamMode.Undefined) { - if (!stream.CanRead) + if (!this.Stream.CanRead) throw new ZlibException("The stream is not readable."); // for the first read, set up some controls. @@ -780,7 +784,7 @@ public override int Read(byte[] buffer, int offset, int count) // may initialize it.) Z.AvailableBytesIn = 0; - if (flavor == ZlibStreamFlavor.GZIP) + if (this.Flavor == ZlibStreamFlavor.Gzip) { GzipHeaderByteCount = _ReadAndValidateGzipHeader(); // workitem 8501: handle edge case (decompress empty stream) @@ -827,7 +831,7 @@ public override int Read(byte[] buffer, int offset, int count) { // No data available, so try to Read data from the captive stream. z.NextIn = 0; - z.AvailableBytesIn = stream.Read(workingBuffer, 0, workingBuffer.Length); + z.AvailableBytesIn = this.Stream.Read(workingBuffer, 0, workingBuffer.Length); if (z.AvailableBytesIn == 0) nomoreinput = true; @@ -837,7 +841,7 @@ public override int Read(byte[] buffer, int offset, int count) //rc = (_wantCompress) // ? _z.Deflate(_flushMode) // : _z.Inflate(_flushMode); - rc = z.Inflate(flushMode); + rc = z.Inflate(this.FlushMode); if (nomoreinput && (rc == ZlibConstants.Z_BUF_ERROR)) return 0; @@ -889,22 +893,22 @@ public override int Read(byte[] buffer, int offset, int count) public override bool CanRead { - get { return stream.CanRead; } + get { return this.Stream.CanRead; } } public override bool CanSeek { - get { return stream.CanSeek; } + get { return this.Stream.CanSeek; } } public override bool CanWrite { - get { return stream.CanWrite; } + get { return this.Stream.CanWrite; } } public override long Length { - get { return stream.Length; } + get { return this.Stream.Length; } } public override long Position diff --git a/RestSharp/Deserializers/DotNetXmlDeserializer.cs b/RestSharp/Deserializers/DotNetXmlDeserializer.cs index 42fb43f66..ba6da54b6 100644 --- a/RestSharp/Deserializers/DotNetXmlDeserializer.cs +++ b/RestSharp/Deserializers/DotNetXmlDeserializer.cs @@ -16,6 +16,7 @@ using System.IO; using System.Text; +using System.Xml.Serialization; namespace RestSharp.Deserializers { @@ -37,9 +38,9 @@ public T Deserialize(IRestResponse response) return default(T); } - using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(response.Content))) + using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(response.Content))) { - var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T)); + XmlSerializer serializer = new XmlSerializer(typeof(T)); return (T)serializer.Deserialize(stream); } diff --git a/RestSharp/Deserializers/JsonDeserializer.cs b/RestSharp/Deserializers/JsonDeserializer.cs index 16dcabdc6..2bb6daf95 100644 --- a/RestSharp/Deserializers/JsonDeserializer.cs +++ b/RestSharp/Deserializers/JsonDeserializer.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Reflection; using RestSharp.Extensions; namespace RestSharp.Deserializers @@ -26,34 +27,34 @@ public JsonDeserializer() public T Deserialize(IRestResponse response) { - var target = Activator.CreateInstance(); + T target = Activator.CreateInstance(); if (target is IList) { - var objType = target.GetType(); + Type objType = target.GetType(); if (RootElement.HasValue()) { - var root = FindRoot(response.Content); + object root = FindRoot(response.Content); target = (T)BuildList(objType, root); } else { - var data = SimpleJson.DeserializeObject(response.Content); + object data = SimpleJson.DeserializeObject(response.Content); target = (T)BuildList(objType, data); } } else if (target is IDictionary) { - var root = FindRoot(response.Content); + object root = FindRoot(response.Content); target = (T)BuildDictionary(target.GetType(), root); } else { - var root = FindRoot(response.Content); + object root = FindRoot(response.Content); target = (T)Map(target, (IDictionary)root); } @@ -63,7 +64,7 @@ public T Deserialize(IRestResponse response) private object FindRoot(string content) { - var data = (IDictionary)SimpleJson.DeserializeObject(content); + IDictionary data = (IDictionary)SimpleJson.DeserializeObject(content); if (RootElement.HasValue() && data.ContainsKey(RootElement)) { @@ -75,18 +76,18 @@ private object FindRoot(string content) private object Map(object target, IDictionary data) { - var objType = target.GetType(); - var props = objType.GetProperties().Where(p => p.CanWrite).ToList(); + Type objType = target.GetType(); + List props = objType.GetProperties().Where(p => p.CanWrite).ToList(); - foreach (var prop in props) + foreach (PropertyInfo prop in props) { - var type = prop.PropertyType; - var attributes = prop.GetCustomAttributes(typeof(DeserializeAsAttribute), false); + Type type = prop.PropertyType; + object[] attributes = prop.GetCustomAttributes(typeof(DeserializeAsAttribute), false); string name; if (attributes.Length > 0) { - var attribute = (DeserializeAsAttribute)attributes[0]; + DeserializeAsAttribute attribute = (DeserializeAsAttribute)attributes[0]; name = attribute.Name; } else @@ -94,13 +95,13 @@ private object Map(object target, IDictionary data) name = prop.Name; } - var parts = name.Split('.'); - var currentData = data; + string[] parts = name.Split('.'); + IDictionary currentData = data; object value = null; - for (var i = 0; i < parts.Length; ++i) + for (int i = 0; i < parts.Length; ++i) { - var actualName = parts[i].GetNameVariants(Culture).FirstOrDefault(currentData.ContainsKey); + string actualName = parts[i].GetNameVariants(Culture).FirstOrDefault(currentData.ContainsKey); if (actualName == null) break; @@ -120,13 +121,13 @@ private object Map(object target, IDictionary data) private IDictionary BuildDictionary(Type type, object parent) { - var dict = (IDictionary)Activator.CreateInstance(type); - var keyType = type.GetGenericArguments()[0]; - var valueType = type.GetGenericArguments()[1]; + IDictionary dict = (IDictionary)Activator.CreateInstance(type); + Type keyType = type.GetGenericArguments()[0]; + Type valueType = type.GetGenericArguments()[1]; - foreach (var child in (IDictionary)parent) + foreach (KeyValuePair child in (IDictionary)parent) { - var key = keyType != typeof (string) ? + object key = keyType != typeof (string) ? Convert.ChangeType(child.Key, keyType, CultureInfo.InvariantCulture) : child.Key; @@ -149,17 +150,18 @@ private IDictionary BuildDictionary(Type type, object parent) private IList BuildList(Type type, object parent) { - var list = (IList)Activator.CreateInstance(type); - var listType = type.GetInterfaces().First(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IList<>)); - var itemType = listType.GetGenericArguments()[0]; + IList list = (IList)Activator.CreateInstance(type); + Type listType = type.GetInterfaces().First + (x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IList<>)); + Type itemType = listType.GetGenericArguments()[0]; if (parent is IList) { - foreach (var element in (IList)parent) + foreach (object element in (IList)parent) { if (itemType.IsPrimitive) { - var item = ConvertValue(itemType, element); + object item = ConvertValue(itemType, element); list.Add(item); } else if (itemType == typeof(string)) @@ -180,7 +182,7 @@ private IList BuildList(Type type, object parent) continue; } - var item = ConvertValue(itemType, element); + object item = ConvertValue(itemType, element); list.Add(item); } } @@ -195,7 +197,7 @@ private IList BuildList(Type type, object parent) private object ConvertValue(Type type, object value) { - var stringValue = Convert.ToString(value, Culture); + string stringValue = Convert.ToString(value, Culture); // check for nullable and extract underlying type if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) @@ -285,7 +287,7 @@ private object ConvertValue(Type type, object value) } else if (type.IsGenericType) { - var genericTypeDef = type.GetGenericTypeDefinition(); + Type genericTypeDef = type.GetGenericTypeDefinition(); if (genericTypeDef == typeof(List<>)) { @@ -294,7 +296,7 @@ private object ConvertValue(Type type, object value) if (genericTypeDef == typeof(Dictionary<,>)) { - var keyType = type.GetGenericArguments()[0]; + Type keyType = type.GetGenericArguments()[0]; // only supports Dict() if (keyType == typeof(string)) @@ -329,7 +331,7 @@ private object ConvertValue(Type type, object value) private object CreateAndMap(Type type, object element) { - var instance = Activator.CreateInstance(type); + object instance = Activator.CreateInstance(type); Map(instance, (IDictionary)element); diff --git a/RestSharp/Deserializers/XmlAttributeDeserializer.cs b/RestSharp/Deserializers/XmlAttributeDeserializer.cs index a9dac6ae9..bb31e355b 100644 --- a/RestSharp/Deserializers/XmlAttributeDeserializer.cs +++ b/RestSharp/Deserializers/XmlAttributeDeserializer.cs @@ -24,10 +24,10 @@ public class XmlAttributeDeserializer : XmlDeserializer { protected override object GetValueFromXml(XElement root, XName name, PropertyInfo prop) { - var isAttribute = false; + bool isAttribute = false; //Check for the DeserializeAs attribute on the property - var options = prop.GetAttribute(); + DeserializeAsAttribute options = prop.GetAttribute(); if (options != null) { @@ -37,7 +37,7 @@ protected override object GetValueFromXml(XElement root, XName name, PropertyInf if (isAttribute) { - var attributeVal = GetAttributeByName(root, name); + XAttribute attributeVal = GetAttributeByName(root, name); if (attributeVal != null) { diff --git a/RestSharp/Deserializers/XmlDeserializer.cs b/RestSharp/Deserializers/XmlDeserializer.cs index c07d960c4..a535c7f9e 100644 --- a/RestSharp/Deserializers/XmlDeserializer.cs +++ b/RestSharp/Deserializers/XmlDeserializer.cs @@ -17,7 +17,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.ComponentModel; using System.Globalization; using System.Linq; using System.Reflection; @@ -25,6 +24,10 @@ using System.Xml.Linq; using RestSharp.Extensions; +#if !SILVERLIGHT && !WINDOWS_PHONE +using System.ComponentModel; +#endif + namespace RestSharp.Deserializers { public class XmlDeserializer : IDeserializer @@ -47,8 +50,8 @@ public virtual T Deserialize(IRestResponse response) if (string.IsNullOrEmpty(response.Content)) return default(T); - var doc = XDocument.Parse(response.Content); - var root = doc.Root; + XDocument doc = XDocument.Parse(response.Content); + XElement root = doc.Root; if (RootElement.HasValue() && doc.Root != null) { @@ -61,12 +64,12 @@ public virtual T Deserialize(IRestResponse response) RemoveNamespace(doc); } - var x = Activator.CreateInstance(); - var objType = x.GetType(); + T x = Activator.CreateInstance(); + Type objType = x.GetType(); if (objType.IsSubclassOfRawGeneric(typeof(List<>))) { - x = (T) HandleListDerivative(x, root, objType.Name, objType); + x = (T) HandleListDerivative(root, objType.Name, objType); } else { @@ -76,47 +79,50 @@ public virtual T Deserialize(IRestResponse response) return x; } - private void RemoveNamespace(XDocument xdoc) + private static void RemoveNamespace(XDocument xdoc) { - foreach (XElement e in xdoc.Root.DescendantsAndSelf()) + if (xdoc.Root != null) { - if (e.Name.Namespace != XNamespace.None) + foreach (XElement e in xdoc.Root.DescendantsAndSelf()) { - e.Name = XNamespace.None.GetName(e.Name.LocalName); - } + if (e.Name.Namespace != XNamespace.None) + { + e.Name = XNamespace.None.GetName(e.Name.LocalName); + } - if (e.Attributes().Any(a => a.IsNamespaceDeclaration || a.Name.Namespace != XNamespace.None)) - { - e.ReplaceAttributes( - e.Attributes() - .Select(a => a.IsNamespaceDeclaration - ? null - : a.Name.Namespace != XNamespace.None - ? new XAttribute(XNamespace.None.GetName(a.Name.LocalName), a.Value) - : a)); + if (e.Attributes().Any(a => a.IsNamespaceDeclaration || a.Name.Namespace != XNamespace.None)) + { + e.ReplaceAttributes( + e.Attributes() + .Select(a => a.IsNamespaceDeclaration + ? null + : a.Name.Namespace != XNamespace.None + ? new XAttribute(XNamespace.None.GetName(a.Name.LocalName), a.Value) + : a)); + } } } } protected virtual object Map(object x, XElement root) { - var objType = x.GetType(); - var props = objType.GetProperties(); + Type objType = x.GetType(); + PropertyInfo[] props = objType.GetProperties(); - foreach (var prop in props) + foreach (PropertyInfo prop in props) { - var type = prop.PropertyType; - var typeIsPublic = type.IsPublic || type.IsNestedPublic; + Type type = prop.PropertyType; + bool typeIsPublic = type.IsPublic || type.IsNestedPublic; if (!typeIsPublic || !prop.CanWrite) continue; - var attributes = prop.GetCustomAttributes(typeof(DeserializeAsAttribute), false); + object[] attributes = prop.GetCustomAttributes(typeof(DeserializeAsAttribute), false); XName name; if (attributes.Length > 0) { - var attribute = (DeserializeAsAttribute) attributes[0]; + DeserializeAsAttribute attribute = (DeserializeAsAttribute) attributes[0]; name = attribute.Name.AsNamespaced(Namespace); } @@ -125,22 +131,22 @@ protected virtual object Map(object x, XElement root) name = prop.Name.AsNamespaced(Namespace); } - var value = GetValueFromXml(root, name, prop); + object value = GetValueFromXml(root, name, prop); if (value == null) { // special case for inline list items if (type.IsGenericType) { - var genericType = type.GetGenericArguments()[0]; - var first = GetElementByName(root, genericType.Name); - var list = (IList) Activator.CreateInstance(type); + Type genericType = type.GetGenericArguments()[0]; + XElement first = GetElementByName(root, genericType.Name); + IList list = (IList) Activator.CreateInstance(type); - if (first != null) + if (first != null && root != null) { - var elements = root.Elements(first.Name); + IEnumerable elements = root.Elements(first.Name); - PopulateListFromElements(genericType, elements, list); + this.PopulateListFromElements(genericType, elements, list); } prop.SetValue(x, list, null); @@ -152,7 +158,7 @@ protected virtual object Map(object x, XElement root) if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { // if the value is empty, set the property to null... - if (value == null || string.IsNullOrEmpty(value.ToString())) + if (string.IsNullOrEmpty(value.ToString())) { prop.SetValue(x, null, null); continue; @@ -163,7 +169,7 @@ protected virtual object Map(object x, XElement root) if (type == typeof(bool)) { - var toConvert = value.ToString().ToLower(); + string toConvert = value.ToString().ToLower(); prop.SetValue(x, XmlConvert.ToBoolean(toConvert), null); } @@ -173,13 +179,13 @@ protected virtual object Map(object x, XElement root) } else if (type.IsEnum) { - var converted = type.FindEnumValue(value.ToString(), Culture); + object converted = type.FindEnumValue(value.ToString(), Culture); prop.SetValue(x, converted, null); } else if (type == typeof(Uri)) { - var uri = new Uri(value.ToString(), UriKind.RelativeOrAbsolute); + Uri uri = new Uri(value.ToString(), UriKind.RelativeOrAbsolute); prop.SetValue(x, uri, null); } @@ -197,7 +203,7 @@ protected virtual object Map(object x, XElement root) } else if (type == typeof(DateTimeOffset)) { - var toConvert = value.ToString(); + string toConvert = value.ToString(); if (!string.IsNullOrEmpty(toConvert)) { @@ -232,29 +238,33 @@ protected virtual object Map(object x, XElement root) } else if (type == typeof(Guid)) { - var raw = value.ToString(); + string raw = value.ToString(); value = string.IsNullOrEmpty(raw) ? Guid.Empty : new Guid(value.ToString()); prop.SetValue(x, value, null); } else if (type == typeof(TimeSpan)) { - var timeSpan = XmlConvert.ToTimeSpan(value.ToString()); + TimeSpan timeSpan = XmlConvert.ToTimeSpan(value.ToString()); prop.SetValue(x, timeSpan, null); } else if (type.IsGenericType) { - var t = type.GetGenericArguments()[0]; - var list = (IList) Activator.CreateInstance(type); - var container = GetElementByName(root, prop.Name.AsNamespaced(Namespace)); + Type t = type.GetGenericArguments()[0]; + IList list = (IList) Activator.CreateInstance(type); + XElement container = GetElementByName(root, prop.Name.AsNamespaced(Namespace)); if (container.HasElements) { - var first = container.Elements().FirstOrDefault(); - var elements = container.Elements(first.Name); + XElement first = container.Elements().FirstOrDefault(); - PopulateListFromElements(t, elements, list); + if (first != null) + { + IEnumerable elements = container.Elements(first.Name); + + this.PopulateListFromElements(t, elements, list); + } } prop.SetValue(x, list, null); @@ -263,7 +273,7 @@ protected virtual object Map(object x, XElement root) { // handles classes that derive from List // e.g. a collection that also has attributes - var list = HandleListDerivative(x, root, prop.Name, type); + object list = HandleListDerivative(root, prop.Name, type); prop.SetValue(x, list, null); } @@ -281,11 +291,11 @@ protected virtual object Map(object x, XElement root) // nested property classes if (root != null) { - var element = GetElementByName(root, name); + XElement element = GetElementByName(root, name); if (element != null) { - var item = CreateAndMap(type, element); + object item = CreateAndMap(type, element); prop.SetValue(x, item, null); } @@ -300,7 +310,7 @@ protected virtual object Map(object x, XElement root) private static bool TryGetFromString(string inputString, out object result, Type type) { #if !SILVERLIGHT && !WINDOWS_PHONE - var converter = TypeDescriptor.GetConverter(type); + TypeConverter converter = TypeDescriptor.GetConverter(type); if (converter.CanConvertFrom(typeof(string))) { @@ -321,58 +331,60 @@ private static bool TryGetFromString(string inputString, out object result, Type private void PopulateListFromElements(Type t, IEnumerable elements, IList list) { - foreach (var element in elements) + foreach (object item in elements.Select(element => this.CreateAndMap(t, element))) { - var item = CreateAndMap(t, element); - list.Add(item); } } - private object HandleListDerivative(object x, XElement root, string propName, Type type) + private object HandleListDerivative(XElement root, string propName, Type type) { - var t = type.IsGenericType ? type.GetGenericArguments()[0] : type.BaseType.GetGenericArguments()[0]; - var list = (IList) Activator.CreateInstance(type); - var elements = root.Descendants(t.Name.AsNamespaced(Namespace)); - var name = t.Name; - var attribute = t.GetAttribute(); + Type t = type.IsGenericType ? type.GetGenericArguments()[0] : type.BaseType.GetGenericArguments()[0]; + IList list = (IList) Activator.CreateInstance(type); + IList elements = root.Descendants(t.Name.AsNamespaced(this.Namespace)).ToList(); + string name = t.Name; + DeserializeAsAttribute attribute = t.GetAttribute(); if (attribute != null) name = attribute.Name; if (!elements.Any()) { - var lowerName = name.ToLower().AsNamespaced(Namespace); + XName lowerName = name.ToLower().AsNamespaced(this.Namespace); - elements = root.Descendants(lowerName); + elements = root.Descendants(lowerName).ToList(); } if (!elements.Any()) { - var camelName = name.ToCamelCase(Culture).AsNamespaced(Namespace); + XName camelName = name.ToCamelCase(this.Culture).AsNamespaced(this.Namespace); - elements = root.Descendants(camelName); + elements = root.Descendants(camelName).ToList(); } if (!elements.Any()) { - elements = root.Descendants().Where(e => e.Name.LocalName.RemoveUnderscoresAndDashes() == name); + elements = root.Descendants() + .Where(e => e.Name.LocalName.RemoveUnderscoresAndDashes() == name) + .ToList(); } if (!elements.Any()) { - var lowerName = name.ToLower().AsNamespaced(Namespace); + XName lowerName = name.ToLower().AsNamespaced(this.Namespace); - elements = root.Descendants().Where(e => e.Name.LocalName.RemoveUnderscoresAndDashes() == lowerName); + elements = root.Descendants() + .Where(e => e.Name.LocalName.RemoveUnderscoresAndDashes() == lowerName) + .ToList(); } - PopulateListFromElements(t, elements, list); + this.PopulateListFromElements(t, elements, list); // get properties too, not just list items // only if this isn't a generic type if (!type.IsGenericType) { - Map(list, root.Element(propName.AsNamespaced(Namespace)) ?? root); + this.Map(list, root.Element(propName.AsNamespaced(this.Namespace)) ?? root); // when using RootElement, the heirarchy is different } @@ -406,11 +418,11 @@ protected virtual object GetValueFromXml(XElement root, XName name, PropertyInfo if (root != null) { - var element = GetElementByName(root, name); + XElement element = GetElementByName(root, name); if (element == null) { - var attribute = GetAttributeByName(root, name); + XAttribute attribute = GetAttributeByName(root, name); if (attribute != null) { @@ -431,8 +443,8 @@ protected virtual object GetValueFromXml(XElement root, XName name, PropertyInfo protected virtual XElement GetElementByName(XElement root, XName name) { - var lowerName = name.LocalName.ToLower().AsNamespaced(name.NamespaceName); - var camelName = name.LocalName.ToCamelCase(Culture).AsNamespaced(name.NamespaceName); + XName lowerName = name.LocalName.ToLower().AsNamespaced(name.NamespaceName); + XName camelName = name.LocalName.ToCamelCase(Culture).AsNamespaced(name.NamespaceName); if (root.Element(name) != null) { @@ -465,12 +477,12 @@ protected virtual XElement GetElementByName(XElement root, XName name) protected virtual XAttribute GetAttributeByName(XElement root, XName name) { - var names = new List - { - name.LocalName, - name.LocalName.ToLower().AsNamespaced(name.NamespaceName), - name.LocalName.ToCamelCase(Culture).AsNamespaced(name.NamespaceName) - }; + List names = new List + { + name.LocalName, + name.LocalName.ToLower().AsNamespaced(name.NamespaceName), + name.LocalName.ToCamelCase(Culture).AsNamespaced(name.NamespaceName) + }; return root.DescendantsAndSelf() .OrderBy(d => d.Ancestors().Count()) diff --git a/RestSharp/Extensions/MiscExtensions.cs b/RestSharp/Extensions/MiscExtensions.cs index 2027f9e7e..f9d8f5e8e 100644 --- a/RestSharp/Extensions/MiscExtensions.cs +++ b/RestSharp/Extensions/MiscExtensions.cs @@ -65,11 +65,11 @@ public static byte[] ReadAsBytes(this Stream input) /// The output stream. public static void CopyTo(this Stream input, Stream output) { - var buffer = new byte[32768]; + byte[] buffer = new byte[32768]; while (true) { - var read = input.Read(buffer, 0, buffer.Length); + int read = input.Read(buffer, 0, buffer.Length); if (read <= 0) return; @@ -95,7 +95,7 @@ public static string AsString(this byte[] buffer) #if FRAMEWORK return encoding.GetString(buffer, 0, buffer.Length); #else - if (buffer == null || buffer.Length == 0) + if (buffer.Length == 0) return ""; /* diff --git a/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs b/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs index 9d5ddcfcd..6e1cafa02 100644 --- a/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs +++ b/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs @@ -42,20 +42,12 @@ namespace RestSharp.Extensions.MonoHttp { -#if NET_4_0 - public -#endif class HttpEncoder { static readonly char[] hexChars = "0123456789abcdef".ToCharArray(); static readonly object entitiesLock = new object(); static SortedDictionary entities; -#if NET_4_0 - static Lazy defaultEncoder; - static Lazy currentEncoderLazy; -#else static readonly HttpEncoder defaultEncoder; -#endif static readonly HttpEncoder currentEncoder; static IDictionary Entities @@ -76,52 +68,26 @@ public static HttpEncoder Current { get { -#if NET_4_0 - if (currentEncoder == null) - currentEncoder = currentEncoderLazy.Value; -#endif return currentEncoder; } -#if NET_4_0 - set - { - if (value == null) - throw new ArgumentNullException ("value"); - - currentEncoder = value; - } -#endif } public static HttpEncoder Default { get { -#if NET_4_0 - return defaultEncoder.Value; -#else return defaultEncoder; -#endif } } static HttpEncoder() { -#if NET_4_0 - defaultEncoder = new Lazy (() => new HttpEncoder ()); - currentEncoderLazy = new Lazy (new Func (GetCustomEncoderFromConfig)); -#else defaultEncoder = new HttpEncoder(); currentEncoder = defaultEncoder; -#endif } -#if NET_4_0 - protected internal virtual -#else - internal static -#endif - void HeaderNameValueEncode(string headerName, string headerValue, out string encodedHeaderName, out string encodedHeaderValue) + internal static void HeaderNameValueEncode(string headerName, string headerValue, out string encodedHeaderName, + out string encodedHeaderValue) { encodedHeaderName = string.IsNullOrEmpty(headerName) ? headerName : EncodeHeaderString(headerName); encodedHeaderValue = string.IsNullOrEmpty(headerValue) ? headerValue : EncodeHeaderString(headerValue); @@ -139,7 +105,7 @@ static string EncodeHeaderString(string input) { StringBuilder sb = null; - foreach (var ch in input) + foreach (char ch in input) { if ((ch < 32 && ch != 9) || ch == 127) StringBuilderAppend(string.Format("%{0:x2}", (int) ch), ref sb); @@ -148,68 +114,7 @@ static string EncodeHeaderString(string input) return sb != null ? sb.ToString() : input; } -#if NET_4_0 - protected internal virtual void HtmlAttributeEncode (string value, TextWriter output) - { - - if (output == null) - throw new ArgumentNullException ("output"); - - if (String.IsNullOrEmpty (value)) - return; - - output.Write (HtmlAttributeEncode (value)); - } - - protected internal virtual void HtmlDecode (string value, TextWriter output) - { - if (output == null) - throw new ArgumentNullException ("output"); - - output.Write (HtmlDecode (value)); - } - - protected internal virtual void HtmlEncode (string value, TextWriter output) - { - if (output == null) - throw new ArgumentNullException ("output"); - - output.Write (HtmlEncode (value)); - } - - protected internal virtual byte[] UrlEncode (byte[] bytes, int offset, int count) - { - return UrlEncodeToBytes (bytes, offset, count); - } - - static HttpEncoder GetCustomEncoderFromConfig () - { - var cfg = WebConfigurationManager.GetSection ("system.web/httpRuntime") as HttpRuntimeSection; - string typeName = cfg.EncoderType; - - if (String.Compare (typeName, "System.Web.Util.HttpEncoder", StringComparison.OrdinalIgnoreCase) == 0) - return Default; - - Type t = Type.GetType (typeName, false); - - if (t == null) - throw new ConfigurationErrorsException (String.Format ("Could not load type '{0}'.", typeName)); - - if (!typeof (HttpEncoder).IsAssignableFrom (t)) - throw new ConfigurationErrorsException ( - String.Format ("'{0}' is not allowed here because it does not extend class 'System.Web.Util.HttpEncoder'.", typeName) - ); - - return Activator.CreateInstance (t, false) as HttpEncoder; - } -#endif - -#if NET_4_0 - protected internal virtual -#else - internal static -#endif - string UrlPathEncode(string value) + internal static string UrlPathEncode(string value) { if (string.IsNullOrEmpty(value)) return value; @@ -263,11 +168,8 @@ internal static string HtmlEncode(string s) for (int i = 0; i < s.Length; i++) { char c = s[i]; - if (c == '&' || c == '"' || c == '<' || c == '>' || c > 159 -#if NET_4_0 - || c == '\'' -#endif -) + + if (c == '&' || c == '"' || c == '<' || c == '>' || c > 159) { needEncode = true; break; @@ -300,12 +202,6 @@ internal static string HtmlEncode(string s) output.Append("""); break; -#if NET_4_0 - case '\'': - output.Append ("'"); - break; -#endif - case '\uff1c': output.Append("<"); break; @@ -315,7 +211,7 @@ internal static string HtmlEncode(string s) break; default: - var ch = s[i]; + char ch = s[i]; if (ch > 159 && ch < 256) { @@ -325,6 +221,7 @@ internal static string HtmlEncode(string s) } else output.Append(ch); + break; } } @@ -334,28 +231,19 @@ internal static string HtmlEncode(string s) internal static string HtmlAttributeEncode(string s) { -#if NET_4_0 - if (String.IsNullOrEmpty (s)) - return String.Empty; -#else - if (s == null) return null; if (s.Length == 0) return string.Empty; -#endif bool needEncode = false; for (int i = 0; i < s.Length; i++) { char c = s[i]; - if (c == '&' || c == '"' || c == '<' -#if NET_4_0 - || c == '\'' -#endif -) + + if (c == '&' || c == '"' || c == '<') { needEncode = true; break; @@ -369,6 +257,7 @@ internal static string HtmlAttributeEncode(string s) int len = s.Length; for (int i = 0; i < len; i++) + { switch (s[i]) { case '&': @@ -383,16 +272,11 @@ internal static string HtmlAttributeEncode(string s) output.Append("<"); break; -#if NET_4_0 - case '\'': - output.Append ("'"); - break; -#endif - default: output.Append(s[i]); break; } + } return output.ToString(); } @@ -408,9 +292,6 @@ internal static string HtmlDecode(string s) if (s.IndexOf('&') == -1) return s; -#if NET_4_0 - StringBuilder rawEntity = new StringBuilder (); -#endif StringBuilder entity = new StringBuilder(); StringBuilder output = new StringBuilder(); int len = s.Length; @@ -433,9 +314,6 @@ internal static string HtmlDecode(string s) if (c == '&') { entity.Append(c); -#if NET_4_0 - rawEntity.Append (c); -#endif state = 1; } else @@ -479,10 +357,8 @@ internal static string HtmlDecode(string s) isHexValue = false; state = c != '#' ? 2 : 3; entity.Append(c); -#if NET_4_0 - rawEntity.Append (c); -#endif } + break; case 2: @@ -498,20 +374,12 @@ internal static string HtmlDecode(string s) output.Append(key); state = 0; entity.Length = 0; -#if NET_4_0 - rawEntity.Length = 0; -#endif } break; case 3: if (c == ';') { -#if NET_4_0 - if (number == 0) - output.Append (rawEntity.ToString () + ";"); - else -#endif if (number > 65535) { output.Append("&#"); @@ -525,33 +393,21 @@ internal static string HtmlDecode(string s) state = 0; entity.Length = 0; -#if NET_4_0 - rawEntity.Length = 0; -#endif haveTrailingDigits = false; } else if (isHexValue && Uri.IsHexDigit(c)) { number = number * 16 + Uri.FromHex(c); haveTrailingDigits = true; -#if NET_4_0 - rawEntity.Append (c); -#endif } else if (char.IsDigit(c)) { number = number * 10 + (c - '0'); haveTrailingDigits = true; -#if NET_4_0 - rawEntity.Append (c); -#endif } else if (number == 0 && (c == 'x' || c == 'X')) { isHexValue = true; -#if NET_4_0 - rawEntity.Append (c); -#endif } else { @@ -565,6 +421,7 @@ internal static string HtmlDecode(string s) entity.Append(c); } + break; } } @@ -583,11 +440,7 @@ internal static string HtmlDecode(string s) internal static bool NotEncoded(char c) { - return (c == '!' || c == '(' || c == ')' || c == '*' || c == '-' || c == '.' || c == '_' -#if !NET_4_0 - || c == '\'' -#endif -); + return (c == '!' || c == '(' || c == ')' || c == '*' || c == '-' || c == '.' || c == '_'); } internal static void UrlEncodeChar(char c, Stream result, bool isUnicode) diff --git a/RestSharp/Extensions/MonoHttp/HttpUtility.cs b/RestSharp/Extensions/MonoHttp/HttpUtility.cs index 5327a6f37..4f076c50f 100644 --- a/RestSharp/Extensions/MonoHttp/HttpUtility.cs +++ b/RestSharp/Extensions/MonoHttp/HttpUtility.cs @@ -38,7 +38,6 @@ namespace RestSharp.Extensions.MonoHttp { - public sealed class HttpUtility { sealed class HttpQsCollection : NameValueCollection @@ -77,34 +76,15 @@ public static void HtmlAttributeEncode(string s, TextWriter output) { if (output == null) { -#if NET_4_0 - throw new ArgumentNullException ("output"); -#else throw new NullReferenceException(".NET emulation"); -#endif } -#if NET_4_0 - HttpEncoder.Current.HtmlAttributeEncode (s, output); -#else output.Write(HttpEncoder.HtmlAttributeEncode(s)); -#endif } public static string HtmlAttributeEncode(string s) { -#if NET_4_0 - if (s == null) - return null; - - using (var sw = new StringWriter ()) - { - HttpEncoder.Current.HtmlAttributeEncode (s, sw); - return sw.ToString (); - } -#else return HttpEncoder.HtmlAttributeEncode(s); -#endif } public static string UrlDecode(string str) @@ -140,20 +120,21 @@ public static string UrlDecode(string s, Encoding e) e = Encoding.UTF8; long len = s.Length; - var bytes = new List(); - int xchar; - char ch; + List bytes = new List(); for (int i = 0; i < len; i++) { - ch = s[i]; + char ch = s[i]; if (ch == '%' && i + 2 < len && s[i + 1] != '%') { + int xchar; + if (s[i + 1] == 'u' && i + 5 < len) { // unicode hex sequence xchar = GetChar(s, i + 2, 4); + if (xchar != -1) { WriteCharBytes(bytes, (char)xchar, e); @@ -257,7 +238,7 @@ public static string UrlDecode(byte[] bytes, int offset, int count, Encoding e) return null; if (count == 0) - return String.Empty; + return string.Empty; if (bytes == null) throw new ArgumentNullException("bytes"); @@ -272,12 +253,13 @@ public static string UrlDecode(byte[] bytes, int offset, int count, Encoding e) MemoryStream acc = new MemoryStream(); int end = count + offset; - int xchar; for (int i = offset; i < end; i++) { if (bytes[i] == '%' && i + 2 < count && bytes[i + 1] != '%') { + int xchar; + if (bytes[i + 1] == (byte)'u' && i + 5 < end) { if (acc.Length > 0) @@ -326,8 +308,6 @@ public static string UrlDecode(byte[] bytes, int offset, int count, Encoding e) output.Append(GetChars(acc, e)); } - acc = null; - return output.ToString(); } @@ -409,8 +389,8 @@ public static string UrlEncode(string s, Encoding Enc) if (s == null) return null; - if (s == String.Empty) - return String.Empty; + if (s == string.Empty) + return string.Empty; bool needEncode = false; int len = s.Length; @@ -446,7 +426,7 @@ public static string UrlEncode(byte[] bytes) return null; if (bytes.Length == 0) - return String.Empty; + return string.Empty; byte[] r = UrlEncodeToBytes(bytes, 0, bytes.Length); @@ -459,7 +439,7 @@ public static string UrlEncode(byte[] bytes, int offset, int count) return null; if (bytes.Length == 0) - return String.Empty; + return string.Empty; byte[] r = UrlEncodeToBytes(bytes, offset, count); @@ -572,7 +552,7 @@ public static void HtmlDecode(string s, TextWriter output) #endif } - if (!String.IsNullOrEmpty(s)) + if (!string.IsNullOrEmpty(s)) { #if NET_4_0 HttpEncoder.Current.HtmlDecode (s, output); @@ -614,7 +594,7 @@ public static void HtmlEncode(string s, TextWriter output) #endif } - if (!String.IsNullOrEmpty(s)) + if (!string.IsNullOrEmpty(s)) { #if NET_4_0 HttpEncoder.Current.HtmlEncode (s, output); diff --git a/RestSharp/Extensions/ReflectionExtensions.cs b/RestSharp/Extensions/ReflectionExtensions.cs index b3e6c125f..c7ade51d0 100644 --- a/RestSharp/Extensions/ReflectionExtensions.cs +++ b/RestSharp/Extensions/ReflectionExtensions.cs @@ -16,9 +16,12 @@ using System; using System.Globalization; -using System.Linq; using System.Reflection; +#if FRAMEWORK +using System.Linq; +#endif + namespace RestSharp.Extensions { /// @@ -58,7 +61,7 @@ public static bool IsSubclassOfRawGeneric(this Type toCheck, Type generic) { while (toCheck != null && toCheck != typeof(object)) { - var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck; + Type cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck; if (generic == cur) { @@ -100,7 +103,7 @@ public static object ChangeType(this object source, Type newType, CultureInfo cu public static object FindEnumValue(this Type type, string value, CultureInfo culture) { #if FRAMEWORK - var ret = Enum.GetValues(type) + Enum ret = Enum.GetValues(type) .Cast() .FirstOrDefault(v => v.ToString() .GetNameVariants(culture) @@ -108,7 +111,7 @@ public static object FindEnumValue(this Type type, string value, CultureInfo cul if (ret == null) { - var enumValueAsUnderlyingType = Convert.ChangeType(value, Enum.GetUnderlyingType(type), culture); + object enumValueAsUnderlyingType = Convert.ChangeType(value, Enum.GetUnderlyingType(type), culture); if (enumValueAsUnderlyingType != null && Enum.IsDefined(type, enumValueAsUnderlyingType)) { diff --git a/RestSharp/Extensions/StringExtensions.cs b/RestSharp/Extensions/StringExtensions.cs index f408da6e1..5c273c1a4 100644 --- a/RestSharp/Extensions/StringExtensions.cs +++ b/RestSharp/Extensions/StringExtensions.cs @@ -123,7 +123,7 @@ public static DateTime ParseJsonDate(this string input, CultureInfo culture) if (long.TryParse(input, out unix)) { - var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); return epoch.AddSeconds(unix); } @@ -162,17 +162,17 @@ public static string RemoveSurroundingQuotes(this string input) private static DateTime ParseFormattedDate(string input, CultureInfo culture) { - var formats = new [] - { - "u", - "s", - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", - "yyyy-MM-ddTHH:mm:ssZ", - "yyyy-MM-dd HH:mm:ssZ", - "yyyy-MM-ddTHH:mm:ss", - "yyyy-MM-ddTHH:mm:sszzzzzz", - "M/d/yyyy h:mm:ss tt" // default format for invariant culture - }; + string[] formats = + { + "u", + "s", + "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", + "yyyy-MM-ddTHH:mm:ssZ", + "yyyy-MM-dd HH:mm:ssZ", + "yyyy-MM-ddTHH:mm:ss", + "yyyy-MM-ddTHH:mm:sszzzzzz", + "M/d/yyyy h:mm:ss tt" // default format for invariant culture + }; DateTime date; @@ -192,21 +192,21 @@ private static DateTime ParseFormattedDate(string input, CultureInfo culture) private static DateTime ExtractDate(string input, string pattern, CultureInfo culture) { DateTime dt = DateTime.MinValue; - var regex = new Regex(pattern); + Regex regex = new Regex(pattern); if (regex.IsMatch(input)) { - var matches = regex.Matches(input); - var match = matches[0]; - var ms = Convert.ToInt64(match.Groups[1].Value); - var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + MatchCollection matches = regex.Matches(input); + Match match = matches[0]; + long ms = Convert.ToInt64(match.Groups[1].Value); + DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); dt = epoch.AddMilliseconds(ms); // adjust if time zone modifier present if (match.Groups.Count > 2 && !string.IsNullOrEmpty(match.Groups[3].Value)) { - var mod = DateTime.ParseExact(match.Groups[3].Value, "HHmm", culture); + DateTime mod = DateTime.ParseExact(match.Groups[3].Value, "HHmm", culture); dt = match.Groups[2].Value == "+" ? dt.Add(mod.TimeOfDay) : dt.Subtract(mod.TimeOfDay); } diff --git a/RestSharp/FileParameter.cs b/RestSharp/FileParameter.cs index 5747eb6a4..51fdfe3c7 100644 --- a/RestSharp/FileParameter.cs +++ b/RestSharp/FileParameter.cs @@ -19,9 +19,9 @@ public class FileParameter public static FileParameter Create(string name, byte[] data, string filename, string contentType) { #if FRAMEWORK - var length = data.LongLength; + long length = data.LongLength; #else - var length = (long)data.Length; + long length = data.Length; #endif return new FileParameter diff --git a/RestSharp/Http.Async.cs b/RestSharp/Http.Async.cs index 92994fe20..221362dba 100644 --- a/RestSharp/Http.Async.cs +++ b/RestSharp/Http.Async.cs @@ -15,19 +15,20 @@ #endregion using System; -using System.Linq; +using System.IO; using System.Net; -using System.Threading; using RestSharp.Extensions; +#if !WINDOWS_PHONE +using System.Linq; +#endif + #if SILVERLIGHT -using System.Windows.Browser; using System.Net.Browser; #endif -#if WINDOWS_PHONE -using System.Windows.Threading; -using System.Windows; +#if !WINDOWS_PHONE && !SILVERLIGHT +using System.Threading; #endif namespace RestSharp @@ -107,7 +108,7 @@ private HttpWebRequest GetStyleMethodInternalAsync(string method, Action ResponseCallback(result, callback), webRequest); + IAsyncResult asyncResult = webRequest.BeginGetResponse(result => ResponseCallback(result, callback), webRequest); SetTimeout(asyncResult, this.timeoutState); } @@ -135,8 +136,8 @@ private HttpWebRequest GetStyleMethodInternalAsync(string method, Action callback) { - var webRequest = (HttpWebRequest)result.AsyncState; + HttpWebRequest webRequest = (HttpWebRequest)result.AsyncState; if (this.timeoutState.TimedOut) { - var response = new HttpResponse { ResponseStatus = ResponseStatus.TimedOut }; + HttpResponse response = new HttpResponse { ResponseStatus = ResponseStatus.TimedOut }; ExecuteCallback(response, callback); @@ -234,7 +237,7 @@ private void RequestStreamCallback(IAsyncResult result, Action cal // write body to request stream try { - using (var requestStream = webRequest.EndGetRequestStream(result)) + using (Stream requestStream = webRequest.EndGetRequestStream(result)) { if (HasFiles || AlwaysMultipartFormData) { @@ -278,7 +281,7 @@ private static void TimeoutCallback(object state, bool timedOut) if (!timedOut) return; - var timeoutState = state as TimeOutState; + TimeOutState timeoutState = state as TimeOutState; if (timeoutState == null) { @@ -302,7 +305,7 @@ private static void GetRawResponseAsync(IAsyncResult result, Action callback) { - var response = new HttpResponse { ResponseStatus = ResponseStatus.None }; + HttpResponse response = new HttpResponse { ResponseStatus = ResponseStatus.None }; try { @@ -400,7 +403,7 @@ private HttpWebRequest ConfigureAsyncWebRequest(string method, Uri url) WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp); WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp); #endif - var webRequest = (HttpWebRequest)WebRequest.Create(url); + HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.UseDefaultCredentials = UseDefaultCredentials; diff --git a/RestSharp/Http.Sync.cs b/RestSharp/Http.Sync.cs index 79269d728..a78340724 100644 --- a/RestSharp/Http.Sync.cs +++ b/RestSharp/Http.Sync.cs @@ -17,6 +17,7 @@ #if FRAMEWORK using System; +using System.IO; using System.Net; using RestSharp.Extensions; @@ -113,7 +114,7 @@ public HttpResponse AsPost(string httpMethod) private HttpResponse GetStyleMethodInternal(string method) { - var webRequest = ConfigureWebRequest(method, Url); + HttpWebRequest webRequest = ConfigureWebRequest(method, Url); if (HasBody && (method == "DELETE" || method == "OPTIONS")) { @@ -126,7 +127,7 @@ private HttpResponse GetStyleMethodInternal(string method) private HttpResponse PostPutInternal(string method) { - var webRequest = ConfigureWebRequest(method, Url); + HttpWebRequest webRequest = ConfigureWebRequest(method, Url); PreparePostBody(webRequest); @@ -147,7 +148,7 @@ partial void AddSyncHeaderActions() private void ExtractErrorResponse(HttpResponse httpResponse, Exception ex) { - var webException = ex as WebException; + WebException webException = ex as WebException; if (webException != null && webException.Status == WebExceptionStatus.Timeout) { @@ -165,11 +166,11 @@ private void ExtractErrorResponse(HttpResponse httpResponse, Exception ex) private HttpResponse GetResponse(HttpWebRequest request) { - var response = new HttpResponse { ResponseStatus = ResponseStatus.None }; + HttpResponse response = new HttpResponse { ResponseStatus = ResponseStatus.None }; try { - var webResponse = GetRawResponse(request); + HttpWebResponse webResponse = GetRawResponse(request); ExtractResponseData(response, webResponse); } @@ -220,7 +221,7 @@ private void WriteRequestBody(HttpWebRequest webRequest) #endif } - using (var requestStream = webRequest.GetRequestStream()) + using (Stream requestStream = webRequest.GetRequestStream()) { if (HasFiles || AlwaysMultipartFormData) { @@ -241,7 +242,7 @@ private void WriteRequestBody(HttpWebRequest webRequest) // TODO: duplication at the moment). private HttpWebRequest ConfigureWebRequest(string method, Uri url) { - var webRequest = (HttpWebRequest)WebRequest.Create(url); + HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.UseDefaultCredentials = UseDefaultCredentials; webRequest.PreAuthenticate = PreAuthenticate; diff --git a/RestSharp/Http.cs b/RestSharp/Http.cs index 536dee85a..ff6a064ec 100644 --- a/RestSharp/Http.cs +++ b/RestSharp/Http.cs @@ -19,7 +19,6 @@ using System.IO; using System.Linq; using System.Net; -using System.Security.Cryptography.X509Certificates; using System.Text; using RestSharp.Extensions; @@ -29,6 +28,7 @@ #if FRAMEWORK using System.Net.Cache; +using System.Security.Cryptography.X509Certificates; #endif namespace RestSharp @@ -259,7 +259,8 @@ private static string GetMultipartFormContentType() private static string GetMultipartFileHeader(HttpFile file) { - return string.Format("--{0}{4}Content-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"{4}Content-Type: {3}{4}{4}", + return string.Format( + "--{0}{4}Content-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"{4}Content-Type: {3}{4}{4}", FORM_BOUNDARY, file.Name, file.FileName, file.ContentType ?? "application/octet-stream", LINE_BREAK); } @@ -283,7 +284,7 @@ private static string GetMultipartFooter() // http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.headers.aspx private void AppendHeaders(HttpWebRequest webRequest) { - foreach (var header in Headers) + foreach (HttpHeader header in Headers) { if (restrictedHeaderActions.ContainsKey(header.Name)) { @@ -304,10 +305,10 @@ private void AppendCookies(HttpWebRequest webRequest) { webRequest.CookieContainer = this.CookieContainer ?? new CookieContainer(); - foreach (var httpCookie in Cookies) + foreach (HttpCookie httpCookie in Cookies) { #if FRAMEWORK - var cookie = new Cookie + Cookie cookie = new Cookie { Name = httpCookie.Name, Value = httpCookie.Value, @@ -316,12 +317,12 @@ private void AppendCookies(HttpWebRequest webRequest) webRequest.CookieContainer.Add(cookie); #else - var cookie = new Cookie + Cookie cookie = new Cookie { Name = httpCookie.Name, Value = httpCookie.Value }; - var uri = webRequest.RequestUri; + Uri uri = webRequest.RequestUri; webRequest.CookieContainer.Add(new Uri(string.Format("{0}://{1}", uri.Scheme, uri.Host)), cookie); #endif @@ -330,9 +331,9 @@ private void AppendCookies(HttpWebRequest webRequest) private string EncodeParameters() { - var querystring = new StringBuilder(); + StringBuilder querystring = new StringBuilder(); - foreach (var p in Parameters) + foreach (HttpParameter p in Parameters) { if (querystring.Length > 1) querystring.Append("&"); @@ -362,19 +363,19 @@ private void PreparePostBody(HttpWebRequest webRequest) private void WriteStringTo(Stream stream, string toWrite) { - var bytes = this.Encoding.GetBytes(toWrite); + byte[] bytes = this.Encoding.GetBytes(toWrite); stream.Write(bytes, 0, bytes.Length); } private void WriteMultipartFormData(Stream requestStream) { - foreach (var param in Parameters) + foreach (HttpParameter param in Parameters) { WriteStringTo(requestStream, GetMultipartFormData(param)); } - foreach (var file in Files) + foreach (HttpFile file in Files) { // Add just the first part of this param, since we will write the file data directly to the Stream WriteStringTo(requestStream, GetMultipartFileHeader(file)); @@ -401,9 +402,9 @@ private void ExtractResponseData(HttpResponse response, HttpWebResponse webRespo Stream webResponseStream = webResponse.GetResponseStream(); #if WINDOWS_PHONE - if (String.Equals(webResponse.Headers[HttpRequestHeader.ContentEncoding], "gzip", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(webResponse.Headers[HttpRequestHeader.ContentEncoding], "gzip", StringComparison.OrdinalIgnoreCase)) { - var gzStream = new GZipStream(webResponseStream); + GZipStream gzStream = new GZipStream(webResponseStream); ProcessResponseStream(gzStream, response); } @@ -444,9 +445,9 @@ private void ExtractResponseData(HttpResponse response, HttpWebResponse webRespo } } - foreach (var headerName in webResponse.Headers.AllKeys) + foreach (string headerName in webResponse.Headers.AllKeys) { - var headerValue = webResponse.Headers[headerName]; + string headerValue = webResponse.Headers[headerName]; response.Headers.Add(new HttpHeader { Name = headerName, Value = headerValue }); } diff --git a/RestSharp/IHttp.cs b/RestSharp/IHttp.cs index d6b24faf9..f0b3a170d 100644 --- a/RestSharp/IHttp.cs +++ b/RestSharp/IHttp.cs @@ -18,11 +18,11 @@ using System.Collections.Generic; using System.IO; using System.Net; -using System.Security.Cryptography.X509Certificates; using System.Text; #if FRAMEWORK using System.Net.Cache; +using System.Security.Cryptography.X509Certificates; #endif namespace RestSharp diff --git a/RestSharp/IRestClient.cs b/RestSharp/IRestClient.cs index 0e54706ba..c4efa26dc 100644 --- a/RestSharp/IRestClient.cs +++ b/RestSharp/IRestClient.cs @@ -17,7 +17,6 @@ using System; using System.Net; using System.Collections.Generic; -using System.Security.Cryptography.X509Certificates; using System.Text; using RestSharp.Authenticators; using RestSharp.Deserializers; @@ -29,6 +28,7 @@ #if FRAMEWORK using System.Net.Cache; +using System.Security.Cryptography.X509Certificates; #endif namespace RestSharp diff --git a/RestSharp/RestClient.Async.cs b/RestSharp/RestClient.Async.cs index f8c5dd4ed..e235ab870 100644 --- a/RestSharp/RestClient.Async.cs +++ b/RestSharp/RestClient.Async.cs @@ -16,13 +16,12 @@ using System; using System.Threading; +using System.Net; #if NET4 || MONODROID || MONOTOUCH || WP8 using System.Threading.Tasks; #endif -using System.Net; - namespace RestSharp { public partial class RestClient @@ -79,20 +78,18 @@ private RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action callback, string httpMethod, Func, string, HttpWebRequest> getWebRequest) { - var http = this.HttpFactory.Create(); + IHttp http = this.HttpFactory.Create(); this.AuthenticateIfNeeded(this, request); - this.ConfigureHttp(request, http); - var asyncHandle = new RestRequestAsyncHandle(); - + RestRequestAsyncHandle asyncHandle = new RestRequestAsyncHandle(); Action responseCb = r => this.ProcessResponse(request, r, asyncHandle, callback); if (this.UseSynchronizationContext && SynchronizationContext.Current != null) { - var ctx = SynchronizationContext.Current; - var cb = responseCb; + SynchronizationContext ctx = SynchronizationContext.Current; + Action cb = responseCb; responseCb = resp => ctx.Post(s => cb(resp), null); } @@ -115,7 +112,7 @@ private static HttpWebRequest DoAsPostAsync(IHttp http, Action res private void ProcessResponse(IRestRequest request, HttpResponse httpResponse, RestRequestAsyncHandle asyncHandle, Action callback) { - var restResponse = ConvertToRestResponse(request, httpResponse); + RestResponse restResponse = ConvertToRestResponse(request, httpResponse); callback(restResponse, asyncHandle); } @@ -264,28 +261,34 @@ public virtual Task> ExecuteTaskAsync(IRestRequest request, throw new ArgumentNullException("request"); } - var taskCompletionSource = new TaskCompletionSource>(); + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource>(); try { - var async = this.ExecuteAsync(request, (response, _) => + RestRequestAsyncHandle async = this.ExecuteAsync( + request, + (response, _) => { if (token.IsCancellationRequested) { taskCompletionSource.TrySetCanceled(); } - //Don't run TrySetException, since we should set Error properties and swallow exceptions to be consistent with sync methods + // Don't run TrySetException, since we should set Error properties and swallow exceptions + // to be consistent with sync methods else { taskCompletionSource.TrySetResult(response); } }); - var registration = token.Register(() => - { - async.Abort(); - taskCompletionSource.TrySetCanceled(); - }); +#if !WINDOWS_PHONE + CancellationTokenRegistration registration = +#endif + token.Register(() => + { + async.Abort(); + taskCompletionSource.TrySetCanceled(); + }); #if !WINDOWS_PHONE taskCompletionSource.Task.ContinueWith(t => registration.Dispose(), token); @@ -372,30 +375,35 @@ public virtual Task ExecuteTaskAsync(IRestRequest request, Cancel throw new ArgumentNullException("request"); } - var taskCompletionSource = new TaskCompletionSource(); + TaskCompletionSource taskCompletionSource = new TaskCompletionSource(); try { - var async = this.ExecuteAsync(request, (response, _) => - { - if (token.IsCancellationRequested) - { - taskCompletionSource.TrySetCanceled(); - } - // Don't run TrySetException, since we should set Error - // properties and swallow exceptions to be consistent - // with sync methods - else - { - taskCompletionSource.TrySetResult(response); - } - }); - - var registration = token.Register(() => - { - async.Abort(); - taskCompletionSource.TrySetCanceled(); - }); + RestRequestAsyncHandle async = this.ExecuteAsync( + request, + (response, _) => + { + if (token.IsCancellationRequested) + { + taskCompletionSource.TrySetCanceled(); + } + // Don't run TrySetException, since we should set Error + // properties and swallow exceptions to be consistent + // with sync methods + else + { + taskCompletionSource.TrySetResult(response); + } + }); + +#if !WINDOWS_PHONE + CancellationTokenRegistration registration = +#endif + token.Register(() => + { + async.Abort(); + taskCompletionSource.TrySetCanceled(); + }); #if !WINDOWS_PHONE taskCompletionSource.Task.ContinueWith(t => registration.Dispose(), token); diff --git a/RestSharp/RestClient.Sync.cs b/RestSharp/RestClient.Sync.cs index 16649c958..a81ecded5 100644 --- a/RestSharp/RestClient.Sync.cs +++ b/RestSharp/RestClient.Sync.cs @@ -13,7 +13,7 @@ public partial class RestClient /// Response data public byte[] DownloadData(IRestRequest request) { - var response = Execute(request); + IRestResponse response = Execute(request); return response.RawBytes; } @@ -25,7 +25,7 @@ public byte[] DownloadData(IRestRequest request) /// RestResponse public virtual IRestResponse Execute(IRestRequest request) { - var method = Enum.GetName(typeof (Method), request.Method); + string method = Enum.GetName(typeof (Method), request.Method); switch (request.Method) { @@ -61,7 +61,7 @@ private IRestResponse Execute(IRestRequest request, string httpMethod, try { - var http = HttpFactory.Create(); + IHttp http = HttpFactory.Create(); ConfigureHttp(request, http); diff --git a/RestSharp/RestClient.cs b/RestSharp/RestClient.cs index b58831e7a..d7f6c2e0c 100644 --- a/RestSharp/RestClient.cs +++ b/RestSharp/RestClient.cs @@ -19,7 +19,6 @@ using System.Linq; using System.Net; using System.Reflection; -using System.Security.Cryptography.X509Certificates; using System.Text; using System.Text.RegularExpressions; using RestSharp.Authenticators; @@ -28,6 +27,7 @@ #if FRAMEWORK using System.Net.Cache; +using System.Security.Cryptography.X509Certificates; #endif namespace RestSharp @@ -185,7 +185,7 @@ public void AddHandler(string contentType, IDeserializer deserializer) { this.AcceptTypes.Add(contentType); // add Accept header based on registered deserializers - var accepts = string.Join(", ", AcceptTypes.ToArray()); + string accepts = string.Join(", ", AcceptTypes.ToArray()); this.RemoveDefaultParameter("Accept"); this.AddDefaultParameter("Accept", accepts, ParameterType.HttpHeader); @@ -228,7 +228,7 @@ private IDeserializer GetHandler(string contentType) return ContentHandlers["*"]; } - var semicolonIndex = contentType.IndexOf(';'); + int semicolonIndex = contentType.IndexOf(';'); if (semicolonIndex > -1) contentType = contentType.Substring(0, semicolonIndex); @@ -279,11 +279,11 @@ public Uri BuildUri(IRestRequest request) if (this.BaseUrl == null) throw new NullReferenceException("RestClient must contain a value for BaseUrl"); - var assembled = request.Resource; - var urlParms = request.Parameters.Where(p => p.Type == ParameterType.UrlSegment); - var builder = new UriBuilder(this.BaseUrl); + string assembled = request.Resource; + IEnumerable urlParms = request.Parameters.Where(p => p.Type == ParameterType.UrlSegment); + UriBuilder builder = new UriBuilder(this.BaseUrl); - foreach (var p in urlParms) + foreach (Parameter p in urlParms) { if (p.Value == null) { @@ -331,8 +331,8 @@ public Uri BuildUri(IRestRequest request) return new Uri(assembled); // build and attach querystring - var data = EncodeParameters(parameters); - var separator = assembled != null && assembled.Contains("?") ? "&" : "?"; + string data = EncodeParameters(parameters); + string separator = assembled != null && assembled.Contains("?") ? "&" : "?"; assembled = string.Concat(assembled, separator, data); @@ -360,7 +360,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) http.CookieContainer = CookieContainer; // move RestClient.DefaultParameters into Request.Parameters - foreach (var p in DefaultParameters) + foreach (Parameter p in DefaultParameters) { if (request.Parameters.Any(p2 => p2.Name == p.Name && p2.Type == p.Type)) { @@ -373,7 +373,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) // Add Accept header based on registered deserializers if none has been set by the caller. if (request.Parameters.All(p2 => p2.Name.ToLowerInvariant() != "accept")) { - var accepts = string.Join(", ", AcceptTypes.ToArray()); + string accepts = string.Join(", ", AcceptTypes.ToArray()); request.AddParameter("Accept", accepts, ParameterType.HttpHeader); } @@ -381,18 +381,18 @@ private void ConfigureHttp(IRestRequest request, IHttp http) http.Url = BuildUri(request); http.PreAuthenticate = this.PreAuthenticate; - var userAgent = UserAgent ?? http.UserAgent; + string userAgent = UserAgent ?? http.UserAgent; http.UserAgent = userAgent.HasValue() ? userAgent : "RestSharp/" + version; - var timeout = request.Timeout > 0 ? request.Timeout : Timeout; + int timeout = request.Timeout > 0 ? request.Timeout : Timeout; if (timeout > 0) { http.Timeout = timeout; } - var readWriteTimeout = request.ReadWriteTimeout > 0 ? request.ReadWriteTimeout : ReadWriteTimeout; + int readWriteTimeout = request.ReadWriteTimeout > 0 ? request.ReadWriteTimeout : ReadWriteTimeout; if (readWriteTimeout > 0) { @@ -418,46 +418,46 @@ private void ConfigureHttp(IRestRequest request, IHttp http) http.Credentials = request.Credentials; } - var headers = from p in request.Parameters - where p.Type == ParameterType.HttpHeader - select new HttpHeader - { - Name = p.Name, - Value = Convert.ToString(p.Value) - }; + IEnumerable headers = from p in request.Parameters + where p.Type == ParameterType.HttpHeader + select new HttpHeader + { + Name = p.Name, + Value = Convert.ToString(p.Value) + }; - foreach (var header in headers) + foreach (HttpHeader header in headers) { http.Headers.Add(header); } - var cookies = from p in request.Parameters - where p.Type == ParameterType.Cookie - select new HttpCookie - { - Name = p.Name, - Value = Convert.ToString(p.Value) - }; + IEnumerable cookies = from p in request.Parameters + where p.Type == ParameterType.Cookie + select new HttpCookie + { + Name = p.Name, + Value = Convert.ToString(p.Value) + }; - foreach (var cookie in cookies) + foreach (HttpCookie cookie in cookies) { http.Cookies.Add(cookie); } - var @params = from p in request.Parameters - where p.Type == ParameterType.GetOrPost && p.Value != null - select new HttpParameter - { - Name = p.Name, - Value = Convert.ToString(p.Value) - }; + IEnumerable @params = from p in request.Parameters + where p.Type == ParameterType.GetOrPost && p.Value != null + select new HttpParameter + { + Name = p.Name, + Value = Convert.ToString(p.Value) + }; - foreach (var parameter in @params) + foreach (HttpParameter parameter in @params) { http.Parameters.Add(parameter); } - foreach (var file in request.Files) + foreach (FileParameter file in request.Files) { http.Files.Add(new HttpFile { @@ -513,24 +513,24 @@ private void ConfigureProxy(IHttp http) private static RestResponse ConvertToRestResponse(IRestRequest request, HttpResponse httpResponse) { - var restResponse = new RestResponse - { - Content = httpResponse.Content, - ContentEncoding = httpResponse.ContentEncoding, - ContentLength = httpResponse.ContentLength, - ContentType = httpResponse.ContentType, - ErrorException = httpResponse.ErrorException, - ErrorMessage = httpResponse.ErrorMessage, - RawBytes = httpResponse.RawBytes, - ResponseStatus = httpResponse.ResponseStatus, - ResponseUri = httpResponse.ResponseUri, - Server = httpResponse.Server, - StatusCode = httpResponse.StatusCode, - StatusDescription = httpResponse.StatusDescription, - Request = request - }; - - foreach (var header in httpResponse.Headers) + RestResponse restResponse = new RestResponse + { + Content = httpResponse.Content, + ContentEncoding = httpResponse.ContentEncoding, + ContentLength = httpResponse.ContentLength, + ContentType = httpResponse.ContentType, + ErrorException = httpResponse.ErrorException, + ErrorMessage = httpResponse.ErrorMessage, + RawBytes = httpResponse.RawBytes, + ResponseStatus = httpResponse.ResponseStatus, + ResponseUri = httpResponse.ResponseUri, + Server = httpResponse.Server, + StatusCode = httpResponse.StatusCode, + StatusDescription = httpResponse.StatusDescription, + Request = request + }; + + foreach (HttpHeader header in httpResponse.Headers) { restResponse.Headers.Add(new Parameter { @@ -540,7 +540,7 @@ private static RestResponse ConvertToRestResponse(IRestRequest request, HttpResp }); } - foreach (var cookie in httpResponse.Cookies) + foreach (HttpCookie cookie in httpResponse.Cookies) { restResponse.Cookies.Add(new RestResponseCookie { diff --git a/RestSharp/RestClientExtensions.cs b/RestSharp/RestClientExtensions.cs index 32a3e8db2..047f38718 100644 --- a/RestSharp/RestClientExtensions.cs +++ b/RestSharp/RestClientExtensions.cs @@ -331,7 +331,7 @@ public static void AddDefaultParameter(this IRestClient restClient, Parameter p) /// public static void RemoveDefaultParameter(this IRestClient restClient, string name) { - var parameter = restClient.DefaultParameters.SingleOrDefault( + Parameter parameter = restClient.DefaultParameters.SingleOrDefault( p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); if (parameter != null) diff --git a/RestSharp/RestRequest.cs b/RestSharp/RestRequest.cs index c4cb58f15..ec47bb870 100644 --- a/RestSharp/RestRequest.cs +++ b/RestSharp/RestRequest.cs @@ -19,10 +19,14 @@ using System.IO; using System.Linq; using System.Net; +using System.Reflection; using System.Text.RegularExpressions; -using RestSharp.Extensions; using RestSharp.Serializers; +#if FRAMEWORK +using RestSharp.Extensions; +#endif + namespace RestSharp { /// @@ -136,7 +140,7 @@ public IRestRequest AddFile(string name, string path, string contentType = null) ContentLength = fileLength, Writer = s => { - using (var file = new StreamReader(path)) + using (StreamReader file = new StreamReader(path)) { file.BaseStream.CopyTo(s); } @@ -204,7 +208,7 @@ public IRestRequest AddFileBytes(string name, byte[] bytes, string filename, str ContentType = contentType, Writer = s => { - using (var file = new StreamReader(new MemoryStream(bytes))) + using (StreamReader file = new StreamReader(new MemoryStream(bytes))) { file.BaseStream.CopyTo(s); } @@ -268,6 +272,7 @@ public IRestRequest AddBody(object obj) public IRestRequest AddJsonBody(object obj) { this.RequestFormat = DataFormat.Json; + return this.AddBody(obj, ""); } @@ -279,6 +284,7 @@ public IRestRequest AddJsonBody(object obj) public IRestRequest AddXmlBody(object obj) { this.RequestFormat = DataFormat.Xml; + return this.AddBody(obj, ""); } @@ -308,10 +314,10 @@ public IRestRequest AddXmlBody(object obj, string xmlNamespace) public IRestRequest AddObject(object obj, params string[] includedProperties) { // automatically create parameters from object props - var type = obj.GetType(); - var props = type.GetProperties(); + Type type = obj.GetType(); + PropertyInfo[] props = type.GetProperties(); - foreach (var prop in props) + foreach (PropertyInfo prop in props) { bool isAllowed = includedProperties.Length == 0 || (includedProperties.Length > 0 && includedProperties.Contains(prop.Name)); @@ -319,22 +325,22 @@ public IRestRequest AddObject(object obj, params string[] includedProperties) if (!isAllowed) continue; - var propType = prop.PropertyType; - var val = prop.GetValue(obj, null); + Type propType = prop.PropertyType; + object val = prop.GetValue(obj, null); if (val == null) continue; if (propType.IsArray) { - var elementType = propType.GetElementType(); + Type elementType = propType.GetElementType(); if (((Array)val).Length > 0 && elementType != null && (elementType.IsPrimitive|| elementType.IsValueType || elementType == typeof(string))) { // convert the array to an array of strings - var values = (from object item in ((Array)val) + string[] values = (from object item in ((Array)val) select item.ToString()) .ToArray(); diff --git a/RestSharp/Serializers/DotNetXmlSerializer.cs b/RestSharp/Serializers/DotNetXmlSerializer.cs index e322821f3..d09351faa 100644 --- a/RestSharp/Serializers/DotNetXmlSerializer.cs +++ b/RestSharp/Serializers/DotNetXmlSerializer.cs @@ -35,12 +35,12 @@ public DotNetXmlSerializer(string @namespace) /// XML as string public string Serialize(object obj) { - var ns = new XmlSerializerNamespaces(); + XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add(string.Empty, Namespace); - var serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType()); - var writer = new EncodingStringWriter(Encoding); + System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType()); + EncodingStringWriter writer = new EncodingStringWriter(Encoding); serializer.Serialize(writer, obj, ns); diff --git a/RestSharp/Serializers/SerializeAsAttribute.cs b/RestSharp/Serializers/SerializeAsAttribute.cs index 7fcf63e27..6a0ced7d1 100644 --- a/RestSharp/Serializers/SerializeAsAttribute.cs +++ b/RestSharp/Serializers/SerializeAsAttribute.cs @@ -67,7 +67,7 @@ public SerializeAsAttribute() /// String public string TransformName(string input) { - var name = this.Name ?? input; + string name = this.Name ?? input; switch (NameStyle) { diff --git a/RestSharp/Serializers/XmlSerializer.cs b/RestSharp/Serializers/XmlSerializer.cs index 70453c3c7..16e0decce 100644 --- a/RestSharp/Serializers/XmlSerializer.cs +++ b/RestSharp/Serializers/XmlSerializer.cs @@ -16,8 +16,10 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Reflection; using System.Xml.Linq; using RestSharp.Extensions; @@ -53,26 +55,26 @@ public XmlSerializer(string @namespace) /// XML as string public string Serialize(object obj) { - var doc = new XDocument(); - var t = obj.GetType(); - var name = t.Name; - var options = t.GetAttribute(); + XDocument doc = new XDocument(); + Type t = obj.GetType(); + string name = t.Name; + SerializeAsAttribute options = t.GetAttribute(); if (options != null) { name = options.TransformName(options.Name ?? name); } - var root = new XElement(name.AsNamespaced(Namespace)); + XElement root = new XElement(name.AsNamespaced(Namespace)); if (obj is IList) { - var itemTypeName = ""; + string itemTypeName = ""; - foreach (var item in (IList)obj) + foreach (object item in (IList)obj) { - var type = item.GetType(); - var opts = type.GetAttribute(); + Type type = item.GetType(); + SerializeAsAttribute opts = type.GetAttribute(); if (opts != null) { @@ -84,7 +86,7 @@ public string Serialize(object obj) itemTypeName = type.Name; } - var instance = new XElement(itemTypeName.AsNamespaced(Namespace)); + XElement instance = new XElement(itemTypeName.AsNamespaced(Namespace)); Map(instance, item); root.Add(instance); @@ -95,7 +97,7 @@ public string Serialize(object obj) if (RootElement.HasValue()) { - var wrapper = new XElement(RootElement.AsNamespaced(Namespace), root); + XElement wrapper = new XElement(RootElement.AsNamespaced(Namespace), root); doc.Add(wrapper); } else @@ -108,28 +110,28 @@ public string Serialize(object obj) private void Map(XContainer root, object obj) { - var objType = obj.GetType(); - var props = from p in objType.GetProperties() + Type objType = obj.GetType(); + IEnumerable props = from p in objType.GetProperties() let indexAttribute = p.GetAttribute() where p.CanRead && p.CanWrite orderby indexAttribute == null ? int.MaxValue : indexAttribute.Index select p; - var globalOptions = objType.GetAttribute(); + SerializeAsAttribute globalOptions = objType.GetAttribute(); - foreach (var prop in props) + foreach (PropertyInfo prop in props) { - var name = prop.Name; - var rawValue = prop.GetValue(obj, null); + string name = prop.Name; + object rawValue = prop.GetValue(obj, null); if (rawValue == null) { continue; } - var value = GetSerializedValue(rawValue); - var propType = prop.PropertyType; - var useAttribute = false; - var settings = prop.GetAttribute(); + string value = GetSerializedValue(rawValue); + Type propType = prop.PropertyType; + bool useAttribute = false; + SerializeAsAttribute settings = prop.GetAttribute(); if (settings != null) { @@ -137,7 +139,7 @@ where p.CanRead && p.CanWrite useAttribute = settings.Attribute; } - var options = prop.GetAttribute(); + SerializeAsAttribute options = prop.GetAttribute(); if (options != null) { @@ -148,8 +150,8 @@ where p.CanRead && p.CanWrite name = globalOptions.TransformName(name); } - var nsName = name.AsNamespaced(Namespace); - var element = new XElement(nsName); + XName nsName = name.AsNamespaced(Namespace); + XElement element = new XElement(nsName); if (propType.IsPrimitive || propType.IsValueType || propType == typeof(string)) { @@ -163,21 +165,21 @@ where p.CanRead && p.CanWrite } else if (rawValue is IList) { - var itemTypeName = ""; + string itemTypeName = ""; - foreach (var item in (IList)rawValue) + foreach (object item in (IList)rawValue) { if (itemTypeName == "") { - var type = item.GetType(); - var setting = type.GetAttribute(); + Type type = item.GetType(); + SerializeAsAttribute setting = type.GetAttribute(); itemTypeName = setting != null && setting.Name.HasValue() ? setting.Name : type.Name; } - var instance = new XElement(itemTypeName.AsNamespaced(Namespace)); + XElement instance = new XElement(itemTypeName.AsNamespaced(Namespace)); Map(instance, item); element.Add(instance); @@ -194,7 +196,7 @@ where p.CanRead && p.CanWrite private string GetSerializedValue(object obj) { - var output = obj; + object output = obj; if (obj is DateTime && DateFormat.HasValue()) { diff --git a/RestSharp/SharedAssemblyInfo.cs b/RestSharp/SharedAssemblyInfo.cs index 47d4c5a35..b064dc2ae 100644 --- a/RestSharp/SharedAssemblyInfo.cs +++ b/RestSharp/SharedAssemblyInfo.cs @@ -22,22 +22,22 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion(SharedAssemblyInfo.Version + ".0")] +[assembly: AssemblyVersion(SharedAssemblyInfo.VERSION + ".0")] #if SIGNED -[assembly: AssemblyInformationalVersion(SharedAssemblyInfo.FileVersion)] -[assembly: AssemblyFileVersion(SharedAssemblyInfo.FileVersion + ".0")] +[assembly: AssemblyInformationalVersion(SharedAssemblyInfo.FILE_VERSION)] +[assembly: AssemblyFileVersion(SharedAssemblyInfo.FILE_VERSION + ".0")] #else -[assembly: AssemblyInformationalVersion(SharedAssemblyInfo.Version)] -[assembly: AssemblyFileVersion(SharedAssemblyInfo.Version + ".0")] +[assembly: AssemblyInformationalVersion(SharedAssemblyInfo.VERSION)] +[assembly: AssemblyFileVersion(SharedAssemblyInfo.VERSION + ".0")] #endif class SharedAssemblyInfo { #if SIGNED - public const string Version = "100.0.0"; - public const string FileVersion = "105.1.0"; + public const string VERSION = "100.0.0"; + public const string FILE_VERSION = "105.1.0"; #else - public const string Version = "105.1.0"; + public const string VERSION = "105.1.0"; #endif } From c0958f1c2fefedc56d5b8cf9df19e32b917d8818 Mon Sep 17 00:00:00 2001 From: Michael Hallett Date: Sat, 15 Aug 2015 23:44:14 -0700 Subject: [PATCH 6/9] more code clean up; brought some style consistency to the project; --- RestSharp.IntegrationTests/App.config | 12 +- RestSharp.IntegrationTests/AsyncTests.cs | 12 +- .../AuthenticationTests.cs | 18 +- .../CompressionTests.cs | 4 +- .../Helpers/Handlers.cs | 7 +- .../Helpers/SimpleServer.cs | 8 +- .../Models/LinkedINMemberProfile.cs | 3 +- .../MultipartFormDataTests.cs | 50 +- .../NonProtocolExceptionHandlingTests.cs | 10 +- .../Properties/AssemblyInfo.cs | 4 + .../RequestHeadTests.cs | 16 +- RestSharp.IntegrationTests/StatusCodeTests.cs | 22 +- .../StructuredSyntaxSuffixTests.cs | 1 + RestSharp.IntegrationTests/oAuth1Tests.cs | 16 +- RestSharp.IntegrationTests/packages.config | 3 +- RestSharp.Tests/AddRangeTests.cs | 4 +- RestSharp.Tests/CultureChange.cs | 2 + RestSharp.Tests/Fakes/NullHttp.cs | 3 +- .../InterfaceImplementationTests.cs | 6 +- RestSharp.Tests/JsonTests.cs | 57 +- RestSharp.Tests/JwtAuthTests.cs | 17 +- RestSharp.Tests/NamespacedXmlTests.cs | 2 + RestSharp.Tests/NuSpecUpdateTask.cs | 13 +- RestSharp.Tests/OAuthTests.cs | 1 - RestSharp.Tests/Properties/AssemblyInfo.cs | 5 +- RestSharp.Tests/RestSharp.Tests.Signed.csproj | 3 + RestSharp.Tests/RestSharp.Tests.csproj | 5 +- RestSharp.Tests/SampleClasses/BooleanTest.cs | 3 +- .../SampleClasses/EmployeeTracker.cs | 3 +- RestSharp.Tests/SampleClasses/EnumTest.cs | 3 +- RestSharp.Tests/SampleClasses/ListSamples.cs | 2 +- RestSharp.Tests/SampleClasses/Oddball.cs | 3 +- RestSharp.Tests/SampleClasses/SOUser.cs | 5 +- RestSharp.Tests/SampleClasses/Struct.cs | 3 +- RestSharp.Tests/SampleClasses/misc.cs | 37 +- RestSharp.Tests/SerializerTests.cs | 6 +- .../XmlAttributeDeserializerTests.cs | 21 +- RestSharp.Tests/XmlDeserializerTests.cs | 38 +- RestSharp.Tests/packages.config | 5 +- .../Authenticators/HttpBasicAuthenticator.cs | 2 + RestSharp/Authenticators/IAuthenticator.cs | 2 + RestSharp/Authenticators/JwtAuthenticator.cs | 4 +- RestSharp/Authenticators/NtlmAuthenticator.cs | 4 + .../OAuth/Extensions/CollectionExtensions.cs | 4 +- .../OAuth/Extensions/OAuthExtensions.cs | 7 +- .../OAuth/Extensions/StringExtensions.cs | 7 +- RestSharp/Authenticators/OAuth/OAuthTools.cs | 41 +- .../Authenticators/OAuth/OAuthWorkflow.cs | 168 ++--- RestSharp/Authenticators/OAuth/WebPair.cs | 4 +- .../Authenticators/OAuth/WebPairCollection.cs | 12 +- .../Authenticators/OAuth1Authenticator.cs | 59 +- .../Authenticators/OAuth2Authenticator.cs | 2 + .../Authenticators/SimpleAuthenticator.cs | 5 + RestSharp/Compression/ZLib/Crc32.cs | 1 + RestSharp/Compression/ZLib/FlushType.cs | 3 +- RestSharp/Compression/ZLib/GZipStream.cs | 1 + RestSharp/Compression/ZLib/InfTree.cs | 1 + RestSharp/Compression/ZLib/Inflate.cs | 1 + RestSharp/Compression/ZLib/ZLib.cs | 1 + RestSharp/Compression/ZLib/ZLibCodec.cs | 1 + RestSharp/Compression/ZLib/ZLibConstants.cs | 1 + RestSharp/Compression/ZLib/ZLibStream.cs | 1 + .../Deserializers/DeserializeAsAttribute.cs | 2 + .../Deserializers/DotNetXmlDeserializer.cs | 4 +- RestSharp/Deserializers/IDeserializer.cs | 2 + RestSharp/Deserializers/JsonDeserializer.cs | 118 ++-- .../Deserializers/XmlAttributeDeserializer.cs | 2 + RestSharp/Deserializers/XmlDeserializer.cs | 80 ++- RestSharp/Extensions/MiscExtensions.cs | 6 + RestSharp/Extensions/MonoHttp/Helpers.cs | 2 +- RestSharp/Extensions/MonoHttp/HtmlEncoder.cs | 608 ++++++++++-------- RestSharp/Extensions/MonoHttp/HttpUtility.cs | 312 ++++----- RestSharp/Extensions/ReflectionExtensions.cs | 16 +- RestSharp/Extensions/ResponseExtensions.cs | 33 +- RestSharp/Extensions/StringExtensions.cs | 23 +- RestSharp/Extensions/XmlExtensions.cs | 4 + RestSharp/Http.Async.cs | 152 +++-- RestSharp/Http.Sync.cs | 129 ++-- RestSharp/Http.cs | 91 +-- RestSharp/HttpHeader.cs | 3 +- RestSharp/HttpParameter.cs | 3 +- RestSharp/HttpResponse.cs | 8 +- RestSharp/IHttp.cs | 2 + RestSharp/IHttpFactory.cs | 3 +- RestSharp/IRestClient.cs | 14 +- RestSharp/IRestRequest.cs | 2 + RestSharp/Parameter.cs | 4 +- RestSharp/Properties/AssemblyInfo.cs | 4 + RestSharp/RestClient.Async.cs | 13 +- RestSharp/RestClient.Sync.cs | 25 +- RestSharp/RestClient.cs | 91 ++- RestSharp/RestClientExtensions.cs | 18 +- RestSharp/RestRequest.cs | 77 ++- RestSharp/RestRequestAsyncHandle.cs | 12 +- RestSharp/RestResponse.cs | 6 +- RestSharp/Serializers/DotNetXmlSerializer.cs | 12 +- RestSharp/Serializers/ISerializer.cs | 2 + RestSharp/Serializers/JsonSerializer.cs | 2 +- RestSharp/Serializers/SerializeAsAttribute.cs | 14 +- RestSharp/Serializers/XmlSerializer.cs | 109 +++- RestSharp/SharedAssemblyInfo.cs | 15 +- RestSharp/Validation/Require.cs | 2 + RestSharp/Validation/Validate.cs | 4 + RestSharp/packages.config | 3 +- 104 files changed, 1626 insertions(+), 1171 deletions(-) diff --git a/RestSharp.IntegrationTests/App.config b/RestSharp.IntegrationTests/App.config index 544bbb783..a33cef108 100644 --- a/RestSharp.IntegrationTests/App.config +++ b/RestSharp.IntegrationTests/App.config @@ -4,19 +4,19 @@ - + - + - + - + - + - + \ No newline at end of file diff --git a/RestSharp.IntegrationTests/AsyncTests.cs b/RestSharp.IntegrationTests/AsyncTests.cs index 64bbe6f42..26b66208e 100644 --- a/RestSharp.IntegrationTests/AsyncTests.cs +++ b/RestSharp.IntegrationTests/AsyncTests.cs @@ -254,19 +254,19 @@ public void Can_Timeout_PUT_TaskAsync() } } - static void UrlToStatusCodeHandler(HttpListenerContext obj) + private static void UrlToStatusCodeHandler(HttpListenerContext obj) { obj.Response.StatusCode = int.Parse(obj.Request.Url.Segments.Last()); } public class ResponseHandler { - void error(HttpListenerContext context) + private void error(HttpListenerContext context) { context.Response.StatusCode = 400; context.Response.Headers.Add("Content-Type", "application/xml"); context.Response.OutputStream.WriteStringUtf8( -@" + @" Not found! @@ -274,10 +274,10 @@ void error(HttpListenerContext context) "); } - void success(HttpListenerContext context) + private void success(HttpListenerContext context) { context.Response.OutputStream.WriteStringUtf8( -@" + @" Works! @@ -285,7 +285,7 @@ void success(HttpListenerContext context) "); } - void timeout(HttpListenerContext context) + private void timeout(HttpListenerContext context) { Thread.Sleep(1000); } diff --git a/RestSharp.IntegrationTests/AuthenticationTests.cs b/RestSharp.IntegrationTests/AuthenticationTests.cs index d0f1f1ab2..6bb7cd440 100644 --- a/RestSharp.IntegrationTests/AuthenticationTests.cs +++ b/RestSharp.IntegrationTests/AuthenticationTests.cs @@ -21,9 +21,9 @@ public void Can_Authenticate_With_Basic_Http_Auth() using (SimpleServer.Create(baseUrl.AbsoluteUri, UsernamePasswordEchoHandler)) { RestClient client = new RestClient(baseUrl) - { - Authenticator = new HttpBasicAuthenticator("testuser", "testpassword") - }; + { + Authenticator = new HttpBasicAuthenticator("testuser", "testpassword") + }; RestRequest request = new RestRequest("test"); IRestResponse response = client.Execute(request); @@ -34,7 +34,8 @@ public void Can_Authenticate_With_Basic_Http_Auth() private static void UsernamePasswordEchoHandler(HttpListenerContext context) { string header = context.Request.Headers["Authorization"]; - string[] parts = Encoding.ASCII.GetString(Convert.FromBase64String(header.Substring("Basic ".Length))).Split(':'); + string[] parts = Encoding.ASCII.GetString(Convert.FromBase64String(header.Substring("Basic ".Length))) + .Split(':'); context.Response.OutputStream.WriteStringUtf8(string.Join("|", parts)); } @@ -44,9 +45,9 @@ public void Can_Authenticate_With_OAuth() { Uri baseUrl = new Uri("https://api.twitter.com"); RestClient client = new RestClient(baseUrl) - { - Authenticator = OAuth1Authenticator.ForRequestToken("CONSUMER_KEY", "CONSUMER_SECRET") - }; + { + Authenticator = OAuth1Authenticator.ForRequestToken("CONSUMER_KEY", "CONSUMER_SECRET") + }; RestRequest request = new RestRequest("oauth/request_token"); IRestResponse response = client.Execute(request); @@ -62,7 +63,8 @@ public void Can_Authenticate_With_OAuth() request = new RestRequest("oauth/authorize?oauth_token=" + oauthToken); - string url = client.BuildUri(request).ToString(); + string url = client.BuildUri(request) + .ToString(); Process.Start(url); diff --git a/RestSharp.IntegrationTests/CompressionTests.cs b/RestSharp.IntegrationTests/CompressionTests.cs index f34f2af9a..a1190e7ce 100644 --- a/RestSharp.IntegrationTests/CompressionTests.cs +++ b/RestSharp.IntegrationTests/CompressionTests.cs @@ -54,7 +54,7 @@ public void Can_Handle_Uncompressed_Content() } } - static Action GzipEchoValue(string value) + private static Action GzipEchoValue(string value) { return context => { @@ -67,7 +67,7 @@ static Action GzipEchoValue(string value) }; } - static Action DeflateEchoValue(string value) + private static Action DeflateEchoValue(string value) { return context => { diff --git a/RestSharp.IntegrationTests/Helpers/Handlers.cs b/RestSharp.IntegrationTests/Helpers/Handlers.cs index bfa4227cf..8be936e63 100644 --- a/RestSharp.IntegrationTests/Helpers/Handlers.cs +++ b/RestSharp.IntegrationTests/Helpers/Handlers.cs @@ -30,10 +30,13 @@ public static Action EchoValue(string value) /// public static void FileHandler(HttpListenerContext context) { - string pathToFile = Path.Combine(context.Request.Url.Segments.Select(s => s.Replace("/", "")).ToArray()); + string pathToFile = Path.Combine(context.Request.Url.Segments.Select(s => s.Replace("/", "")) + .ToArray()); using (StreamReader reader = new StreamReader(pathToFile)) + { reader.BaseStream.CopyTo(context.Response.OutputStream); + } } /// @@ -73,4 +76,4 @@ public static void FileHandler(HttpListenerContext context) }; } } -} \ No newline at end of file +} diff --git a/RestSharp.IntegrationTests/Helpers/SimpleServer.cs b/RestSharp.IntegrationTests/Helpers/SimpleServer.cs index f8514bb44..eb7706746 100644 --- a/RestSharp.IntegrationTests/Helpers/SimpleServer.cs +++ b/RestSharp.IntegrationTests/Helpers/SimpleServer.cs @@ -8,7 +8,9 @@ public class SimpleServer : IDisposable { private readonly HttpListener listener; + private readonly Action handler; + private Thread thread; private SimpleServer(HttpListener listener, Action handler) @@ -20,7 +22,11 @@ private SimpleServer(HttpListener listener, Action handler) public static SimpleServer Create(string url, Action handler, AuthenticationSchemes authenticationSchemes = AuthenticationSchemes.Anonymous) { - HttpListener listener = new HttpListener { Prefixes = { url }, AuthenticationSchemes = authenticationSchemes }; + HttpListener listener = new HttpListener + { + Prefixes = { url }, + AuthenticationSchemes = authenticationSchemes + }; SimpleServer server = new SimpleServer(listener, handler); server.Start(); diff --git a/RestSharp.IntegrationTests/Models/LinkedINMemberProfile.cs b/RestSharp.IntegrationTests/Models/LinkedINMemberProfile.cs index 7c31a7776..8f359656d 100644 --- a/RestSharp.IntegrationTests/Models/LinkedINMemberProfile.cs +++ b/RestSharp.IntegrationTests/Models/LinkedINMemberProfile.cs @@ -1,4 +1,5 @@ -namespace RestSharp.IntegrationTests.Models + +namespace RestSharp.IntegrationTests.Models { /// /// Model for used by the LinkedIN integration tests. diff --git a/RestSharp.IntegrationTests/MultipartFormDataTests.cs b/RestSharp.IntegrationTests/MultipartFormDataTests.cs index 544bc7c65..e92586567 100644 --- a/RestSharp.IntegrationTests/MultipartFormDataTests.cs +++ b/RestSharp.IntegrationTests/MultipartFormDataTests.cs @@ -39,8 +39,12 @@ public void MultipartFormData_WithParameterAndFile_Async() using (SimpleServer.Create(baseUrl, EchoHandler)) { RestClient client = new RestClient(baseUrl); - RestRequest request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; - DirectoryInfo directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()).Parent; + RestRequest request = new RestRequest("/", Method.POST) + { + AlwaysMultipartFormData = true + }; + DirectoryInfo directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()) + .Parent; if (directoryInfo != null) { @@ -53,10 +57,10 @@ public void MultipartFormData_WithParameterAndFile_Async() request.AddParameter("controlName", "test", "application/json", ParameterType.RequestBody); Task task = client.ExecuteTaskAsync(request) - .ContinueWith(x => - { - Assert.AreEqual(this.expectedFileAndBodyRequestContent, x.Result.Content); - }); + .ContinueWith(x => + { + Assert.AreEqual(this.expectedFileAndBodyRequestContent, x.Result.Content); + }); task.Wait(); } @@ -70,13 +74,16 @@ public void MultipartFormData_WithParameterAndFile() using (SimpleServer.Create(baseUrl, EchoHandler)) { RestClient client = new RestClient(baseUrl); - RestRequest request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; - DirectoryInfo directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()).Parent; + RestRequest request = new RestRequest("/", Method.POST) + { + AlwaysMultipartFormData = true + }; + DirectoryInfo directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()) + .Parent; if (directoryInfo != null) { - string path = Path.Combine(directoryInfo.FullName, - "Assets\\TestFile.txt"); + string path = Path.Combine(directoryInfo.FullName, "Assets\\TestFile.txt"); request.AddFile("fileName", path); } @@ -96,7 +103,10 @@ public void MultipartFormDataAsync() using (SimpleServer.Create(baseUrl, EchoHandler)) { RestClient client = new RestClient(baseUrl); - RestRequest request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; + RestRequest request = new RestRequest("/", Method.POST) + { + AlwaysMultipartFormData = true + }; AddParameters(request); @@ -116,7 +126,10 @@ public void MultipartFormData() using (SimpleServer.Create(baseUrl, EchoHandler)) { RestClient client = new RestClient(baseUrl); - RestRequest request = new RestRequest("/", Method.POST) { AlwaysMultipartFormData = true }; + RestRequest request = new RestRequest("/", Method.POST) + { + AlwaysMultipartFormData = true + }; AddParameters(request); @@ -135,10 +148,10 @@ public void AlwaysMultipartFormData_WithParameter_Execute() { RestClient client = new RestClient(baseUrl); RestRequest request = new RestRequest("?json_route=/posts") - { - AlwaysMultipartFormData = true, - Method = Method.POST, - }; + { + AlwaysMultipartFormData = true, + Method = Method.POST, + }; request.AddParameter("title", "test", ParameterType.RequestBody); @@ -164,7 +177,8 @@ public void AlwaysMultipartFormData_WithParameter_ExecuteTaskAsync() request.AddParameter("title", "test", ParameterType.RequestBody); - Task task = client.ExecuteTaskAsync(request).ContinueWith(x => { Assert.Null(x.Result.ErrorException); }); + Task task = client.ExecuteTaskAsync(request) + .ContinueWith(x => { Assert.Null(x.Result.ErrorException); }); task.Wait(); } @@ -218,4 +232,4 @@ private static void AddParameters(IRestRequest request) request.AddParameter("a name with spaces", "somedata"); } } -} \ No newline at end of file +} diff --git a/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs b/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs index 0600d3fb6..81ba664a8 100644 --- a/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs +++ b/RestSharp.IntegrationTests/NonProtocolExceptionHandlingTests.cs @@ -61,7 +61,10 @@ public void Handles_Server_Timeout_Error() using (SimpleServer.Create(baseUrl, TimeoutHandler)) { RestClient client = new RestClient(baseUrl); - RestRequest request = new RestRequest("404") { Timeout = 500 }; + RestRequest request = new RestRequest("404") + { + Timeout = 500 + }; IRestResponse response = client.Execute(request); Assert.NotNull(response.ErrorException); @@ -80,7 +83,10 @@ public void Handles_Server_Timeout_Error_Async() using (SimpleServer.Create(baseUrl, TimeoutHandler)) { RestClient client = new RestClient(baseUrl); - RestRequest request = new RestRequest("404") { Timeout = 500 }; + RestRequest request = new RestRequest("404") + { + Timeout = 500 + }; IRestResponse response = null; client.ExecuteAsync(request, responseCb => diff --git a/RestSharp.IntegrationTests/Properties/AssemblyInfo.cs b/RestSharp.IntegrationTests/Properties/AssemblyInfo.cs index b76f755af..69811dfb7 100644 --- a/RestSharp.IntegrationTests/Properties/AssemblyInfo.cs +++ b/RestSharp.IntegrationTests/Properties/AssemblyInfo.cs @@ -4,6 +4,7 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyTitle("RestSharp.IntegrationTests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -16,9 +17,11 @@ // 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. + [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM + [assembly: Guid("d1867cb5-67ee-49c2-afd5-3c9f371b9b4c")] // Version information for an assembly consists of the following four values: @@ -31,5 +34,6 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] + [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/RestSharp.IntegrationTests/RequestHeadTests.cs b/RestSharp.IntegrationTests/RequestHeadTests.cs index 4d9b4cd54..037345664 100644 --- a/RestSharp.IntegrationTests/RequestHeadTests.cs +++ b/RestSharp.IntegrationTests/RequestHeadTests.cs @@ -25,13 +25,17 @@ public void Does_Not_Pass_Default_Credentials_When_Server_Does_Not_Negotiate() using (SimpleServer.Create(BASE_URL, Handlers.Generic())) { RestClient client = new RestClient(BASE_URL); - RestRequest request = new RestRequest(RequestHeadCapturer.RESOURCE, httpMethod) { UseDefaultCredentials = true }; + RestRequest request = new RestRequest(RequestHeadCapturer.RESOURCE, httpMethod) + { + UseDefaultCredentials = true + }; client.Execute(request); Assert.NotNull(RequestHeadCapturer.CapturedHeaders); - string[] keys = RequestHeadCapturer.CapturedHeaders.Keys.Cast().ToArray(); + string[] keys = RequestHeadCapturer.CapturedHeaders.Keys.Cast() + .ToArray(); Assert.False(keys.Contains("Authorization"), "Authorization header was present in HTTP request from client, even though server does not use the Negotiate scheme"); @@ -46,13 +50,17 @@ public void Passes_Default_Credentials_When_UseDefaultCredentials_Is_True() using (SimpleServer.Create(BASE_URL, Handlers.Generic(), AuthenticationSchemes.Negotiate)) { RestClient client = new RestClient(BASE_URL); - RestRequest request = new RestRequest(RequestHeadCapturer.RESOURCE, httpMethod) { UseDefaultCredentials = true }; + RestRequest request = new RestRequest(RequestHeadCapturer.RESOURCE, httpMethod) + { + UseDefaultCredentials = true + }; IRestResponse response = client.Execute(request); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.NotNull(RequestHeadCapturer.CapturedHeaders); - string[] keys = RequestHeadCapturer.CapturedHeaders.Keys.Cast().ToArray(); + string[] keys = RequestHeadCapturer.CapturedHeaders.Keys.Cast() + .ToArray(); Assert.True(keys.Contains("Authorization"), "Authorization header not present in HTTP request from client, even though UseDefaultCredentials = true"); diff --git a/RestSharp.IntegrationTests/StatusCodeTests.cs b/RestSharp.IntegrationTests/StatusCodeTests.cs index bd97052d2..f191994eb 100644 --- a/RestSharp.IntegrationTests/StatusCodeTests.cs +++ b/RestSharp.IntegrationTests/StatusCodeTests.cs @@ -55,7 +55,10 @@ public void Handles_Different_Root_Element_On_Http_Error() using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.Generic())) { RestClient client = new RestClient(baseUrl); - RestRequest request = new RestRequest("error") { RootElement = "Success" }; + RestRequest request = new RestRequest("error") + { + RootElement = "Success" + }; request.OnBeforeDeserialization = resp => { @@ -80,7 +83,10 @@ public void Handles_Default_Root_Element_On_No_Error() using (SimpleServer.Create(baseUrl.AbsoluteUri, Handlers.Generic())) { RestClient client = new RestClient(baseUrl); - RestRequest request = new RestRequest("success") { RootElement = "Success" }; + RestRequest request = new RestRequest("success") + { + RootElement = "Success" + }; request.OnBeforeDeserialization = resp => { @@ -100,12 +106,12 @@ public void Handles_Default_Root_Element_On_No_Error() public class ResponseHandler { - void error(HttpListenerContext context) + private void error(HttpListenerContext context) { context.Response.StatusCode = 400; context.Response.Headers.Add("Content-Type", "application/xml"); context.Response.OutputStream.WriteStringUtf8( -@" + @" Not found! @@ -113,12 +119,12 @@ void error(HttpListenerContext context) "); } - void errorwithbody(HttpListenerContext context) + private void errorwithbody(HttpListenerContext context) { context.Response.StatusCode = 400; context.Response.Headers.Add("Content-Type", "application/xml"); context.Response.OutputStream.WriteStringUtf8( -@" + @" Not found! @@ -126,10 +132,10 @@ void errorwithbody(HttpListenerContext context) "); } - void success(HttpListenerContext context) + private void success(HttpListenerContext context) { context.Response.OutputStream.WriteStringUtf8( -@" + @" Works! diff --git a/RestSharp.IntegrationTests/StructuredSyntaxSuffixTests.cs b/RestSharp.IntegrationTests/StructuredSyntaxSuffixTests.cs index 9835be01c..612bd943c 100644 --- a/RestSharp.IntegrationTests/StructuredSyntaxSuffixTests.cs +++ b/RestSharp.IntegrationTests/StructuredSyntaxSuffixTests.cs @@ -17,6 +17,7 @@ private class Person } private const string XML_CONTENT = "Bob50"; + private const string JSON_CONTENT = @"{ ""name"":""Bob"", ""age"":50 }"; private static void QueryStringBasedContentAndContentTypeHandler(HttpListenerContext obj) diff --git a/RestSharp.IntegrationTests/oAuth1Tests.cs b/RestSharp.IntegrationTests/oAuth1Tests.cs index 0c356c269..48c12c1c3 100644 --- a/RestSharp.IntegrationTests/oAuth1Tests.cs +++ b/RestSharp.IntegrationTests/oAuth1Tests.cs @@ -45,7 +45,8 @@ public void Can_Authenticate_With_OAuth() request = new RestRequest("oauth/authorize"); request.AddParameter("oauth_token", oauthToken); - string url = client.BuildUri(request).ToString(); + string url = client.BuildUri(request) + .ToString(); Process.Start(url); @@ -187,7 +188,8 @@ public void Can_Authenticate_Netflix_With_OAuth() request.AddParameter("oauth_consumer_key", consumerKey); request.AddParameter("application_name", applicationName); - string url = sslClient.BuildUri(request).ToString(); + string url = sslClient.BuildUri(request) + .ToString(); Process.Start(url); @@ -226,7 +228,11 @@ public void Can_Authenticate_Netflix_With_OAuth() [Test] public void Properly_Encodes_Parameter_Names() { - WebParameterCollection postData = new WebParameterCollection { { "name[first]", "Chuck" }, { "name[last]", "Testa" } }; + WebParameterCollection postData = new WebParameterCollection + { + {"name[first]", "Chuck"}, + {"name[last]", "Testa"} + }; WebParameterCollection sortedParams = OAuthTools.SortParametersExcludingSignature(postData); Assert.AreEqual("name%5Bfirst%5D", sortedParams[0].Name); @@ -237,9 +243,9 @@ public void Use_RFC_3986_Encoding_For_Auth_Signature_Base() { // reserved characters for 2396 and 3986 // http://www.ietf.org/rfc/rfc2396.txt - string[] reserved2396Characters = new[] { ";", "/", "?", ":", "@", "&", "=", "+", "$", "," }; + string[] reserved2396Characters = { ";", "/", "?", ":", "@", "&", "=", "+", "$", "," }; // http://www.ietf.org/rfc/rfc3986.txt - string[] additionalReserved3986Characters = new[] { "!", "*", "'", "(", ")" }; + string[] additionalReserved3986Characters = { "!", "*", "'", "(", ")" }; string reservedCharacterString = string.Join(string.Empty, reserved2396Characters.Union(additionalReserved3986Characters)); diff --git a/RestSharp.IntegrationTests/packages.config b/RestSharp.IntegrationTests/packages.config index 512ce05d0..babd286d5 100644 --- a/RestSharp.IntegrationTests/packages.config +++ b/RestSharp.IntegrationTests/packages.config @@ -1,4 +1,5 @@  + - + \ No newline at end of file diff --git a/RestSharp.Tests/AddRangeTests.cs b/RestSharp.Tests/AddRangeTests.cs index 98d5325c8..e19127656 100644 --- a/RestSharp.Tests/AddRangeTests.cs +++ b/RestSharp.Tests/AddRangeTests.cs @@ -10,9 +10,9 @@ public void ShouldParseOutRangeSpecifier() { RestClient restClient = new RestClient("http://localhost"); RestRequest req = new RestRequest("bob", Method.GET); - + req.AddHeader("Range", "pages=1-2"); restClient.Execute(req); } } -} \ No newline at end of file +} diff --git a/RestSharp.Tests/CultureChange.cs b/RestSharp.Tests/CultureChange.cs index 1cf9e1e12..ac76123de 100644 --- a/RestSharp.Tests/CultureChange.cs +++ b/RestSharp.Tests/CultureChange.cs @@ -11,7 +11,9 @@ public class CultureChange : IDisposable public CultureChange(string culture) { if (culture == null) + { throw new ArgumentNullException("culture"); + } this.PreviousCulture = Thread.CurrentThread.CurrentCulture; diff --git a/RestSharp.Tests/Fakes/NullHttp.cs b/RestSharp.Tests/Fakes/NullHttp.cs index 9634ec45c..5c0ccbfb6 100644 --- a/RestSharp.Tests/Fakes/NullHttp.cs +++ b/RestSharp.Tests/Fakes/NullHttp.cs @@ -1,5 +1,4 @@ - -namespace RestSharp.Tests.Fakes +namespace RestSharp.Tests.Fakes { public class NullHttp : Http { diff --git a/RestSharp.Tests/InterfaceImplementationTests.cs b/RestSharp.Tests/InterfaceImplementationTests.cs index 0775c24fe..8a9491cd9 100644 --- a/RestSharp.Tests/InterfaceImplementationTests.cs +++ b/RestSharp.Tests/InterfaceImplementationTests.cs @@ -18,7 +18,8 @@ public void IRestSharp_Has_All_RestSharp_Signatures() const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly; // Act - List compareResult = CompareTypes(restClientImplementationType, restClientInterfaceType, bindingFlags).ToList(); + List compareResult = CompareTypes(restClientImplementationType, restClientInterfaceType, + bindingFlags).ToList(); compareResult.ForEach(x => Console.WriteLine("Method {0} exists in {1} but not in {2}", x, restClientImplementationType.FullName, restClientInterfaceType.FullName)); @@ -32,7 +33,8 @@ private static IEnumerable CompareTypes(IReflect type1, IReflect type2, MethodInfo[] typeTMethodInfo = type1.GetMethods(bindingFlags); MethodInfo[] typeXMethodInfo = type2.GetMethods(bindingFlags); - return typeTMethodInfo.Select(x => x.Name).Except(typeXMethodInfo.Select(x => x.Name)); + return typeTMethodInfo.Select(x => x.Name) + .Except(typeXMethodInfo.Select(x => x.Name)); } } } diff --git a/RestSharp.Tests/JsonTests.cs b/RestSharp.Tests/JsonTests.cs index 1600fc7b3..bda88777c 100644 --- a/RestSharp.Tests/JsonTests.cs +++ b/RestSharp.Tests/JsonTests.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -137,7 +139,7 @@ public void Can_Deserialize_From_Root_Element() { string doc = File.ReadAllText(Path.Combine("SampleData", "sojson.txt")); JsonDeserializer json = new JsonDeserializer { RootElement = "User" }; - SOUser output = json.Deserialize(new RestResponse { Content = doc }); + SoUser output = json.Deserialize(new RestResponse { Content = doc }); Assert.AreEqual("John Sheehan", output.DisplayName); } @@ -147,7 +149,8 @@ public void Can_Deserialize_To_Dictionary_String_Object() { string doc = File.ReadAllText(Path.Combine("SampleData", "jsondictionary.txt")); JsonDeserializer json = new JsonDeserializer(); - Dictionary output = json.Deserialize>(new RestResponse { Content = doc }); + Dictionary output = + json.Deserialize>(new RestResponse { Content = doc }); Assert.AreEqual(output.Keys.Count, 3); @@ -161,7 +164,8 @@ public void Can_Deserialize_To_Dictionary_Int_Object() { string doc = File.ReadAllText(Path.Combine("SampleData", "jsondictionary_KeysType.txt")); JsonDeserializer json = new JsonDeserializer(); - Dictionary output = json.Deserialize>(new RestResponse { Content = doc }); + Dictionary output = + json.Deserialize>(new RestResponse { Content = doc }); Assert.AreEqual(output.Keys.Count, 2); @@ -175,7 +179,8 @@ public void Can_Deserialize_Generic_Members() { string doc = File.ReadAllText(Path.Combine("SampleData", "GenericWithList.txt")); JsonDeserializer json = new JsonDeserializer(); - Generic> output = json.Deserialize>>(new RestResponse { Content = doc }); + Generic> output = + json.Deserialize>>(new RestResponse { Content = doc }); Assert.AreEqual("Foe sho", output.Data.Items[0].Nickname); } @@ -190,7 +195,7 @@ public void Can_Deserialize_List_of_Guid() data["Ids"] = new JsonArray { id1, id2 }; JsonDeserializer d = new JsonDeserializer(); - RestResponse response = new RestResponse { Content = data.ToString() }; + RestResponse response = new RestResponse { Content = data.ToString() }; GuidList p = d.Deserialize(response); Assert.AreEqual(2, p.Ids.Count); @@ -205,7 +210,11 @@ public void Can_Deserialize_Generic_List_of_DateTime() DateTime item2 = item1.AddSeconds(12345); JsonObject data = new JsonObject(); - data["Items"] = new JsonArray { item1.ToString("u"), item2.ToString("u") }; + data["Items"] = new JsonArray + { + item1.ToString("u"), + item2.ToString("u") + }; JsonDeserializer d = new JsonDeserializer(); RestResponse response = new RestResponse { Content = data.ToString() }; @@ -305,7 +314,11 @@ public void Can_Deserialize_Custom_Formatted_Date() var formatted = new { StartDate = date.ToString(format, culture) }; string data = SimpleJson.SerializeObject(formatted); RestResponse response = new RestResponse { Content = data }; - JsonDeserializer json = new JsonDeserializer { DateFormat = format, Culture = culture }; + JsonDeserializer json = new JsonDeserializer + { + DateFormat = format, + Culture = culture + }; PersonForJson output = json.Deserialize(response); Assert.AreEqual(date, output.StartDate); @@ -467,7 +480,7 @@ public void Can_Deserialize_Names_With_Underscore_Prefix() string data = File.ReadAllText(Path.Combine("SampleData", "underscore_prefix.txt")); RestResponse response = new RestResponse { Content = data }; JsonDeserializer json = new JsonDeserializer { RootElement = "User" }; - SOUser output = json.Deserialize(response); + SoUser output = json.Deserialize(response); Assert.AreEqual("John Sheehan", output.DisplayName); Assert.AreEqual(1786, output.Id); @@ -760,7 +773,6 @@ public void Can_Deserialize_Dictionary_of_Lists() { string doc = File.ReadAllText(Path.Combine("SampleData", "jsondictionary.txt")); JsonDeserializer json = new JsonDeserializer { RootElement = "response" }; - EmployeeTracker output = json.Deserialize(new RestResponse { Content = doc }); Assert.IsNotEmpty(output.EmployeesMail); @@ -858,7 +870,10 @@ private static string CreateJsonWithDashes() private static string CreateIsoDateJson() { - Birthdate bd = new Birthdate { Value = new DateTime(1910, 9, 25, 9, 30, 25, DateTimeKind.Utc) }; + Birthdate bd = new Birthdate + { + Value = new DateTime(1910, 9, 25, 9, 30, 25, DateTimeKind.Utc) + }; return SimpleJson.SerializeObject(bd); } @@ -911,8 +926,8 @@ private static string CreateJson() JsonObject foesArray = new JsonObject { - { "dict1", new JsonObject { { "Nickname", "Foe 1" } } }, - {"dict2", new JsonObject { { "Nickname", "Foe 2" } } } + { "dict1", new JsonObject { { "nickname", "Foe 1" } } }, + { "dict2", new JsonObject { { "nickname", "Foe 2" } } } }; doc["Foes"] = foesArray; @@ -969,10 +984,22 @@ public string CreateDynamicJsonStringDictionary() { JsonObject doc = new JsonObject(); - doc["Thing1"] = new JsonArray { "Value1", "Value2" }; + doc["Thing1"] = new JsonArray + { + "Value1", + "Value2" + }; doc["Thing2"] = "Thing2"; - doc["ThingRed"] = new JsonObject { { "Name", "ThingRed" }, { "Color", "Red" } }; - doc["ThingBlue"] = new JsonObject { { "Name", "ThingBlue" }, { "Color", "Blue" } }; + doc["ThingRed"] = new JsonObject + { + { "Name", "ThingRed" }, + { "Color", "Red" } + }; + doc["ThingBlue"] = new JsonObject + { + { "Name", "ThingBlue" }, + { "Color", "Blue" } + }; return doc.ToString(); } diff --git a/RestSharp.Tests/JwtAuthTests.cs b/RestSharp.Tests/JwtAuthTests.cs index 705a556c6..6172a88ab 100644 --- a/RestSharp.Tests/JwtAuthTests.cs +++ b/RestSharp.Tests/JwtAuthTests.cs @@ -11,27 +11,28 @@ namespace RestSharp.Tests [TestFixture] public class JwtAuthTests { - readonly string testJwt; - readonly string expectedAuthHeaderContent; - + private readonly string testJwt; + + private readonly string expectedAuthHeaderContent; + public JwtAuthTests() { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentUICulture = CultureInfo.InstalledUICulture; this.testJwt = "eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9" + "." + - "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQo" + - "gImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ" + "." + - "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"; + "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQo" + + "gImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ" + "." + + "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"; this.expectedAuthHeaderContent = string.Format("Bearer {0}", this.testJwt); } - + [Test] public void Throw_Argument_Null_Exception() { ArgumentNullException exception = Assert.Throws(() => new JwtAuthenticator(null)); - + Assert.AreEqual("accessToken", exception.ParamName); } diff --git a/RestSharp.Tests/NamespacedXmlTests.cs b/RestSharp.Tests/NamespacedXmlTests.cs index 8284ae227..9cb96a7ec 100644 --- a/RestSharp.Tests/NamespacedXmlTests.cs +++ b/RestSharp.Tests/NamespacedXmlTests.cs @@ -1,4 +1,5 @@ #region Licensed + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; diff --git a/RestSharp.Tests/NuSpecUpdateTask.cs b/RestSharp.Tests/NuSpecUpdateTask.cs index ff1841df1..d9dfd3578 100644 --- a/RestSharp.Tests/NuSpecUpdateTask.cs +++ b/RestSharp.Tests/NuSpecUpdateTask.cs @@ -49,10 +49,10 @@ protected override void Setup() { } public void PullsVersionAttributeInstead() { Build.NuSpecUpdateTask task = new Build.NuSpecUpdateTask - { - SpecFile = FileName, - SourceAssemblyFile = "RestSharp.Tests.dll" - }; + { + SpecFile = FileName, + SourceAssemblyFile = "RestSharp.Tests.dll" + }; task.Execute(); @@ -64,6 +64,7 @@ public void PullsVersionAttributeInstead() public class WhenSpecFileIsValid : BaseNuSpecUpdateTest { private readonly Build.NuSpecUpdateTask subject = new Build.NuSpecUpdateTask(); + private bool result; #if SIGNED @@ -71,9 +72,13 @@ public class WhenSpecFileIsValid : BaseNuSpecUpdateTest #else private const string EXPECTED_ID = "RestSharp"; #endif + private const string EXPECTED_DESCRIPTION = "Simple REST and HTTP API Client"; + private const string EXPECTED_AUTHORS = "John Sheehan, RestSharp Community"; + private const string EXPECTED_OWNERS = "John Sheehan, RestSharp Community"; + private readonly Regex expectedVersion = new Regex(@"^\d+\.\d+\.\d+(-\w+)?$", RegexOptions.Compiled); protected override void Setup() diff --git a/RestSharp.Tests/OAuthTests.cs b/RestSharp.Tests/OAuthTests.cs index 1b3595fea..aea66b060 100644 --- a/RestSharp.Tests/OAuthTests.cs +++ b/RestSharp.Tests/OAuthTests.cs @@ -4,7 +4,6 @@ using RestSharp.Authenticators.OAuth; using RestSharp.Authenticators.OAuth.Extensions; - namespace RestSharp.Tests { [TestFixture] diff --git a/RestSharp.Tests/Properties/AssemblyInfo.cs b/RestSharp.Tests/Properties/AssemblyInfo.cs index 0dcc7f28d..4627fbf82 100644 --- a/RestSharp.Tests/Properties/AssemblyInfo.cs +++ b/RestSharp.Tests/Properties/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyTitle("RestSharp.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -17,9 +17,11 @@ // 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. + [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM + [assembly: Guid("82c9d878-3d67-40fe-ac6b-6842605a04be")] // Version information for an assembly consists of the following four values: @@ -32,5 +34,6 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] + [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/RestSharp.Tests/RestSharp.Tests.Signed.csproj b/RestSharp.Tests/RestSharp.Tests.Signed.csproj index 517f4b30d..84304cb35 100644 --- a/RestSharp.Tests/RestSharp.Tests.Signed.csproj +++ b/RestSharp.Tests/RestSharp.Tests.Signed.csproj @@ -127,6 +127,9 @@ Always + + Always + Always diff --git a/RestSharp.Tests/RestSharp.Tests.csproj b/RestSharp.Tests/RestSharp.Tests.csproj index a23aa111a..3a675257c 100644 --- a/RestSharp.Tests/RestSharp.Tests.csproj +++ b/RestSharp.Tests/RestSharp.Tests.csproj @@ -102,7 +102,7 @@ - + @@ -120,6 +120,9 @@ Always + + Always + Always diff --git a/RestSharp.Tests/SampleClasses/BooleanTest.cs b/RestSharp.Tests/SampleClasses/BooleanTest.cs index fc6621ef2..6ba70e851 100644 --- a/RestSharp.Tests/SampleClasses/BooleanTest.cs +++ b/RestSharp.Tests/SampleClasses/BooleanTest.cs @@ -1,5 +1,4 @@ - -namespace RestSharp.Tests.SampleClasses +namespace RestSharp.Tests.SampleClasses { public class BooleanTest { diff --git a/RestSharp.Tests/SampleClasses/EmployeeTracker.cs b/RestSharp.Tests/SampleClasses/EmployeeTracker.cs index 17abe5434..02bec0162 100644 --- a/RestSharp.Tests/SampleClasses/EmployeeTracker.cs +++ b/RestSharp.Tests/SampleClasses/EmployeeTracker.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; namespace RestSharp.Tests.SampleClasses { diff --git a/RestSharp.Tests/SampleClasses/EnumTest.cs b/RestSharp.Tests/SampleClasses/EnumTest.cs index fca070ca4..50ce9307b 100644 --- a/RestSharp.Tests/SampleClasses/EnumTest.cs +++ b/RestSharp.Tests/SampleClasses/EnumTest.cs @@ -1,4 +1,5 @@ -namespace RestSharp.Tests.SampleClasses + +namespace RestSharp.Tests.SampleClasses { public enum ByteEnum : byte { diff --git a/RestSharp.Tests/SampleClasses/ListSamples.cs b/RestSharp.Tests/SampleClasses/ListSamples.cs index 2417cc54b..888f210da 100644 --- a/RestSharp.Tests/SampleClasses/ListSamples.cs +++ b/RestSharp.Tests/SampleClasses/ListSamples.cs @@ -16,7 +16,6 @@ public class InlineListSample public List images { get; set; } public List Images { get; set; } - } public class NestedListSample @@ -36,6 +35,7 @@ public class EmptyListSample public class Image { public string Src { get; set; } + public string Value { get; set; } } diff --git a/RestSharp.Tests/SampleClasses/Oddball.cs b/RestSharp.Tests/SampleClasses/Oddball.cs index c2142bbd9..9fb272c75 100644 --- a/RestSharp.Tests/SampleClasses/Oddball.cs +++ b/RestSharp.Tests/SampleClasses/Oddball.cs @@ -1,5 +1,4 @@ - -namespace RestSharp.Tests.SampleClasses +namespace RestSharp.Tests.SampleClasses { [Deserializers.DeserializeAs(Name = "oddballRootName")] public class Oddball diff --git a/RestSharp.Tests/SampleClasses/SOUser.cs b/RestSharp.Tests/SampleClasses/SOUser.cs index e57c86eec..c2b490cc7 100644 --- a/RestSharp.Tests/SampleClasses/SOUser.cs +++ b/RestSharp.Tests/SampleClasses/SOUser.cs @@ -1,7 +1,6 @@ - -namespace RestSharp.Tests.SampleClasses +namespace RestSharp.Tests.SampleClasses { - public class SOUser + public class SoUser { public int Id { get; set; } diff --git a/RestSharp.Tests/SampleClasses/Struct.cs b/RestSharp.Tests/SampleClasses/Struct.cs index feb401542..e09f74817 100644 --- a/RestSharp.Tests/SampleClasses/Struct.cs +++ b/RestSharp.Tests/SampleClasses/Struct.cs @@ -1,5 +1,4 @@ - -namespace RestSharp.Tests.SampleClasses +namespace RestSharp.Tests.SampleClasses { public struct SimpleStruct { diff --git a/RestSharp.Tests/SampleClasses/misc.cs b/RestSharp.Tests/SampleClasses/misc.cs index a78905fe9..80dc23671 100644 --- a/RestSharp.Tests/SampleClasses/misc.cs +++ b/RestSharp.Tests/SampleClasses/misc.cs @@ -1,4 +1,5 @@ #region Licensed + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -40,11 +42,20 @@ public class PersonForXml protected string Ignore { get; set; } - public string IgnoreProxy { get { return this.Ignore; } } + public string IgnoreProxy + { + get { return this.Ignore; } + } - protected string ReadOnly { get { return null; } } + protected string ReadOnly + { + get { return null; } + } - public string ReadOnlyProxy { get { return this.ReadOnly; } } + public string ReadOnlyProxy + { + get { return this.ReadOnly; } + } public FoeList Foes { get; set; } @@ -66,7 +77,6 @@ public class Band { public string Name { get; set; } } - } public class IncomingInvoice @@ -102,11 +112,20 @@ public class PersonForJson protected string Ignore { get; set; } - public string IgnoreProxy { get { return this.Ignore; } } + public string IgnoreProxy + { + get { return this.Ignore; } + } - protected string ReadOnly { get { return null; } } + protected string ReadOnly + { + get { return null; } + } - public string ReadOnlyProxy { get { return this.ReadOnly; } } + public string ReadOnlyProxy + { + get { return this.ReadOnly; } + } public Dictionary Foes { get; set; } @@ -118,14 +137,18 @@ public class PersonForJson public enum Order { First, + Second, + Third } public enum Disposition { Friendly, + SoSo, + SteerVeryClear } diff --git a/RestSharp.Tests/SerializerTests.cs b/RestSharp.Tests/SerializerTests.cs index e72aa05b7..f872e7910 100644 --- a/RestSharp.Tests/SerializerTests.cs +++ b/RestSharp.Tests/SerializerTests.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -133,7 +135,7 @@ public void Can_serialize_simple_POCO_With_Different_Root_Element() Price = 19.95m, StartDate = new DateTime(2009, 12, 18, 10, 2, 23) }; - XmlSerializer xml = new XmlSerializer {RootElement = "Result"}; + XmlSerializer xml = new XmlSerializer { RootElement = "Result" }; string doc = xml.Serialize(poco); XDocument expected = GetSimplePocoXDocWithRoot(); @@ -249,7 +251,9 @@ private class Item private enum Color { Red, + Blue, + Green } diff --git a/RestSharp.Tests/XmlAttributeDeserializerTests.cs b/RestSharp.Tests/XmlAttributeDeserializerTests.cs index 02b14360b..284fc2ce0 100644 --- a/RestSharp.Tests/XmlAttributeDeserializerTests.cs +++ b/RestSharp.Tests/XmlAttributeDeserializerTests.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -30,6 +32,7 @@ namespace RestSharp.Tests public class XmlAttributeDeserializerTests { private const string GUID_STRING = "AC1FC4BC-087A-4242-B8EE-C53EBE9887A5"; + private readonly string sampleDataPath = Path.Combine(Environment.CurrentDirectory, "SampleData"); private string PathFor(string sampleFile) @@ -43,7 +46,8 @@ public void Can_Deserialize_Lists_of_Simple_Types() string xmlpath = this.PathFor("xmllists.xml"); XDocument doc = XDocument.Load(xmlpath); XmlAttributeDeserializer xml = new XmlAttributeDeserializer(); - SimpleTypesListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + SimpleTypesListSample output = xml.Deserialize( + new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.Names); Assert.IsNotEmpty(output.Numbers); @@ -202,7 +206,10 @@ public void Can_Deserialize_Elements_to_Nullable_Values() { CultureInfo culture = CultureInfo.InvariantCulture; string doc = CreateXmlWithoutEmptyValues(culture); - XmlAttributeDeserializer xml = new XmlAttributeDeserializer { Culture = culture }; + XmlAttributeDeserializer xml = new XmlAttributeDeserializer + { + Culture = culture + }; NullableValues output = xml.Deserialize(new RestResponse { Content = doc }); Assert.NotNull(output.Id); @@ -261,12 +268,17 @@ public void Can_Deserialize_Custom_Formatted_Date() doc.Add(root); - XmlAttributeDeserializer xml = new XmlAttributeDeserializer { DateFormat = format, Culture = culture }; + XmlAttributeDeserializer xml = new XmlAttributeDeserializer + { + DateFormat = format, + Culture = culture + }; RestResponse response = new RestResponse { Content = doc.ToString() }; PersonForXml output = xml.Deserialize(response); Assert.AreEqual(date, output.StartDate); } + [Test] public void Can_Deserialize_Nested_Class() { @@ -278,6 +290,7 @@ public void Can_Deserialize_Nested_Class() Assert.NotNull(p.FavoriteBand); Assert.AreEqual("Goldfinger", p.FavoriteBand.Name); } + [Test] public void Can_Deserialize_Elements_On_Default_Root() { @@ -470,7 +483,6 @@ public void Can_Deserialize_Root_Elements_Without_Matching_Case_And_Dashes() Assert.AreEqual(45, p[0].ConceptId); } - [Test] public void Can_Deserialize_Eventful_Xml() { @@ -901,6 +913,5 @@ private static string CreateXmlWithAttributesAndNullValuesAndPopulatedValues() return doc.ToString(); } - } } diff --git a/RestSharp.Tests/XmlDeserializerTests.cs b/RestSharp.Tests/XmlDeserializerTests.cs index a77dc8c7b..99ccda57f 100644 --- a/RestSharp.Tests/XmlDeserializerTests.cs +++ b/RestSharp.Tests/XmlDeserializerTests.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -31,6 +33,7 @@ namespace RestSharp.Tests public class XmlDeserializerTests { private const string GUID_STRING = "AC1FC4BC-087A-4242-B8EE-C53EBE9887A5"; + private readonly string sampleDataPath = Path.Combine(Environment.CurrentDirectory, "SampleData"); private string PathFor(string sampleFile) @@ -55,10 +58,10 @@ public void Can_Use_DeserializeAs_Attribute() [Test] public void Can_Use_DeserializeAs_Attribute_for_List() { - const string content = - "1Jacksonoddball1Jacksonevenball"; + string xmlpath = this.PathFor("deserialize_as_list.xml"); + XDocument doc = XDocument.Load(xmlpath); XmlDeserializer xml = new XmlDeserializer(); - List output = xml.Deserialize>(new RestResponse { Content = content }); + List output = xml.Deserialize>(new RestResponse { Content = doc.ToString() }); Assert.NotNull(output); Assert.AreEqual("1", output[0].Sid); @@ -83,7 +86,8 @@ public void Can_Deserialize_Lists_of_Simple_Types() string xmlpath = this.PathFor("xmllists.xml"); XDocument doc = XDocument.Load(xmlpath); XmlDeserializer xml = new XmlDeserializer(); - SimpleTypesListSample output = xml.Deserialize(new RestResponse { Content = doc.ToString() }); + SimpleTypesListSample output = xml.Deserialize( + new RestResponse { Content = doc.ToString() }); Assert.IsNotEmpty(output.Names); Assert.IsNotEmpty(output.Numbers); @@ -187,7 +191,6 @@ public void Can_Deserialize_Nested_List_Items_Without_Matching_Class_Name() Assert.AreEqual(4, output.Images.Count); } - [Test] public void Can_Deserialize_Nested_List_Items_With_Matching_Class_Name() { @@ -243,7 +246,10 @@ public void Can_Deserialize_Elements_to_Nullable_Values() { CultureInfo culture = CultureInfo.InvariantCulture; string doc = CreateXmlWithoutEmptyValues(culture); - XmlDeserializer xml = new XmlDeserializer { Culture = culture }; + XmlDeserializer xml = new XmlDeserializer + { + Culture = culture + }; NullableValues output = xml.Deserialize(new RestResponse { Content = doc }); Assert.NotNull(output.Id); @@ -273,8 +279,14 @@ public void Can_Deserialize_TimeSpan() doc.Add(root); - RestResponse response = new RestResponse { Content = doc.ToString() }; - XmlDeserializer d = new XmlDeserializer { Culture = culture, }; + RestResponse response = new RestResponse + { + Content = doc.ToString() + }; + XmlDeserializer d = new XmlDeserializer + { + Culture = culture, + }; TimeSpanTestStructure payload = d.Deserialize(response); Assert.AreEqual(new TimeSpan(468006), payload.Tick); @@ -300,10 +312,10 @@ public void Can_Deserialize_Custom_Formatted_Date() doc.Add(root); XmlDeserializer xml = new XmlDeserializer - { - DateFormat = format, - Culture = culture - }; + { + DateFormat = format, + Culture = culture + }; RestResponse response = new RestResponse { Content = doc.ToString() }; PersonForXml output = xml.Deserialize(response); @@ -625,7 +637,7 @@ public void Can_Deserialize_DateTimeOffset() //var xml = new XmlDeserializer { Culture = culture, }; RestResponse response = new RestResponse { Content = doc.ToString() }; - XmlDeserializer d = new XmlDeserializer { Culture = culture, }; + XmlDeserializer d = new XmlDeserializer { Culture = culture }; DateTimeTestStructure payload = d.Deserialize(response); Assert.AreEqual(dateTimeOffset, payload.DateTimeOffset); diff --git a/RestSharp.Tests/packages.config b/RestSharp.Tests/packages.config index d904986a8..393f35298 100644 --- a/RestSharp.Tests/packages.config +++ b/RestSharp.Tests/packages.config @@ -1,5 +1,6 @@  + - - + + \ No newline at end of file diff --git a/RestSharp/Authenticators/HttpBasicAuthenticator.cs b/RestSharp/Authenticators/HttpBasicAuthenticator.cs index de95d3342..782b04530 100644 --- a/RestSharp/Authenticators/HttpBasicAuthenticator.cs +++ b/RestSharp/Authenticators/HttpBasicAuthenticator.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; diff --git a/RestSharp/Authenticators/IAuthenticator.cs b/RestSharp/Authenticators/IAuthenticator.cs index 272288c25..bad21cefd 100644 --- a/RestSharp/Authenticators/IAuthenticator.cs +++ b/RestSharp/Authenticators/IAuthenticator.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion namespace RestSharp.Authenticators diff --git a/RestSharp/Authenticators/JwtAuthenticator.cs b/RestSharp/Authenticators/JwtAuthenticator.cs index 2b994e14c..49a836c97 100644 --- a/RestSharp/Authenticators/JwtAuthenticator.cs +++ b/RestSharp/Authenticators/JwtAuthenticator.cs @@ -1,4 +1,5 @@ #region License + // Author: Roman Kravchik // Based on HttpBasicAuthenticator class by John Sheehan // @@ -13,6 +14,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -26,7 +28,7 @@ namespace RestSharp.Authenticators /// public class JwtAuthenticator : IAuthenticator { - readonly string authHeader; + private readonly string authHeader; public JwtAuthenticator(string accessToken) { diff --git a/RestSharp/Authenticators/NtlmAuthenticator.cs b/RestSharp/Authenticators/NtlmAuthenticator.cs index 569b0aa37..ca1601906 100644 --- a/RestSharp/Authenticators/NtlmAuthenticator.cs +++ b/RestSharp/Authenticators/NtlmAuthenticator.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion #if FRAMEWORK @@ -49,7 +51,9 @@ public NtlmAuthenticator(string username, string password) public NtlmAuthenticator(ICredentials credentials) { if (credentials == null) + { throw new ArgumentNullException("credentials"); + } this.credentials = credentials; } diff --git a/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs index a8f326ce7..b65e18e5d 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/CollectionExtensions.cs @@ -30,7 +30,9 @@ public static IEnumerable And(this IEnumerable items, T item) public static TK TryWithKey(this IDictionary dictionary, T key) { - return dictionary.ContainsKey(key) ? dictionary[key] : default(TK); + return dictionary.ContainsKey(key) + ? dictionary[key] + : default(TK); } public static IEnumerable ToEnumerable(this object[] items) where T : class diff --git a/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs index 0b54708f3..53c44c350 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/OAuthExtensions.cs @@ -8,10 +8,13 @@ internal static class OAuthExtensions { public static string ToRequestValue(this OAuthSignatureMethod signatureMethod) { - string value = signatureMethod.ToString().ToUpper(); + string value = signatureMethod.ToString() + .ToUpper(); int shaIndex = value.IndexOf("SHA1"); - return shaIndex > -1 ? value.Insert(shaIndex, "-") : value; + return shaIndex > -1 + ? value.Insert(shaIndex, "-") + : value; } public static OAuthSignatureMethod FromRequestValue(this string signatureMethod) diff --git a/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs b/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs index 172d29a7f..b86519c44 100644 --- a/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs +++ b/RestSharp/Authenticators/OAuth/Extensions/StringExtensions.cs @@ -81,7 +81,10 @@ public static string PercentEncode(this string s) public static IDictionary ParseQueryString(this string query) { // [DC]: This method does not URL decode, and cannot handle decoded input - if (query.StartsWith("?")) query = query.Substring(1); + if (query.StartsWith("?")) + { + query = query.Substring(1); + } if (query.Equals(string.Empty)) { @@ -91,7 +94,7 @@ public static IDictionary ParseQueryString(this string query) string[] parts = query.Split('&'); return parts.Select(part => part.Split('=')) - .ToDictionary(pair => pair[0], pair => pair[1]); + .ToDictionary(pair => pair[0], pair => pair[1]); } } } diff --git a/RestSharp/Authenticators/OAuth/OAuthTools.cs b/RestSharp/Authenticators/OAuth/OAuthTools.cs index bed1e6505..be6dfe35c 100644 --- a/RestSharp/Authenticators/OAuth/OAuthTools.cs +++ b/RestSharp/Authenticators/OAuth/OAuthTools.cs @@ -13,12 +13,17 @@ namespace RestSharp.Authenticators.OAuth internal static class OAuthTools { private const string ALPHA_NUMERIC = UPPER + LOWER + DIGIT; + private const string DIGIT = "1234567890"; + private const string LOWER = "abcdefghijklmnopqrstuvwxyz"; + private const string UNRESERVED = ALPHA_NUMERIC + "-._~"; + private const string UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static readonly Random random; + private static readonly object randomLock = new object(); #if !SILVERLIGHT && !WINDOWS_PHONE @@ -186,10 +191,14 @@ public static WebParameterCollection SortParametersExcludingSignature(WebParamet IEnumerable exclusions = copy.Where(n => n.Name.EqualsIgnoreCase("oauth_signature")); copy.RemoveAll(exclusions); - copy.ForEach(p => { p.Name = UrlEncodeStrict(p.Name); p.Value = UrlEncodeStrict(p.Value); }); + copy.ForEach(p => + { + p.Name = UrlEncodeStrict(p.Name); + p.Value = UrlEncodeStrict(p.Value); + }); copy.Sort((x, y) => string.CompareOrdinal(x.Name, y.Name) != 0 - ? string.CompareOrdinal(x.Name, y.Name) - : string.CompareOrdinal(x.Value, y.Value)); + ? string.CompareOrdinal(x.Name, y.Name) + : string.CompareOrdinal(x.Value, y.Value)); return copy; } @@ -216,7 +225,9 @@ public static string ConstructRequestUrl(Uri url) bool secure = url.Scheme == "https" && url.Port == 443; sb.Append(requestUrl); - sb.Append(!basic && !secure ? qualified : ""); + sb.Append(!basic && !secure + ? qualified + : ""); sb.Append(url.AbsolutePath); return sb.ToString(); //.ToLower(); @@ -319,22 +330,22 @@ public static string GetSignature(OAuthSignatureMethod signatureMethod, OAuthSig switch (signatureMethod) { case OAuthSignatureMethod.HmacSha1: - { - HMACSHA1 crypto = new HMACSHA1(); - string key = "{0}&{1}".FormatWith(consumerSecret, tokenSecret); + { + HMACSHA1 crypto = new HMACSHA1(); + string key = "{0}&{1}".FormatWith(consumerSecret, tokenSecret); - crypto.Key = encoding.GetBytes(key); - signature = signatureBase.HashWith(crypto); + crypto.Key = encoding.GetBytes(key); + signature = signatureBase.HashWith(crypto); - break; - } + break; + } case OAuthSignatureMethod.PlainText: - { - signature = "{0}&{1}".FormatWith(consumerSecret, tokenSecret); + { + signature = "{0}&{1}".FormatWith(consumerSecret, tokenSecret); - break; - } + break; + } default: throw new NotImplementedException("Only HMAC-SHA1 is currently supported."); diff --git a/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs b/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs index 9e663d47e..9bf08e329 100644 --- a/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs +++ b/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs @@ -60,7 +60,7 @@ internal class OAuthWorkflow /// public OAuthWebQueryInfo BuildRequestTokenInfo(string method) { - return BuildRequestTokenInfo(method, null); + return this.BuildRequestTokenInfo(method, null); } /// @@ -74,7 +74,7 @@ public OAuthWebQueryInfo BuildRequestTokenInfo(string method) /// public virtual OAuthWebQueryInfo BuildRequestTokenInfo(string method, WebParameterCollection parameters) { - ValidateTokenRequestState(); + this.ValidateTokenRequestState(); if (parameters == null) { @@ -84,25 +84,25 @@ public virtual OAuthWebQueryInfo BuildRequestTokenInfo(string method, WebParamet string timestamp = OAuthTools.GetTimestamp(); string nonce = OAuthTools.GetNonce(); - AddAuthParameters(parameters, timestamp, nonce); + this.AddAuthParameters(parameters, timestamp, nonce); - string signatureBase = OAuthTools.ConcatenateRequestElements(method, RequestTokenUrl, parameters); - string signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret); + string signatureBase = OAuthTools.ConcatenateRequestElements(method, this.RequestTokenUrl, parameters); + string signature = OAuthTools.GetSignature(this.SignatureMethod, this.SignatureTreatment, signatureBase, this.ConsumerSecret); OAuthWebQueryInfo info = new OAuthWebQueryInfo { WebMethod = method, - ParameterHandling = ParameterHandling, - ConsumerKey = ConsumerKey, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, + ParameterHandling = this.ParameterHandling, + ConsumerKey = this.ConsumerKey, + SignatureMethod = this.SignatureMethod.ToRequestValue(), + SignatureTreatment = this.SignatureTreatment, Signature = signature, Timestamp = timestamp, Nonce = nonce, - Version = Version ?? "1.0", - Callback = OAuthTools.UrlEncodeRelaxed(CallbackUrl ?? ""), - TokenSecret = TokenSecret, - ConsumerSecret = ConsumerSecret + Version = this.Version ?? "1.0", + Callback = OAuthTools.UrlEncodeRelaxed(this.CallbackUrl ?? ""), + TokenSecret = this.TokenSecret, + ConsumerSecret = this.ConsumerSecret }; return info; @@ -117,7 +117,7 @@ public virtual OAuthWebQueryInfo BuildRequestTokenInfo(string method, WebParamet /// public virtual OAuthWebQueryInfo BuildAccessTokenInfo(string method) { - return BuildAccessTokenInfo(method, null); + return this.BuildAccessTokenInfo(method, null); } /// @@ -130,38 +130,39 @@ public virtual OAuthWebQueryInfo BuildAccessTokenInfo(string method) /// Any existing, non-OAuth query parameters desired in the request public virtual OAuthWebQueryInfo BuildAccessTokenInfo(string method, WebParameterCollection parameters) { - ValidateAccessRequestState(); + this.ValidateAccessRequestState(); if (parameters == null) { parameters = new WebParameterCollection(); } - Uri uri = new Uri(AccessTokenUrl); + Uri uri = new Uri(this.AccessTokenUrl); string timestamp = OAuthTools.GetTimestamp(); string nonce = OAuthTools.GetNonce(); - AddAuthParameters(parameters, timestamp, nonce); + this.AddAuthParameters(parameters, timestamp, nonce); string signatureBase = OAuthTools.ConcatenateRequestElements(method, uri.ToString(), parameters); - string signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret, TokenSecret); + string signature = OAuthTools.GetSignature(this.SignatureMethod, this.SignatureTreatment, signatureBase, + this.ConsumerSecret, this.TokenSecret); OAuthWebQueryInfo info = new OAuthWebQueryInfo { WebMethod = method, - ParameterHandling = ParameterHandling, - ConsumerKey = ConsumerKey, - Token = Token, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, + ParameterHandling = this.ParameterHandling, + ConsumerKey = this.ConsumerKey, + Token = this.Token, + SignatureMethod = this.SignatureMethod.ToRequestValue(), + SignatureTreatment = this.SignatureTreatment, Signature = signature, Timestamp = timestamp, Nonce = nonce, - Version = Version ?? "1.0", - Verifier = Verifier, - Callback = CallbackUrl, - TokenSecret = TokenSecret, - ConsumerSecret = ConsumerSecret, + Version = this.Version ?? "1.0", + Verifier = this.Verifier, + Callback = this.CallbackUrl, + TokenSecret = this.TokenSecret, + ConsumerSecret = this.ConsumerSecret, }; return info; @@ -177,38 +178,39 @@ public virtual OAuthWebQueryInfo BuildAccessTokenInfo(string method, WebParamete /// Any existing, non-OAuth query parameters desired in the request public virtual OAuthWebQueryInfo BuildClientAuthAccessTokenInfo(string method, WebParameterCollection parameters) { - ValidateClientAuthAccessRequestState(); + this.ValidateClientAuthAccessRequestState(); if (parameters == null) { parameters = new WebParameterCollection(); } - Uri uri = new Uri(AccessTokenUrl); + Uri uri = new Uri(this.AccessTokenUrl); string timestamp = OAuthTools.GetTimestamp(); string nonce = OAuthTools.GetNonce(); - AddXAuthParameters(parameters, timestamp, nonce); + this.AddXAuthParameters(parameters, timestamp, nonce); string signatureBase = OAuthTools.ConcatenateRequestElements(method, uri.ToString(), parameters); - string signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret); + string signature = OAuthTools.GetSignature(this.SignatureMethod, this.SignatureTreatment, signatureBase, + this.ConsumerSecret); OAuthWebQueryInfo info = new OAuthWebQueryInfo { WebMethod = method, - ParameterHandling = ParameterHandling, + ParameterHandling = this.ParameterHandling, ClientMode = "client_auth", - ClientUsername = ClientUsername, - ClientPassword = ClientPassword, - ConsumerKey = ConsumerKey, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, + ClientUsername = this.ClientUsername, + ClientPassword = this.ClientPassword, + ConsumerKey = this.ConsumerKey, + SignatureMethod = this.SignatureMethod.ToRequestValue(), + SignatureTreatment = this.SignatureTreatment, Signature = signature, Timestamp = timestamp, Nonce = nonce, - Version = Version ?? "1.0", - TokenSecret = TokenSecret, - ConsumerSecret = ConsumerSecret + Version = this.Version ?? "1.0", + TokenSecret = this.TokenSecret, + ConsumerSecret = this.ConsumerSecret }; return info; @@ -217,7 +219,7 @@ public virtual OAuthWebQueryInfo BuildClientAuthAccessTokenInfo(string method, W public virtual OAuthWebQueryInfo BuildProtectedResourceInfo(string method, WebParameterCollection parameters, string url) { - ValidateProtectedResourceState(); + this.ValidateProtectedResourceState(); if (parameters == null) { @@ -253,27 +255,27 @@ public virtual OAuthWebQueryInfo BuildProtectedResourceInfo(string method, WebPa string timestamp = OAuthTools.GetTimestamp(); string nonce = OAuthTools.GetNonce(); - AddAuthParameters(parameters, timestamp, nonce); + this.AddAuthParameters(parameters, timestamp, nonce); string signatureBase = OAuthTools.ConcatenateRequestElements(method, url, parameters); - string signature = OAuthTools.GetSignature(SignatureMethod, SignatureTreatment, signatureBase, ConsumerSecret, - TokenSecret); + string signature = OAuthTools.GetSignature(this.SignatureMethod, this.SignatureTreatment, signatureBase, + this.ConsumerSecret, this.TokenSecret); OAuthWebQueryInfo info = new OAuthWebQueryInfo { WebMethod = method, - ParameterHandling = ParameterHandling, - ConsumerKey = ConsumerKey, - Token = Token, - SignatureMethod = SignatureMethod.ToRequestValue(), - SignatureTreatment = SignatureTreatment, + ParameterHandling = this.ParameterHandling, + ConsumerKey = this.ConsumerKey, + Token = this.Token, + SignatureMethod = this.SignatureMethod.ToRequestValue(), + SignatureTreatment = this.SignatureTreatment, Signature = signature, Timestamp = timestamp, Nonce = nonce, - Version = Version ?? "1.0", - Callback = CallbackUrl, - ConsumerSecret = ConsumerSecret, - TokenSecret = TokenSecret + Version = this.Version ?? "1.0", + Callback = this.CallbackUrl, + ConsumerSecret = this.ConsumerSecret, + TokenSecret = this.TokenSecret }; return info; @@ -281,17 +283,17 @@ public virtual OAuthWebQueryInfo BuildProtectedResourceInfo(string method, WebPa private void ValidateTokenRequestState() { - if (RequestTokenUrl.IsNullOrBlank()) + if (this.RequestTokenUrl.IsNullOrBlank()) { throw new ArgumentException("You must specify a request token URL"); } - if (ConsumerKey.IsNullOrBlank()) + if (this.ConsumerKey.IsNullOrBlank()) { throw new ArgumentException("You must specify a consumer key"); } - if (ConsumerSecret.IsNullOrBlank()) + if (this.ConsumerSecret.IsNullOrBlank()) { throw new ArgumentException("You must specify a consumer secret"); } @@ -299,22 +301,22 @@ private void ValidateTokenRequestState() private void ValidateAccessRequestState() { - if (AccessTokenUrl.IsNullOrBlank()) + if (this.AccessTokenUrl.IsNullOrBlank()) { throw new ArgumentException("You must specify an access token URL"); } - if (ConsumerKey.IsNullOrBlank()) + if (this.ConsumerKey.IsNullOrBlank()) { throw new ArgumentException("You must specify a consumer key"); } - if (ConsumerSecret.IsNullOrBlank()) + if (this.ConsumerSecret.IsNullOrBlank()) { throw new ArgumentException("You must specify a consumer secret"); } - if (Token.IsNullOrBlank()) + if (this.Token.IsNullOrBlank()) { throw new ArgumentException("You must specify a token"); } @@ -322,22 +324,22 @@ private void ValidateAccessRequestState() private void ValidateClientAuthAccessRequestState() { - if (AccessTokenUrl.IsNullOrBlank()) + if (this.AccessTokenUrl.IsNullOrBlank()) { throw new ArgumentException("You must specify an access token URL"); } - if (ConsumerKey.IsNullOrBlank()) + if (this.ConsumerKey.IsNullOrBlank()) { throw new ArgumentException("You must specify a consumer key"); } - if (ConsumerSecret.IsNullOrBlank()) + if (this.ConsumerSecret.IsNullOrBlank()) { throw new ArgumentException("You must specify a consumer secret"); } - if (ClientUsername.IsNullOrBlank() || ClientPassword.IsNullOrBlank()) + if (this.ClientUsername.IsNullOrBlank() || this.ClientPassword.IsNullOrBlank()) { throw new ArgumentException("You must specify user credentials"); } @@ -345,12 +347,12 @@ private void ValidateClientAuthAccessRequestState() private void ValidateProtectedResourceState() { - if (ConsumerKey.IsNullOrBlank()) + if (this.ConsumerKey.IsNullOrBlank()) { throw new ArgumentException("You must specify a consumer key"); } - if (ConsumerSecret.IsNullOrBlank()) + if (this.ConsumerSecret.IsNullOrBlank()) { throw new ArgumentException("You must specify a consumer secret"); } @@ -360,31 +362,31 @@ private void AddAuthParameters(ICollection parameters, string timestamp { WebParameterCollection authParameters = new WebParameterCollection { - new WebPair("oauth_consumer_key", ConsumerKey), + new WebPair("oauth_consumer_key", this.ConsumerKey), new WebPair("oauth_nonce", nonce), - new WebPair("oauth_signature_method", SignatureMethod.ToRequestValue()), + new WebPair("oauth_signature_method", this.SignatureMethod.ToRequestValue()), new WebPair("oauth_timestamp", timestamp), - new WebPair("oauth_version", Version ?? "1.0") + new WebPair("oauth_version", this.Version ?? "1.0") }; - if (!Token.IsNullOrBlank()) + if (!this.Token.IsNullOrBlank()) { - authParameters.Add(new WebPair("oauth_token", Token)); + authParameters.Add(new WebPair("oauth_token", this.Token)); } - if (!CallbackUrl.IsNullOrBlank()) + if (!this.CallbackUrl.IsNullOrBlank()) { - authParameters.Add(new WebPair("oauth_callback", CallbackUrl)); + authParameters.Add(new WebPair("oauth_callback", this.CallbackUrl)); } - if (!Verifier.IsNullOrBlank()) + if (!this.Verifier.IsNullOrBlank()) { - authParameters.Add(new WebPair("oauth_verifier", Verifier)); + authParameters.Add(new WebPair("oauth_verifier", this.Verifier)); } - if (!SessionHandle.IsNullOrBlank()) + if (!this.SessionHandle.IsNullOrBlank()) { - authParameters.Add(new WebPair("oauth_session_handle", SessionHandle)); + authParameters.Add(new WebPair("oauth_session_handle", this.SessionHandle)); } foreach (WebPair authParameter in authParameters) @@ -397,14 +399,14 @@ private void AddXAuthParameters(ICollection parameters, string timestam { WebParameterCollection authParameters = new WebParameterCollection { - new WebPair("x_auth_username", ClientUsername), - new WebPair("x_auth_password", ClientPassword), + new WebPair("x_auth_username", this.ClientUsername), + new WebPair("x_auth_password", this.ClientPassword), new WebPair("x_auth_mode", "client_auth"), - new WebPair("oauth_consumer_key", ConsumerKey), - new WebPair("oauth_signature_method", SignatureMethod.ToRequestValue()), + new WebPair("oauth_consumer_key", this.ConsumerKey), + new WebPair("oauth_signature_method", this.SignatureMethod.ToRequestValue()), new WebPair("oauth_timestamp", timestamp), new WebPair("oauth_nonce", nonce), - new WebPair("oauth_version", Version ?? "1.0") + new WebPair("oauth_version", this.Version ?? "1.0") }; foreach (WebPair authParameter in authParameters) diff --git a/RestSharp/Authenticators/OAuth/WebPair.cs b/RestSharp/Authenticators/OAuth/WebPair.cs index 63b490dec..8a943c27d 100644 --- a/RestSharp/Authenticators/OAuth/WebPair.cs +++ b/RestSharp/Authenticators/OAuth/WebPair.cs @@ -5,8 +5,8 @@ internal class WebPair { public WebPair(string name, string value) { - Name = name; - Value = value; + this.Name = name; + this.Value = value; } public string Value { get; set; } diff --git a/RestSharp/Authenticators/OAuth/WebPairCollection.cs b/RestSharp/Authenticators/OAuth/WebPairCollection.cs index 89bda9714..18466819b 100644 --- a/RestSharp/Authenticators/OAuth/WebPairCollection.cs +++ b/RestSharp/Authenticators/OAuth/WebPairCollection.cs @@ -34,12 +34,12 @@ public WebPairCollection(IEnumerable parameters) public WebPairCollection(NameValueCollection collection) : this() { - AddCollection(collection); + this.AddCollection(collection); } public virtual void AddRange(NameValueCollection collection) { - AddCollection(collection); + this.AddCollection(collection); } private void AddCollection(NameValueCollection collection) @@ -51,7 +51,7 @@ private void AddCollection(NameValueCollection collection) public WebPairCollection(IDictionary collection) : this() { - AddCollection(collection); + this.AddCollection(collection); } public void AddCollection(IDictionary collection) @@ -76,12 +76,12 @@ private void AddCollection(IEnumerable collection) public virtual void AddRange(WebPairCollection collection) { - AddCollection(collection); + this.AddCollection(collection); } public virtual void AddRange(IEnumerable collection) { - AddCollection(collection); + this.AddCollection(collection); } public virtual void Sort(Comparison comparison) @@ -117,7 +117,7 @@ public virtual IEnumerator GetEnumerator() IEnumerator IEnumerable.GetEnumerator() { - return GetEnumerator(); + return this.GetEnumerator(); } public virtual void Add(WebPair parameter) diff --git a/RestSharp/Authenticators/OAuth1Authenticator.cs b/RestSharp/Authenticators/OAuth1Authenticator.cs index 795093ec3..c5ef563a4 100644 --- a/RestSharp/Authenticators/OAuth1Authenticator.cs +++ b/RestSharp/Authenticators/OAuth1Authenticator.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -20,9 +22,9 @@ using System.Text; using RestSharp.Authenticators.OAuth; using RestSharp.Authenticators.OAuth.Extensions; - #if !SILVERLIGHT && !WINDOWS_PHONE using RestSharp.Extensions.MonoHttp; + #endif #if WINDOWS_PHONE @@ -183,34 +185,38 @@ public void Authenticate(IRestClient client, IRestRequest request) { OAuthWorkflow workflow = new OAuthWorkflow { - ConsumerKey = ConsumerKey, - ConsumerSecret = ConsumerSecret, - ParameterHandling = ParameterHandling, - SignatureMethod = SignatureMethod, - SignatureTreatment = SignatureTreatment, - Verifier = Verifier, - Version = Version, - CallbackUrl = CallbackUrl, - SessionHandle = SessionHandle, - Token = Token, - TokenSecret = TokenSecret, - ClientUsername = ClientUsername, - ClientPassword = ClientPassword + ConsumerKey = this.ConsumerKey, + ConsumerSecret = this.ConsumerSecret, + ParameterHandling = this.ParameterHandling, + SignatureMethod = this.SignatureMethod, + SignatureTreatment = this.SignatureTreatment, + Verifier = this.Verifier, + Version = this.Version, + CallbackUrl = this.CallbackUrl, + SessionHandle = this.SessionHandle, + Token = this.Token, + TokenSecret = this.TokenSecret, + ClientUsername = this.ClientUsername, + ClientPassword = this.ClientPassword }; - AddOAuthData(client, request, workflow); + this.AddOAuthData(client, request, workflow); } private void AddOAuthData(IRestClient client, IRestRequest request, OAuthWorkflow workflow) { - string url = client.BuildUri(request).ToString(); + string url = client.BuildUri(request) + .ToString(); int queryStringStart = url.IndexOf('?'); if (queryStringStart != -1) + { url = url.Substring(0, queryStringStart); + } OAuthWebQueryInfo oauth; - string method = request.Method.ToString().ToUpperInvariant(); + string method = request.Method.ToString() + .ToUpperInvariant(); WebParameterCollection parameters = new WebParameterCollection(); // include all GET and POST parameters before generating the signature @@ -225,7 +231,6 @@ private void AddOAuthData(IRestClient client, IRestRequest request, OAuthWorkflo .Where(p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString) .Select(p => new WebPair(p.Name, p.Value.ToString()))); - parameters.AddRange( request.Parameters .Where(p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString) @@ -238,17 +243,17 @@ private void AddOAuthData(IRestClient client, IRestRequest request, OAuthWorkflo parameters.AddRange( client.DefaultParameters .Where(p => (p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString) - && p.Name.StartsWith("oauth_")) + && p.Name.StartsWith("oauth_")) .Select(p => new WebPair(p.Name, p.Value.ToString()))); parameters.AddRange( request.Parameters .Where(p => (p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString) - && p.Name.StartsWith("oauth_")) + && p.Name.StartsWith("oauth_")) .Select(p => new WebPair(p.Name, p.Value.ToString()))); } - switch (Type) + switch (this.Type) { case OAuthType.RequestToken: workflow.RequestTokenUrl = url; @@ -273,11 +278,11 @@ private void AddOAuthData(IRestClient client, IRestRequest request, OAuthWorkflo throw new ArgumentOutOfRangeException(); } - switch (ParameterHandling) + switch (this.ParameterHandling) { case OAuthParameterHandling.HttpAuthorizationHeader: parameters.Add("oauth_signature", oauth.Signature); - request.AddHeader("Authorization", GetAuthorizationHeader(parameters)); + request.AddHeader("Authorization", this.GetAuthorizationHeader(parameters)); break; case OAuthParameterHandling.UrlOrPostParameters: @@ -301,9 +306,9 @@ private string GetAuthorizationHeader(WebPairCollection parameters) { StringBuilder sb = new StringBuilder("OAuth "); - if (!Realm.IsNullOrBlank()) + if (!this.Realm.IsNullOrBlank()) { - sb.Append("realm=\"{0}\",".FormatWith(OAuthTools.UrlEncodeRelaxed(Realm))); + sb.Append("realm=\"{0}\",".FormatWith(OAuthTools.UrlEncodeRelaxed(this.Realm))); } parameters.Sort((l, r) => l.Name.CompareTo(r.Name)); @@ -319,7 +324,9 @@ private string GetAuthorizationHeader(WebPairCollection parameters) { parameterCount++; - string format = parameterCount < oathParameters.Count ? "{0}=\"{1}\"," : "{0}=\"{1}\""; + string format = parameterCount < oathParameters.Count + ? "{0}=\"{1}\"," + : "{0}=\"{1}\""; sb.Append(format.FormatWith(parameter.Name, parameter.Value)); } diff --git a/RestSharp/Authenticators/OAuth2Authenticator.cs b/RestSharp/Authenticators/OAuth2Authenticator.cs index 9cf016b45..980679d4c 100644 --- a/RestSharp/Authenticators/OAuth2Authenticator.cs +++ b/RestSharp/Authenticators/OAuth2Authenticator.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; diff --git a/RestSharp/Authenticators/SimpleAuthenticator.cs b/RestSharp/Authenticators/SimpleAuthenticator.cs index 5098ab78d..a257fa4ff 100644 --- a/RestSharp/Authenticators/SimpleAuthenticator.cs +++ b/RestSharp/Authenticators/SimpleAuthenticator.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion namespace RestSharp.Authenticators @@ -19,8 +21,11 @@ namespace RestSharp.Authenticators public class SimpleAuthenticator : IAuthenticator { private readonly string usernameKey; + private readonly string username; + private readonly string passwordKey; + private readonly string password; public SimpleAuthenticator(string usernameKey, string username, string passwordKey, string password) diff --git a/RestSharp/Compression/ZLib/Crc32.cs b/RestSharp/Compression/ZLib/Crc32.cs index 4fc7754c8..48d159e62 100644 --- a/RestSharp/Compression/ZLib/Crc32.cs +++ b/RestSharp/Compression/ZLib/Crc32.cs @@ -32,6 +32,7 @@ // // ------------------------------------------------------------------ + #if WINDOWS_PHONE using System; diff --git a/RestSharp/Compression/ZLib/FlushType.cs b/RestSharp/Compression/ZLib/FlushType.cs index 2a1c9d944..82da56b2d 100644 --- a/RestSharp/Compression/ZLib/FlushType.cs +++ b/RestSharp/Compression/ZLib/FlushType.cs @@ -1,4 +1,5 @@ -#if WINDOWS_PHONE + +#if WINDOWS_PHONE using System; using System.Net; diff --git a/RestSharp/Compression/ZLib/GZipStream.cs b/RestSharp/Compression/ZLib/GZipStream.cs index a2501f0e9..ecdd9bbe4 100644 --- a/RestSharp/Compression/ZLib/GZipStream.cs +++ b/RestSharp/Compression/ZLib/GZipStream.cs @@ -26,6 +26,7 @@ // // ------------------------------------------------------------------ + #if WINDOWS_PHONE using System; diff --git a/RestSharp/Compression/ZLib/InfTree.cs b/RestSharp/Compression/ZLib/InfTree.cs index 0d0881610..cf841f4e0 100644 --- a/RestSharp/Compression/ZLib/InfTree.cs +++ b/RestSharp/Compression/ZLib/InfTree.cs @@ -59,6 +59,7 @@ // // ----------------------------------------------------------------------- + #if WINDOWS_PHONE using System; diff --git a/RestSharp/Compression/ZLib/Inflate.cs b/RestSharp/Compression/ZLib/Inflate.cs index f1abe9d38..da00e8233 100644 --- a/RestSharp/Compression/ZLib/Inflate.cs +++ b/RestSharp/Compression/ZLib/Inflate.cs @@ -61,6 +61,7 @@ // // ----------------------------------------------------------------------- + #if WINDOWS_PHONE using System; diff --git a/RestSharp/Compression/ZLib/ZLib.cs b/RestSharp/Compression/ZLib/ZLib.cs index 7710e257a..8ce5e6277 100644 --- a/RestSharp/Compression/ZLib/ZLib.cs +++ b/RestSharp/Compression/ZLib/ZLib.cs @@ -62,6 +62,7 @@ // // ----------------------------------------------------------------------- + #if WINDOWS_PHONE using System; diff --git a/RestSharp/Compression/ZLib/ZLibCodec.cs b/RestSharp/Compression/ZLib/ZLibCodec.cs index 4d2e81379..529d0618f 100644 --- a/RestSharp/Compression/ZLib/ZLibCodec.cs +++ b/RestSharp/Compression/ZLib/ZLibCodec.cs @@ -63,6 +63,7 @@ // // ----------------------------------------------------------------------- + #if WINDOWS_PHONE namespace RestSharp.Compression.ZLib diff --git a/RestSharp/Compression/ZLib/ZLibConstants.cs b/RestSharp/Compression/ZLib/ZLibConstants.cs index 09be374a5..2c50393bf 100644 --- a/RestSharp/Compression/ZLib/ZLibConstants.cs +++ b/RestSharp/Compression/ZLib/ZLibConstants.cs @@ -60,6 +60,7 @@ // // ----------------------------------------------------------------------- + #if WINDOWS_PHONE namespace RestSharp.Compression.ZLib diff --git a/RestSharp/Compression/ZLib/ZLibStream.cs b/RestSharp/Compression/ZLib/ZLibStream.cs index 6698e9676..a0ed375b9 100644 --- a/RestSharp/Compression/ZLib/ZLibStream.cs +++ b/RestSharp/Compression/ZLib/ZLibStream.cs @@ -25,6 +25,7 @@ // // ------------------------------------------------------------------ + #if WINDOWS_PHONE using System; diff --git a/RestSharp/Deserializers/DeserializeAsAttribute.cs b/RestSharp/Deserializers/DeserializeAsAttribute.cs index ce0f6a0d1..6141e8637 100644 --- a/RestSharp/Deserializers/DeserializeAsAttribute.cs +++ b/RestSharp/Deserializers/DeserializeAsAttribute.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; diff --git a/RestSharp/Deserializers/DotNetXmlDeserializer.cs b/RestSharp/Deserializers/DotNetXmlDeserializer.cs index ba6da54b6..69f06767b 100644 --- a/RestSharp/Deserializers/DotNetXmlDeserializer.cs +++ b/RestSharp/Deserializers/DotNetXmlDeserializer.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System.IO; @@ -42,7 +44,7 @@ public T Deserialize(IRestResponse response) { XmlSerializer serializer = new XmlSerializer(typeof(T)); - return (T)serializer.Deserialize(stream); + return (T) serializer.Deserialize(stream); } } } diff --git a/RestSharp/Deserializers/IDeserializer.cs b/RestSharp/Deserializers/IDeserializer.cs index 6556ae8a6..aff48d444 100644 --- a/RestSharp/Deserializers/IDeserializer.cs +++ b/RestSharp/Deserializers/IDeserializer.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion namespace RestSharp.Deserializers diff --git a/RestSharp/Deserializers/JsonDeserializer.cs b/RestSharp/Deserializers/JsonDeserializer.cs index 2bb6daf95..ef773c9d9 100644 --- a/RestSharp/Deserializers/JsonDeserializer.cs +++ b/RestSharp/Deserializers/JsonDeserializer.cs @@ -22,7 +22,7 @@ public class JsonDeserializer : IDeserializer public JsonDeserializer() { - Culture = CultureInfo.InvariantCulture; + this.Culture = CultureInfo.InvariantCulture; } public T Deserialize(IRestResponse response) @@ -33,30 +33,30 @@ public T Deserialize(IRestResponse response) { Type objType = target.GetType(); - if (RootElement.HasValue()) + if (this.RootElement.HasValue()) { - object root = FindRoot(response.Content); + object root = this.FindRoot(response.Content); - target = (T)BuildList(objType, root); + target = (T) this.BuildList(objType, root); } else { object data = SimpleJson.DeserializeObject(response.Content); - target = (T)BuildList(objType, data); + target = (T) this.BuildList(objType, data); } } else if (target is IDictionary) { - object root = FindRoot(response.Content); + object root = this.FindRoot(response.Content); - target = (T)BuildDictionary(target.GetType(), root); + target = (T) this.BuildDictionary(target.GetType(), root); } else { - object root = FindRoot(response.Content); + object root = this.FindRoot(response.Content); - target = (T)Map(target, (IDictionary)root); + target = (T) this.Map(target, (IDictionary) root); } return target; @@ -64,11 +64,11 @@ public T Deserialize(IRestResponse response) private object FindRoot(string content) { - IDictionary data = (IDictionary)SimpleJson.DeserializeObject(content); + IDictionary data = (IDictionary) SimpleJson.DeserializeObject(content); - if (RootElement.HasValue() && data.ContainsKey(RootElement)) + if (this.RootElement.HasValue() && data.ContainsKey(this.RootElement)) { - return data[RootElement]; + return data[this.RootElement]; } return data; @@ -77,7 +77,9 @@ private object FindRoot(string content) private object Map(object target, IDictionary data) { Type objType = target.GetType(); - List props = objType.GetProperties().Where(p => p.CanWrite).ToList(); + List props = objType.GetProperties() + .Where(p => p.CanWrite) + .ToList(); foreach (PropertyInfo prop in props) { @@ -87,7 +89,7 @@ private object Map(object target, IDictionary data) if (attributes.Length > 0) { - DeserializeAsAttribute attribute = (DeserializeAsAttribute)attributes[0]; + DeserializeAsAttribute attribute = (DeserializeAsAttribute) attributes[0]; name = attribute.Name; } else @@ -101,19 +103,28 @@ private object Map(object target, IDictionary data) for (int i = 0; i < parts.Length; ++i) { - string actualName = parts[i].GetNameVariants(Culture).FirstOrDefault(currentData.ContainsKey); + string actualName = parts[i].GetNameVariants(this.Culture) + .FirstOrDefault(currentData.ContainsKey); if (actualName == null) + { break; + } if (i == parts.Length - 1) + { value = currentData[actualName]; + } else - currentData = (IDictionary)currentData[actualName]; + { + currentData = (IDictionary) currentData[actualName]; + } } if (value != null) - prop.SetValue(target, ConvertValue(type, value), null); + { + prop.SetValue(target, this.ConvertValue(type, value), null); + } } return target; @@ -121,25 +132,25 @@ private object Map(object target, IDictionary data) private IDictionary BuildDictionary(Type type, object parent) { - IDictionary dict = (IDictionary)Activator.CreateInstance(type); + IDictionary dict = (IDictionary) Activator.CreateInstance(type); Type keyType = type.GetGenericArguments()[0]; Type valueType = type.GetGenericArguments()[1]; - foreach (KeyValuePair child in (IDictionary)parent) + foreach (KeyValuePair child in (IDictionary) parent) { - object key = keyType != typeof (string) ? - Convert.ChangeType(child.Key, keyType, CultureInfo.InvariantCulture) : - child.Key; + object key = keyType != typeof(string) + ? Convert.ChangeType(child.Key, keyType, CultureInfo.InvariantCulture) + : child.Key; object item; if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(List<>)) { - item = BuildList(valueType, child.Value); + item = this.BuildList(valueType, child.Value); } else { - item = ConvertValue(valueType, child.Value); + item = this.ConvertValue(valueType, child.Value); } dict.Add(key, item); @@ -150,18 +161,20 @@ private IDictionary BuildDictionary(Type type, object parent) private IList BuildList(Type type, object parent) { - IList list = (IList)Activator.CreateInstance(type); - Type listType = type.GetInterfaces().First + IList list = (IList) Activator.CreateInstance(type); + Type listType = type.GetInterfaces() + .First (x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IList<>)); Type itemType = listType.GetGenericArguments()[0]; if (parent is IList) { - foreach (object element in (IList)parent) + foreach (object element in (IList) parent) { if (itemType.IsPrimitive) { - object item = ConvertValue(itemType, element); + object item = this.ConvertValue(itemType, element); + list.Add(item); } else if (itemType == typeof(string)) @@ -182,14 +195,15 @@ private IList BuildList(Type type, object parent) continue; } - object item = ConvertValue(itemType, element); + object item = this.ConvertValue(itemType, element); + list.Add(item); } } } else { - list.Add(ConvertValue(itemType, parent)); + list.Add(this.ConvertValue(itemType, parent)); } return list; @@ -197,14 +211,16 @@ private IList BuildList(Type type, object parent) private object ConvertValue(Type type, object value) { - string stringValue = Convert.ToString(value, Culture); + string stringValue = Convert.ToString(value, this.Culture); // check for nullable and extract underlying type if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { // Since the type is nullable and no value is provided return null if (string.IsNullOrEmpty(stringValue)) + { return null; + } type = type.GetGenericArguments()[0]; } @@ -216,12 +232,12 @@ private object ConvertValue(Type type, object value) if (type.IsPrimitive) { - return value.ChangeType(type, Culture); + return value.ChangeType(type, this.Culture); } if (type.IsEnum) { - return type.FindEnumValue(stringValue, Culture); + return type.FindEnumValue(stringValue, this.Culture); } if (type == typeof(Uri)) @@ -238,15 +254,15 @@ private object ConvertValue(Type type, object value) { DateTime dt; - if (DateFormat.HasValue()) + if (this.DateFormat.HasValue()) { - dt = DateTime.ParseExact(stringValue, DateFormat, Culture, + dt = DateTime.ParseExact(stringValue, this.DateFormat, this.Culture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); } else { // try parsing instead - dt = stringValue.ParseJsonDate(Culture); + dt = stringValue.ParseJsonDate(this.Culture); } if (type == typeof(DateTime)) @@ -256,22 +272,28 @@ private object ConvertValue(Type type, object value) if (type == typeof(DateTimeOffset)) { - return (DateTimeOffset)dt; + return (DateTimeOffset) dt; } } else if (type == typeof(decimal)) { if (value is double) - return (decimal)((double)value); + { + return (decimal) ((double) value); + } if (stringValue.Contains("e")) - return decimal.Parse(stringValue, NumberStyles.Float, Culture); + { + return decimal.Parse(stringValue, NumberStyles.Float, this.Culture); + } - return decimal.Parse(stringValue, Culture); + return decimal.Parse(stringValue, this.Culture); } else if (type == typeof(Guid)) { - return string.IsNullOrEmpty(stringValue) ? Guid.Empty : new Guid(stringValue); + return string.IsNullOrEmpty(stringValue) + ? Guid.Empty + : new Guid(stringValue); } else if (type == typeof(TimeSpan)) { @@ -291,7 +313,7 @@ private object ConvertValue(Type type, object value) if (genericTypeDef == typeof(List<>)) { - return BuildList(type, value); + return this.BuildList(type, value); } if (genericTypeDef == typeof(Dictionary<,>)) @@ -301,29 +323,29 @@ private object ConvertValue(Type type, object value) // only supports Dict() if (keyType == typeof(string)) { - return BuildDictionary(type, value); + return this.BuildDictionary(type, value); } } else { // nested property classes - return CreateAndMap(type, value); + return this.CreateAndMap(type, value); } } else if (type.IsSubclassOfRawGeneric(typeof(List<>))) { // handles classes that derive from List - return BuildList(type, value); + return this.BuildList(type, value); } else if (type == typeof(JsonObject)) { // simplify JsonObject into a Dictionary - return BuildDictionary(typeof(Dictionary), value); + return this.BuildDictionary(typeof(Dictionary), value); } else { // nested property classes - return CreateAndMap(type, value); + return this.CreateAndMap(type, value); } return null; @@ -333,7 +355,7 @@ private object CreateAndMap(Type type, object element) { object instance = Activator.CreateInstance(type); - Map(instance, (IDictionary)element); + this.Map(instance, (IDictionary) element); return instance; } diff --git a/RestSharp/Deserializers/XmlAttributeDeserializer.cs b/RestSharp/Deserializers/XmlAttributeDeserializer.cs index bb31e355b..8d44cee80 100644 --- a/RestSharp/Deserializers/XmlAttributeDeserializer.cs +++ b/RestSharp/Deserializers/XmlAttributeDeserializer.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System.Reflection; diff --git a/RestSharp/Deserializers/XmlDeserializer.cs b/RestSharp/Deserializers/XmlDeserializer.cs index a535c7f9e..c76acc530 100644 --- a/RestSharp/Deserializers/XmlDeserializer.cs +++ b/RestSharp/Deserializers/XmlDeserializer.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -42,24 +44,26 @@ public class XmlDeserializer : IDeserializer public XmlDeserializer() { - Culture = CultureInfo.InvariantCulture; + this.Culture = CultureInfo.InvariantCulture; } public virtual T Deserialize(IRestResponse response) { if (string.IsNullOrEmpty(response.Content)) + { return default(T); + } XDocument doc = XDocument.Parse(response.Content); XElement root = doc.Root; - if (RootElement.HasValue() && doc.Root != null) + if (this.RootElement.HasValue() && doc.Root != null) { - root = doc.Root.Element(RootElement.AsNamespaced(Namespace)); + root = doc.Root.Element(this.RootElement.AsNamespaced(this.Namespace)); } // autodetect xml namespace - if (!Namespace.HasValue()) + if (!this.Namespace.HasValue()) { RemoveNamespace(doc); } @@ -69,11 +73,11 @@ public virtual T Deserialize(IRestResponse response) if (objType.IsSubclassOfRawGeneric(typeof(List<>))) { - x = (T) HandleListDerivative(root, objType.Name, objType); + x = (T) this.HandleListDerivative(root, objType.Name, objType); } else { - x = (T) Map(x, root); + x = (T) this.Map(x, root); } return x; @@ -90,7 +94,8 @@ private static void RemoveNamespace(XDocument xdoc) e.Name = XNamespace.None.GetName(e.Name.LocalName); } - if (e.Attributes().Any(a => a.IsNamespaceDeclaration || a.Name.Namespace != XNamespace.None)) + if (e.Attributes() + .Any(a => a.IsNamespaceDeclaration || a.Name.Namespace != XNamespace.None)) { e.ReplaceAttributes( e.Attributes() @@ -115,7 +120,9 @@ protected virtual object Map(object x, XElement root) bool typeIsPublic = type.IsPublic || type.IsNestedPublic; if (!typeIsPublic || !prop.CanWrite) + { continue; + } object[] attributes = prop.GetCustomAttributes(typeof(DeserializeAsAttribute), false); XName name; @@ -124,14 +131,14 @@ protected virtual object Map(object x, XElement root) { DeserializeAsAttribute attribute = (DeserializeAsAttribute) attributes[0]; - name = attribute.Name.AsNamespaced(Namespace); + name = attribute.Name.AsNamespaced(this.Namespace); } else { - name = prop.Name.AsNamespaced(Namespace); + name = prop.Name.AsNamespaced(this.Namespace); } - object value = GetValueFromXml(root, name, prop); + object value = this.GetValueFromXml(root, name, prop); if (value == null) { @@ -139,7 +146,7 @@ protected virtual object Map(object x, XElement root) if (type.IsGenericType) { Type genericType = type.GetGenericArguments()[0]; - XElement first = GetElementByName(root, genericType.Name); + XElement first = this.GetElementByName(root, genericType.Name); IList list = (IList) Activator.CreateInstance(type); if (first != null && root != null) @@ -169,17 +176,18 @@ protected virtual object Map(object x, XElement root) if (type == typeof(bool)) { - string toConvert = value.ToString().ToLower(); + string toConvert = value.ToString() + .ToLower(); prop.SetValue(x, XmlConvert.ToBoolean(toConvert), null); } else if (type.IsPrimitive) { - prop.SetValue(x, value.ChangeType(type, Culture), null); + prop.SetValue(x, value.ChangeType(type, this.Culture), null); } else if (type.IsEnum) { - object converted = type.FindEnumValue(value.ToString(), Culture); + object converted = type.FindEnumValue(value.ToString(), this.Culture); prop.SetValue(x, converted, null); } @@ -196,8 +204,8 @@ protected virtual object Map(object x, XElement root) else if (type == typeof(DateTime)) { value = this.DateFormat.HasValue() - ? DateTime.ParseExact(value.ToString(), this.DateFormat, this.Culture) - : DateTime.Parse(value.ToString(), this.Culture); + ? DateTime.ParseExact(value.ToString(), this.DateFormat, this.Culture) + : DateTime.Parse(value.ToString(), this.Culture); prop.SetValue(x, value, null); } @@ -233,14 +241,17 @@ protected virtual object Map(object x, XElement root) } else if (type == typeof(decimal)) { - value = decimal.Parse(value.ToString(), Culture); + value = decimal.Parse(value.ToString(), this.Culture); prop.SetValue(x, value, null); } else if (type == typeof(Guid)) { string raw = value.ToString(); - value = string.IsNullOrEmpty(raw) ? Guid.Empty : new Guid(value.ToString()); + value = string.IsNullOrEmpty(raw) + ? Guid.Empty + : new Guid(value.ToString()); + prop.SetValue(x, value, null); } else if (type == typeof(TimeSpan)) @@ -253,7 +264,7 @@ protected virtual object Map(object x, XElement root) { Type t = type.GetGenericArguments()[0]; IList list = (IList) Activator.CreateInstance(type); - XElement container = GetElementByName(root, prop.Name.AsNamespaced(Namespace)); + XElement container = this.GetElementByName(root, prop.Name.AsNamespaced(this.Namespace)); if (container.HasElements) { @@ -273,7 +284,7 @@ protected virtual object Map(object x, XElement root) { // handles classes that derive from List // e.g. a collection that also has attributes - object list = HandleListDerivative(root, prop.Name, type); + object list = this.HandleListDerivative(root, prop.Name, type); prop.SetValue(x, list, null); } @@ -291,11 +302,11 @@ protected virtual object Map(object x, XElement root) // nested property classes if (root != null) { - XElement element = GetElementByName(root, name); + XElement element = this.GetElementByName(root, name); if (element != null) { - object item = CreateAndMap(type, element); + object item = this.CreateAndMap(type, element); prop.SetValue(x, item, null); } @@ -339,14 +350,19 @@ private void PopulateListFromElements(Type t, IEnumerable elements, IL private object HandleListDerivative(XElement root, string propName, Type type) { - Type t = type.IsGenericType ? type.GetGenericArguments()[0] : type.BaseType.GetGenericArguments()[0]; + Type t = type.IsGenericType + ? type.GetGenericArguments()[0] + : type.BaseType.GetGenericArguments()[0]; IList list = (IList) Activator.CreateInstance(type); - IList elements = root.Descendants(t.Name.AsNamespaced(this.Namespace)).ToList(); + IList elements = root.Descendants(t.Name.AsNamespaced(this.Namespace)) + .ToList(); string name = t.Name; DeserializeAsAttribute attribute = t.GetAttribute(); if (attribute != null) + { name = attribute.Name; + } if (!elements.Any()) { @@ -401,12 +417,12 @@ protected virtual object CreateAndMap(Type t, XElement element) } else if (t.IsPrimitive) { - item = element.Value.ChangeType(t, Culture); + item = element.Value.ChangeType(t, this.Culture); } else { item = Activator.CreateInstance(t); - Map(item, element); + this.Map(item, element); } return item; @@ -418,11 +434,11 @@ protected virtual object GetValueFromXml(XElement root, XName name, PropertyInfo if (root != null) { - XElement element = GetElementByName(root, name); + XElement element = this.GetElementByName(root, name); if (element == null) { - XAttribute attribute = GetAttributeByName(root, name); + XAttribute attribute = this.GetAttributeByName(root, name); if (attribute != null) { @@ -444,7 +460,7 @@ protected virtual object GetValueFromXml(XElement root, XName name, PropertyInfo protected virtual XElement GetElementByName(XElement root, XName name) { XName lowerName = name.LocalName.ToLower().AsNamespaced(name.NamespaceName); - XName camelName = name.LocalName.ToCamelCase(Culture).AsNamespaced(name.NamespaceName); + XName camelName = name.LocalName.ToCamelCase(this.Culture).AsNamespaced(name.NamespaceName); if (root.Element(name) != null) { @@ -480,8 +496,10 @@ protected virtual XAttribute GetAttributeByName(XElement root, XName name) List names = new List { name.LocalName, - name.LocalName.ToLower().AsNamespaced(name.NamespaceName), - name.LocalName.ToCamelCase(Culture).AsNamespaced(name.NamespaceName) + name.LocalName.ToLower() + .AsNamespaced(name.NamespaceName), + name.LocalName.ToCamelCase(this.Culture) + .AsNamespaced(name.NamespaceName) }; return root.DescendantsAndSelf() diff --git a/RestSharp/Extensions/MiscExtensions.cs b/RestSharp/Extensions/MiscExtensions.cs index f9d8f5e8e..8214f08d2 100644 --- a/RestSharp/Extensions/MiscExtensions.cs +++ b/RestSharp/Extensions/MiscExtensions.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System.IO; @@ -72,7 +74,9 @@ public static void CopyTo(this Stream input, Stream output) int read = input.Read(buffer, 0, buffer.Length); if (read <= 0) + { return; + } output.Write(buffer, 0, read); } @@ -87,7 +91,9 @@ public static void CopyTo(this Stream input, Stream output) public static string AsString(this byte[] buffer) { if (buffer == null) + { return ""; + } // Ansi as default Encoding encoding = Encoding.UTF8; diff --git a/RestSharp/Extensions/MonoHttp/Helpers.cs b/RestSharp/Extensions/MonoHttp/Helpers.cs index 7f837ee07..8dc7d5862 100644 --- a/RestSharp/Extensions/MonoHttp/Helpers.cs +++ b/RestSharp/Extensions/MonoHttp/Helpers.cs @@ -31,7 +31,7 @@ namespace RestSharp.Extensions.MonoHttp { - class Helpers + internal class Helpers { public static readonly CultureInfo InvariantCulture = CultureInfo.InvariantCulture; } diff --git a/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs b/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs index 6e1cafa02..5317a98ec 100644 --- a/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs +++ b/RestSharp/Extensions/MonoHttp/HtmlEncoder.cs @@ -36,28 +36,30 @@ using System.IO; using System.Text; -#if NET_4_0 -using System.Web.Configuration; -#endif - namespace RestSharp.Extensions.MonoHttp { - class HttpEncoder + internal class HttpEncoder { - static readonly char[] hexChars = "0123456789abcdef".ToCharArray(); - static readonly object entitiesLock = new object(); - static SortedDictionary entities; - static readonly HttpEncoder defaultEncoder; - static readonly HttpEncoder currentEncoder; + private static readonly char[] hexChars = "0123456789abcdef".ToCharArray(); + + private static readonly object entitiesLock = new object(); + + private static SortedDictionary entities; + + private static readonly HttpEncoder defaultEncoder; - static IDictionary Entities + private static readonly HttpEncoder currentEncoder; + + private static IDictionary Entities { get { lock (entitiesLock) { if (entities == null) + { InitEntities(); + } return entities; } @@ -66,18 +68,12 @@ static IDictionary Entities public static HttpEncoder Current { - get - { - return currentEncoder; - } + get { return currentEncoder; } } public static HttpEncoder Default { - get - { - return defaultEncoder; - } + get { return defaultEncoder; } } static HttpEncoder() @@ -89,41 +85,57 @@ static HttpEncoder() internal static void HeaderNameValueEncode(string headerName, string headerValue, out string encodedHeaderName, out string encodedHeaderValue) { - encodedHeaderName = string.IsNullOrEmpty(headerName) ? headerName : EncodeHeaderString(headerName); - encodedHeaderValue = string.IsNullOrEmpty(headerValue) ? headerValue : EncodeHeaderString(headerValue); + encodedHeaderName = string.IsNullOrEmpty(headerName) + ? headerName + : EncodeHeaderString(headerName); + encodedHeaderValue = string.IsNullOrEmpty(headerValue) + ? headerValue + : EncodeHeaderString(headerValue); } - static void StringBuilderAppend(string s, ref StringBuilder sb) + private static void StringBuilderAppend(string s, ref StringBuilder sb) { if (sb == null) + { sb = new StringBuilder(s); + } else + { sb.Append(s); + } } - static string EncodeHeaderString(string input) + private static string EncodeHeaderString(string input) { StringBuilder sb = null; foreach (char ch in input) { if ((ch < 32 && ch != 9) || ch == 127) + { StringBuilderAppend(string.Format("%{0:x2}", (int) ch), ref sb); + } } - return sb != null ? sb.ToString() : input; + return sb != null + ? sb.ToString() + : input; } internal static string UrlPathEncode(string value) { if (string.IsNullOrEmpty(value)) + { return value; + } MemoryStream result = new MemoryStream(); int length = value.Length; for (int i = 0; i < length; i++) + { UrlPathEncodeChar(value[i], result); + } byte[] bytes = result.ToArray(); @@ -133,24 +145,34 @@ internal static string UrlPathEncode(string value) internal static byte[] UrlEncodeToBytes(byte[] bytes, int offset, int count) { if (bytes == null) + { throw new ArgumentNullException("bytes"); + } int blen = bytes.Length; if (blen == 0) + { return new byte[0]; + } if (offset < 0 || offset >= blen) + { throw new ArgumentOutOfRangeException("offset"); + } if (count < 0 || count > blen - offset) + { throw new ArgumentOutOfRangeException("count"); + } MemoryStream result = new MemoryStream(count); int end = offset + count; for (int i = offset; i < end; i++) + { UrlEncodeChar((char) bytes[i], result, false); + } return result.ToArray(); } @@ -158,10 +180,14 @@ internal static byte[] UrlEncodeToBytes(byte[] bytes, int offset, int count) internal static string HtmlEncode(string s) { if (s == null) + { return null; + } if (s.Length == 0) + { return string.Empty; + } bool needEncode = false; @@ -177,7 +203,9 @@ internal static string HtmlEncode(string s) } if (!needEncode) + { return s; + } StringBuilder output = new StringBuilder(); int len = s.Length; @@ -220,7 +248,9 @@ internal static string HtmlEncode(string s) output.Append(";"); } else + { output.Append(ch); + } break; } @@ -232,10 +262,14 @@ internal static string HtmlEncode(string s) internal static string HtmlAttributeEncode(string s) { if (s == null) + { return null; + } if (s.Length == 0) + { return string.Empty; + } bool needEncode = false; @@ -251,7 +285,9 @@ internal static string HtmlAttributeEncode(string s) } if (!needEncode) + { return s; + } StringBuilder output = new StringBuilder(); int len = s.Length; @@ -284,13 +320,19 @@ internal static string HtmlAttributeEncode(string s) internal static string HtmlDecode(string s) { if (s == null) + { return null; + } if (s.Length == 0) + { return string.Empty; + } if (s.IndexOf('&') == -1) + { return s; + } StringBuilder entity = new StringBuilder(); StringBuilder output = new StringBuilder(); @@ -355,7 +397,9 @@ internal static string HtmlDecode(string s) { number = 0; isHexValue = false; - state = c != '#' ? 2 : 3; + state = c != '#' + ? 2 + : 3; entity.Append(c); } @@ -369,7 +413,9 @@ internal static string HtmlDecode(string s) string key = entity.ToString(); if (key.Length > 1 && Entities.ContainsKey(key.Substring(1, key.Length - 2))) + { key = Entities[key.Substring(1, key.Length - 2)].ToString(); + } output.Append(key); state = 0; @@ -495,7 +541,9 @@ internal static void UrlEncodeChar(char c, Stream result, bool isUnicode) result.WriteByte((byte) '0'); } else + { result.WriteByte((byte) '%'); + } int idx = c >> 4; @@ -504,7 +552,9 @@ internal static void UrlEncodeChar(char c, Stream result, bool isUnicode) result.WriteByte((byte) hexChars[idx]); } else + { result.WriteByte((byte) c); + } } internal static void UrlPathEncodeChar(char c, Stream result) @@ -531,267 +581,269 @@ internal static void UrlPathEncodeChar(char c, Stream result) result.WriteByte((byte) '0'); } else + { result.WriteByte((byte) c); + } } - static void InitEntities() + private static void InitEntities() { // Build the hash table of HTML entity references. This list comes // from the HTML 4.01 W3C recommendation. entities = new SortedDictionary(StringComparer.Ordinal) { - { "nbsp", '\u00A0' }, - { "iexcl", '\u00A1' }, - { "cent", '\u00A2' }, - { "pound", '\u00A3' }, - { "curren", '\u00A4' }, - { "yen", '\u00A5' }, - { "brvbar", '\u00A6' }, - { "sect", '\u00A7' }, - { "uml", '\u00A8' }, - { "copy", '\u00A9' }, - { "ordf", '\u00AA' }, - { "laquo", '\u00AB' }, - { "not", '\u00AC' }, - { "shy", '\u00AD' }, - { "reg", '\u00AE' }, - { "macr", '\u00AF' }, - { "deg", '\u00B0' }, - { "plusmn", '\u00B1' }, - { "sup2", '\u00B2' }, - { "sup3", '\u00B3' }, - { "acute", '\u00B4' }, - { "micro", '\u00B5' }, - { "para", '\u00B6' }, - { "middot", '\u00B7' }, - { "cedil", '\u00B8' }, - { "sup1", '\u00B9' }, - { "ordm", '\u00BA' }, - { "raquo", '\u00BB' }, - { "frac14", '\u00BC' }, - { "frac12", '\u00BD' }, - { "frac34", '\u00BE' }, - { "iquest", '\u00BF' }, - { "Agrave", '\u00C0' }, - { "Aacute", '\u00C1' }, - { "Acirc", '\u00C2' }, - { "Atilde", '\u00C3' }, - { "Auml", '\u00C4' }, - { "Aring", '\u00C5' }, - { "AElig", '\u00C6' }, - { "Ccedil", '\u00C7' }, - { "Egrave", '\u00C8' }, - { "Eacute", '\u00C9' }, - { "Ecirc", '\u00CA' }, - { "Euml", '\u00CB' }, - { "Igrave", '\u00CC' }, - { "Iacute", '\u00CD' }, - { "Icirc", '\u00CE' }, - { "Iuml", '\u00CF' }, - { "ETH", '\u00D0' }, - { "Ntilde", '\u00D1' }, - { "Ograve", '\u00D2' }, - { "Oacute", '\u00D3' }, - { "Ocirc", '\u00D4' }, - { "Otilde", '\u00D5' }, - { "Ouml", '\u00D6' }, - { "times", '\u00D7' }, - { "Oslash", '\u00D8' }, - { "Ugrave", '\u00D9' }, - { "Uacute", '\u00DA' }, - { "Ucirc", '\u00DB' }, - { "Uuml", '\u00DC' }, - { "Yacute", '\u00DD' }, - { "THORN", '\u00DE' }, - { "szlig", '\u00DF' }, - { "agrave", '\u00E0' }, - { "aacute", '\u00E1' }, - { "acirc", '\u00E2' }, - { "atilde", '\u00E3' }, - { "auml", '\u00E4' }, - { "aring", '\u00E5' }, - { "aelig", '\u00E6' }, - { "ccedil", '\u00E7' }, - { "egrave", '\u00E8' }, - { "eacute", '\u00E9' }, - { "ecirc", '\u00EA' }, - { "euml", '\u00EB' }, - { "igrave", '\u00EC' }, - { "iacute", '\u00ED' }, - { "icirc", '\u00EE' }, - { "iuml", '\u00EF' }, - { "eth", '\u00F0' }, - { "ntilde", '\u00F1' }, - { "ograve", '\u00F2' }, - { "oacute", '\u00F3' }, - { "ocirc", '\u00F4' }, - { "otilde", '\u00F5' }, - { "ouml", '\u00F6' }, - { "divide", '\u00F7' }, - { "oslash", '\u00F8' }, - { "ugrave", '\u00F9' }, - { "uacute", '\u00FA' }, - { "ucirc", '\u00FB' }, - { "uuml", '\u00FC' }, - { "yacute", '\u00FD' }, - { "thorn", '\u00FE' }, - { "yuml", '\u00FF' }, - { "fnof", '\u0192' }, - { "Alpha", '\u0391' }, - { "Beta", '\u0392' }, - { "Gamma", '\u0393' }, - { "Delta", '\u0394' }, - { "Epsilon", '\u0395' }, - { "Zeta", '\u0396' }, - { "Eta", '\u0397' }, - { "Theta", '\u0398' }, - { "Iota", '\u0399' }, - { "Kappa", '\u039A' }, - { "Lambda", '\u039B' }, - { "Mu", '\u039C' }, - { "Nu", '\u039D' }, - { "Xi", '\u039E' }, - { "Omicron", '\u039F' }, - { "Pi", '\u03A0' }, - { "Rho", '\u03A1' }, - { "Sigma", '\u03A3' }, - { "Tau", '\u03A4' }, - { "Upsilon", '\u03A5' }, - { "Phi", '\u03A6' }, - { "Chi", '\u03A7' }, - { "Psi", '\u03A8' }, - { "Omega", '\u03A9' }, - { "alpha", '\u03B1' }, - { "beta", '\u03B2' }, - { "gamma", '\u03B3' }, - { "delta", '\u03B4' }, - { "epsilon", '\u03B5' }, - { "zeta", '\u03B6' }, - { "eta", '\u03B7' }, - { "theta", '\u03B8' }, - { "iota", '\u03B9' }, - { "kappa", '\u03BA' }, - { "lambda", '\u03BB' }, - { "mu", '\u03BC' }, - { "nu", '\u03BD' }, - { "xi", '\u03BE' }, - { "omicron", '\u03BF' }, - { "pi", '\u03C0' }, - { "rho", '\u03C1' }, - { "sigmaf", '\u03C2' }, - { "sigma", '\u03C3' }, - { "tau", '\u03C4' }, - { "upsilon", '\u03C5' }, - { "phi", '\u03C6' }, - { "chi", '\u03C7' }, - { "psi", '\u03C8' }, - { "omega", '\u03C9' }, - { "thetasym", '\u03D1' }, - { "upsih", '\u03D2' }, - { "piv", '\u03D6' }, - { "bull", '\u2022' }, - { "hellip", '\u2026' }, - { "prime", '\u2032' }, - { "Prime", '\u2033' }, - { "oline", '\u203E' }, - { "frasl", '\u2044' }, - { "weierp", '\u2118' }, - { "image", '\u2111' }, - { "real", '\u211C' }, - { "trade", '\u2122' }, - { "alefsym", '\u2135' }, - { "larr", '\u2190' }, - { "uarr", '\u2191' }, - { "rarr", '\u2192' }, - { "darr", '\u2193' }, - { "harr", '\u2194' }, - { "crarr", '\u21B5' }, - { "lArr", '\u21D0' }, - { "uArr", '\u21D1' }, - { "rArr", '\u21D2' }, - { "dArr", '\u21D3' }, - { "hArr", '\u21D4' }, - { "forall", '\u2200' }, - { "part", '\u2202' }, - { "exist", '\u2203' }, - { "empty", '\u2205' }, - { "nabla", '\u2207' }, - { "isin", '\u2208' }, - { "notin", '\u2209' }, - { "ni", '\u220B' }, - { "prod", '\u220F' }, - { "sum", '\u2211' }, - { "minus", '\u2212' }, - { "lowast", '\u2217' }, - { "radic", '\u221A' }, - { "prop", '\u221D' }, - { "infin", '\u221E' }, - { "ang", '\u2220' }, - { "and", '\u2227' }, - { "or", '\u2228' }, - { "cap", '\u2229' }, - { "cup", '\u222A' }, - { "int", '\u222B' }, - { "there4", '\u2234' }, - { "sim", '\u223C' }, - { "cong", '\u2245' }, - { "asymp", '\u2248' }, - { "ne", '\u2260' }, - { "equiv", '\u2261' }, - { "le", '\u2264' }, - { "ge", '\u2265' }, - { "sub", '\u2282' }, - { "sup", '\u2283' }, - { "nsub", '\u2284' }, - { "sube", '\u2286' }, - { "supe", '\u2287' }, - { "oplus", '\u2295' }, - { "otimes", '\u2297' }, - { "perp", '\u22A5' }, - { "sdot", '\u22C5' }, - { "lceil", '\u2308' }, - { "rceil", '\u2309' }, - { "lfloor", '\u230A' }, - { "rfloor", '\u230B' }, - { "lang", '\u2329' }, - { "rang", '\u232A' }, - { "loz", '\u25CA' }, - { "spades", '\u2660' }, - { "clubs", '\u2663' }, - { "hearts", '\u2665' }, - { "diams", '\u2666' }, - { "quot", '\u0022' }, - { "amp", '\u0026' }, - { "lt", '\u003C' }, - { "gt", '\u003E' }, - { "OElig", '\u0152' }, - { "oelig", '\u0153' }, - { "Scaron", '\u0160' }, - { "scaron", '\u0161' }, - { "Yuml", '\u0178' }, - { "circ", '\u02C6' }, - { "tilde", '\u02DC' }, - { "ensp", '\u2002' }, - { "emsp", '\u2003' }, - { "thinsp", '\u2009' }, - { "zwnj", '\u200C' }, - { "zwj", '\u200D' }, - { "lrm", '\u200E' }, - { "rlm", '\u200F' }, - { "ndash", '\u2013' }, - { "mdash", '\u2014' }, - { "lsquo", '\u2018' }, - { "rsquo", '\u2019' }, - { "sbquo", '\u201A' }, - { "ldquo", '\u201C' }, - { "rdquo", '\u201D' }, - { "bdquo", '\u201E' }, - { "dagger", '\u2020' }, - { "Dagger", '\u2021' }, - { "permil", '\u2030' }, - { "lsaquo", '\u2039' }, - { "rsaquo", '\u203A' }, - { "euro", '\u20AC' } + {"nbsp", '\u00A0'}, + {"iexcl", '\u00A1'}, + {"cent", '\u00A2'}, + {"pound", '\u00A3'}, + {"curren", '\u00A4'}, + {"yen", '\u00A5'}, + {"brvbar", '\u00A6'}, + {"sect", '\u00A7'}, + {"uml", '\u00A8'}, + {"copy", '\u00A9'}, + {"ordf", '\u00AA'}, + {"laquo", '\u00AB'}, + {"not", '\u00AC'}, + {"shy", '\u00AD'}, + {"reg", '\u00AE'}, + {"macr", '\u00AF'}, + {"deg", '\u00B0'}, + {"plusmn", '\u00B1'}, + {"sup2", '\u00B2'}, + {"sup3", '\u00B3'}, + {"acute", '\u00B4'}, + {"micro", '\u00B5'}, + {"para", '\u00B6'}, + {"middot", '\u00B7'}, + {"cedil", '\u00B8'}, + {"sup1", '\u00B9'}, + {"ordm", '\u00BA'}, + {"raquo", '\u00BB'}, + {"frac14", '\u00BC'}, + {"frac12", '\u00BD'}, + {"frac34", '\u00BE'}, + {"iquest", '\u00BF'}, + {"Agrave", '\u00C0'}, + {"Aacute", '\u00C1'}, + {"Acirc", '\u00C2'}, + {"Atilde", '\u00C3'}, + {"Auml", '\u00C4'}, + {"Aring", '\u00C5'}, + {"AElig", '\u00C6'}, + {"Ccedil", '\u00C7'}, + {"Egrave", '\u00C8'}, + {"Eacute", '\u00C9'}, + {"Ecirc", '\u00CA'}, + {"Euml", '\u00CB'}, + {"Igrave", '\u00CC'}, + {"Iacute", '\u00CD'}, + {"Icirc", '\u00CE'}, + {"Iuml", '\u00CF'}, + {"ETH", '\u00D0'}, + {"Ntilde", '\u00D1'}, + {"Ograve", '\u00D2'}, + {"Oacute", '\u00D3'}, + {"Ocirc", '\u00D4'}, + {"Otilde", '\u00D5'}, + {"Ouml", '\u00D6'}, + {"times", '\u00D7'}, + {"Oslash", '\u00D8'}, + {"Ugrave", '\u00D9'}, + {"Uacute", '\u00DA'}, + {"Ucirc", '\u00DB'}, + {"Uuml", '\u00DC'}, + {"Yacute", '\u00DD'}, + {"THORN", '\u00DE'}, + {"szlig", '\u00DF'}, + {"agrave", '\u00E0'}, + {"aacute", '\u00E1'}, + {"acirc", '\u00E2'}, + {"atilde", '\u00E3'}, + {"auml", '\u00E4'}, + {"aring", '\u00E5'}, + {"aelig", '\u00E6'}, + {"ccedil", '\u00E7'}, + {"egrave", '\u00E8'}, + {"eacute", '\u00E9'}, + {"ecirc", '\u00EA'}, + {"euml", '\u00EB'}, + {"igrave", '\u00EC'}, + {"iacute", '\u00ED'}, + {"icirc", '\u00EE'}, + {"iuml", '\u00EF'}, + {"eth", '\u00F0'}, + {"ntilde", '\u00F1'}, + {"ograve", '\u00F2'}, + {"oacute", '\u00F3'}, + {"ocirc", '\u00F4'}, + {"otilde", '\u00F5'}, + {"ouml", '\u00F6'}, + {"divide", '\u00F7'}, + {"oslash", '\u00F8'}, + {"ugrave", '\u00F9'}, + {"uacute", '\u00FA'}, + {"ucirc", '\u00FB'}, + {"uuml", '\u00FC'}, + {"yacute", '\u00FD'}, + {"thorn", '\u00FE'}, + {"yuml", '\u00FF'}, + {"fnof", '\u0192'}, + {"Alpha", '\u0391'}, + {"Beta", '\u0392'}, + {"Gamma", '\u0393'}, + {"Delta", '\u0394'}, + {"Epsilon", '\u0395'}, + {"Zeta", '\u0396'}, + {"Eta", '\u0397'}, + {"Theta", '\u0398'}, + {"Iota", '\u0399'}, + {"Kappa", '\u039A'}, + {"Lambda", '\u039B'}, + {"Mu", '\u039C'}, + {"Nu", '\u039D'}, + {"Xi", '\u039E'}, + {"Omicron", '\u039F'}, + {"Pi", '\u03A0'}, + {"Rho", '\u03A1'}, + {"Sigma", '\u03A3'}, + {"Tau", '\u03A4'}, + {"Upsilon", '\u03A5'}, + {"Phi", '\u03A6'}, + {"Chi", '\u03A7'}, + {"Psi", '\u03A8'}, + {"Omega", '\u03A9'}, + {"alpha", '\u03B1'}, + {"beta", '\u03B2'}, + {"gamma", '\u03B3'}, + {"delta", '\u03B4'}, + {"epsilon", '\u03B5'}, + {"zeta", '\u03B6'}, + {"eta", '\u03B7'}, + {"theta", '\u03B8'}, + {"iota", '\u03B9'}, + {"kappa", '\u03BA'}, + {"lambda", '\u03BB'}, + {"mu", '\u03BC'}, + {"nu", '\u03BD'}, + {"xi", '\u03BE'}, + {"omicron", '\u03BF'}, + {"pi", '\u03C0'}, + {"rho", '\u03C1'}, + {"sigmaf", '\u03C2'}, + {"sigma", '\u03C3'}, + {"tau", '\u03C4'}, + {"upsilon", '\u03C5'}, + {"phi", '\u03C6'}, + {"chi", '\u03C7'}, + {"psi", '\u03C8'}, + {"omega", '\u03C9'}, + {"thetasym", '\u03D1'}, + {"upsih", '\u03D2'}, + {"piv", '\u03D6'}, + {"bull", '\u2022'}, + {"hellip", '\u2026'}, + {"prime", '\u2032'}, + {"Prime", '\u2033'}, + {"oline", '\u203E'}, + {"frasl", '\u2044'}, + {"weierp", '\u2118'}, + {"image", '\u2111'}, + {"real", '\u211C'}, + {"trade", '\u2122'}, + {"alefsym", '\u2135'}, + {"larr", '\u2190'}, + {"uarr", '\u2191'}, + {"rarr", '\u2192'}, + {"darr", '\u2193'}, + {"harr", '\u2194'}, + {"crarr", '\u21B5'}, + {"lArr", '\u21D0'}, + {"uArr", '\u21D1'}, + {"rArr", '\u21D2'}, + {"dArr", '\u21D3'}, + {"hArr", '\u21D4'}, + {"forall", '\u2200'}, + {"part", '\u2202'}, + {"exist", '\u2203'}, + {"empty", '\u2205'}, + {"nabla", '\u2207'}, + {"isin", '\u2208'}, + {"notin", '\u2209'}, + {"ni", '\u220B'}, + {"prod", '\u220F'}, + {"sum", '\u2211'}, + {"minus", '\u2212'}, + {"lowast", '\u2217'}, + {"radic", '\u221A'}, + {"prop", '\u221D'}, + {"infin", '\u221E'}, + {"ang", '\u2220'}, + {"and", '\u2227'}, + {"or", '\u2228'}, + {"cap", '\u2229'}, + {"cup", '\u222A'}, + {"int", '\u222B'}, + {"there4", '\u2234'}, + {"sim", '\u223C'}, + {"cong", '\u2245'}, + {"asymp", '\u2248'}, + {"ne", '\u2260'}, + {"equiv", '\u2261'}, + {"le", '\u2264'}, + {"ge", '\u2265'}, + {"sub", '\u2282'}, + {"sup", '\u2283'}, + {"nsub", '\u2284'}, + {"sube", '\u2286'}, + {"supe", '\u2287'}, + {"oplus", '\u2295'}, + {"otimes", '\u2297'}, + {"perp", '\u22A5'}, + {"sdot", '\u22C5'}, + {"lceil", '\u2308'}, + {"rceil", '\u2309'}, + {"lfloor", '\u230A'}, + {"rfloor", '\u230B'}, + {"lang", '\u2329'}, + {"rang", '\u232A'}, + {"loz", '\u25CA'}, + {"spades", '\u2660'}, + {"clubs", '\u2663'}, + {"hearts", '\u2665'}, + {"diams", '\u2666'}, + {"quot", '\u0022'}, + {"amp", '\u0026'}, + {"lt", '\u003C'}, + {"gt", '\u003E'}, + {"OElig", '\u0152'}, + {"oelig", '\u0153'}, + {"Scaron", '\u0160'}, + {"scaron", '\u0161'}, + {"Yuml", '\u0178'}, + {"circ", '\u02C6'}, + {"tilde", '\u02DC'}, + {"ensp", '\u2002'}, + {"emsp", '\u2003'}, + {"thinsp", '\u2009'}, + {"zwnj", '\u200C'}, + {"zwj", '\u200D'}, + {"lrm", '\u200E'}, + {"rlm", '\u200F'}, + {"ndash", '\u2013'}, + {"mdash", '\u2014'}, + {"lsquo", '\u2018'}, + {"rsquo", '\u2019'}, + {"sbquo", '\u201A'}, + {"ldquo", '\u201C'}, + {"rdquo", '\u201D'}, + {"bdquo", '\u201E'}, + {"dagger", '\u2020'}, + {"Dagger", '\u2021'}, + {"permil", '\u2030'}, + {"lsaquo", '\u2039'}, + {"rsaquo", '\u203A'}, + {"euro", '\u20AC'} }; } } diff --git a/RestSharp/Extensions/MonoHttp/HttpUtility.cs b/RestSharp/Extensions/MonoHttp/HttpUtility.cs index 4f076c50f..73dfc7423 100644 --- a/RestSharp/Extensions/MonoHttp/HttpUtility.cs +++ b/RestSharp/Extensions/MonoHttp/HttpUtility.cs @@ -40,14 +40,16 @@ namespace RestSharp.Extensions.MonoHttp { public sealed class HttpUtility { - sealed class HttpQsCollection : NameValueCollection + private sealed class HttpQsCollection : NameValueCollection { public override string ToString() { int count = Count; if (count == 0) + { return ""; + } StringBuilder sb = new StringBuilder(); string[] keys = AllKeys; @@ -58,18 +60,14 @@ public override string ToString() } if (sb.Length > 0) + { sb.Length--; + } return sb.ToString(); } } - #region Constructors - - public HttpUtility() { } - - #endregion // Constructors - #region Methods public static void HtmlAttributeEncode(string s, TextWriter output) @@ -92,32 +90,42 @@ public static string UrlDecode(string str) return UrlDecode(str, Encoding.UTF8); } - static char[] GetChars(MemoryStream b, Encoding e) + private static char[] GetChars(MemoryStream b, Encoding e) { - return e.GetChars(b.GetBuffer(), 0, (int)b.Length); + return e.GetChars(b.GetBuffer(), 0, (int) b.Length); } - static void WriteCharBytes(IList buf, char ch, Encoding e) + private static void WriteCharBytes(IList buf, char ch, Encoding e) { if (ch > 255) { - foreach (byte b in e.GetBytes(new char[] { ch })) + foreach (byte b in e.GetBytes(new [] { ch })) + { buf.Add(b); + } } else - buf.Add((byte)ch); + { + buf.Add((byte) ch); + } } public static string UrlDecode(string s, Encoding e) { if (null == s) + { return null; + } if (s.IndexOf('%') == -1 && s.IndexOf('+') == -1) + { return s; + } if (e == null) + { e = Encoding.UTF8; + } long len = s.Length; List bytes = new List(); @@ -137,15 +145,17 @@ public static string UrlDecode(string s, Encoding e) if (xchar != -1) { - WriteCharBytes(bytes, (char)xchar, e); + WriteCharBytes(bytes, (char) xchar, e); i += 5; } else + { WriteCharBytes(bytes, '%', e); + } } else if ((xchar = GetChar(s, i + 1, 2)) != -1) { - WriteCharBytes(bytes, (char)xchar, e); + WriteCharBytes(bytes, (char) xchar, e); i += 2; } else @@ -157,41 +167,53 @@ public static string UrlDecode(string s, Encoding e) } if (ch == '+') + { WriteCharBytes(bytes, ' ', e); + } else + { WriteCharBytes(bytes, ch, e); + } } byte[] buf = bytes.ToArray(); - bytes = null; + return e.GetString(buf, 0, buf.Length); } public static string UrlDecode(byte[] bytes, Encoding e) { if (bytes == null) + { return null; + } return UrlDecode(bytes, 0, bytes.Length, e); } - static int GetInt(byte b) + private static int GetInt(byte b) { - char c = (char)b; + char c = (char) b; if (c >= '0' && c <= '9') + { return c - '0'; + } if (c >= 'a' && c <= 'f') + { return c - 'a' + 10; + } if (c >= 'A' && c <= 'F') + { return c - 'A' + 10; + } return -1; } - static int GetChar(byte[] bytes, int offset, int length) + private static int GetChar(byte[] bytes, int offset, int length) { int value = 0; int end = length + offset; @@ -201,7 +223,9 @@ static int GetChar(byte[] bytes, int offset, int length) int current = GetInt(bytes[i]); if (current == -1) + { return -1; + } value = (value << 4) + current; } @@ -209,7 +233,7 @@ static int GetChar(byte[] bytes, int offset, int length) return value; } - static int GetChar(string str, int offset, int length) + private static int GetChar(string str, int offset, int length) { int val = 0; int end = length + offset; @@ -219,12 +243,16 @@ static int GetChar(string str, int offset, int length) char c = str[i]; if (c > 127) + { return -1; + } - int current = GetInt((byte)c); + int current = GetInt((byte) c); if (current == -1) + { return -1; + } val = (val << 4) + current; } @@ -235,19 +263,29 @@ static int GetChar(string str, int offset, int length) public static string UrlDecode(byte[] bytes, int offset, int count, Encoding e) { if (bytes == null) + { return null; + } if (count == 0) + { return string.Empty; + } if (bytes == null) + { throw new ArgumentNullException("bytes"); + } if (offset < 0 || offset > bytes.Length) + { throw new ArgumentOutOfRangeException("offset"); + } if (count < 0 || offset + count > bytes.Length) + { throw new ArgumentOutOfRangeException("count"); + } StringBuilder output = new StringBuilder(); MemoryStream acc = new MemoryStream(); @@ -260,7 +298,7 @@ public static string UrlDecode(byte[] bytes, int offset, int count, Encoding e) { int xchar; - if (bytes[i + 1] == (byte)'u' && i + 5 < end) + if (bytes[i + 1] == (byte) 'u' && i + 5 < end) { if (acc.Length > 0) { @@ -272,7 +310,7 @@ public static string UrlDecode(byte[] bytes, int offset, int count, Encoding e) if (xchar != -1) { - output.Append((char)xchar); + output.Append((char) xchar); i += 5; continue; @@ -280,7 +318,7 @@ public static string UrlDecode(byte[] bytes, int offset, int count, Encoding e) } else if ((xchar = GetChar(bytes, i + 1, 2)) != -1) { - acc.WriteByte((byte)xchar); + acc.WriteByte((byte) xchar); i += 2; continue; @@ -299,7 +337,7 @@ public static string UrlDecode(byte[] bytes, int offset, int count, Encoding e) } else { - output.Append((char)bytes[i]); + output.Append((char) bytes[i]); } } @@ -314,7 +352,9 @@ public static string UrlDecode(byte[] bytes, int offset, int count, Encoding e) public static byte[] UrlDecodeToBytes(byte[] bytes) { if (bytes == null) + { return null; + } return UrlDecodeToBytes(bytes, 0, bytes.Length); } @@ -327,10 +367,14 @@ public static byte[] UrlDecodeToBytes(string str) public static byte[] UrlDecodeToBytes(string str, Encoding e) { if (str == null) + { return null; + } if (e == null) + { throw new ArgumentNullException("e"); + } return UrlDecodeToBytes(e.GetBytes(str)); } @@ -338,25 +382,33 @@ public static byte[] UrlDecodeToBytes(string str, Encoding e) public static byte[] UrlDecodeToBytes(byte[] bytes, int offset, int count) { if (bytes == null) + { return null; + } if (count == 0) + { return new byte[0]; + } int len = bytes.Length; if (offset < 0 || offset >= len) + { throw new ArgumentOutOfRangeException("offset"); + } if (count < 0 || offset > len - count) + { throw new ArgumentOutOfRangeException("count"); + } MemoryStream result = new MemoryStream(); int end = offset + count; for (int i = offset; i < end; i++) { - char c = (char)bytes[i]; + char c = (char) bytes[i]; if (c == '+') { @@ -368,12 +420,12 @@ public static byte[] UrlDecodeToBytes(byte[] bytes, int offset, int count) if (xchar != -1) { - c = (char)xchar; + c = (char) xchar; i += 2; } } - result.WriteByte((byte)c); + result.WriteByte((byte) c); } return result.ToArray(); @@ -384,13 +436,17 @@ public static string UrlEncode(string str) return UrlEncode(str, Encoding.UTF8); } - public static string UrlEncode(string s, Encoding Enc) + public static string UrlEncode(string s, Encoding enc) { if (s == null) + { return null; + } if (s == string.Empty) + { return string.Empty; + } bool needEncode = false; int len = s.Length; @@ -402,7 +458,9 @@ public static string UrlEncode(string s, Encoding Enc) if ((c < '0') || (c < 'A' && c > '9') || (c > 'Z' && c < 'a') || (c > 'z')) { if (HttpEncoder.NotEncoded(c)) + { continue; + } needEncode = true; break; @@ -410,11 +468,13 @@ public static string UrlEncode(string s, Encoding Enc) } if (!needEncode) + { return s; + } // avoided GetByteCount call - byte[] bytes = new byte[Enc.GetMaxByteCount(s.Length)]; - int realLen = Enc.GetBytes(s, 0, s.Length, bytes, 0); + byte[] bytes = new byte[enc.GetMaxByteCount(s.Length)]; + int realLen = enc.GetBytes(s, 0, s.Length, bytes, 0); byte[] r = UrlEncodeToBytes(bytes, 0, realLen); return Encoding.ASCII.GetString(r, 0, r.Length); @@ -423,10 +483,14 @@ public static string UrlEncode(string s, Encoding Enc) public static string UrlEncode(byte[] bytes) { if (bytes == null) + { return null; + } if (bytes.Length == 0) + { return string.Empty; + } byte[] r = UrlEncodeToBytes(bytes, 0, bytes.Length); @@ -436,10 +500,14 @@ public static string UrlEncode(byte[] bytes) public static string UrlEncode(byte[] bytes, int offset, int count) { if (bytes == null) + { return null; + } if (bytes.Length == 0) + { return string.Empty; + } byte[] r = UrlEncodeToBytes(bytes, offset, count); @@ -454,10 +522,14 @@ public static byte[] UrlEncodeToBytes(string str) public static byte[] UrlEncodeToBytes(string str, Encoding e) { if (str == null) + { return null; + } if (str.Length == 0) + { return new byte[0]; + } byte[] bytes = e.GetBytes(str); @@ -467,10 +539,14 @@ public static byte[] UrlEncodeToBytes(string str, Encoding e) public static byte[] UrlEncodeToBytes(byte[] bytes) { if (bytes == null) + { return null; + } if (bytes.Length == 0) + { return new byte[0]; + } return UrlEncodeToBytes(bytes, 0, bytes.Length); } @@ -478,19 +554,19 @@ public static byte[] UrlEncodeToBytes(byte[] bytes) public static byte[] UrlEncodeToBytes(byte[] bytes, int offset, int count) { if (bytes == null) + { return null; + } -#if NET_4_0 - return HttpEncoder.Current.UrlEncode (bytes, offset, count); -#else return HttpEncoder.UrlEncodeToBytes(bytes, offset, count); -#endif } public static string UrlEncodeUnicode(string str) { if (str == null) + { return null; + } byte[] r = UrlEncodeUnicodeToBytes(str); @@ -500,10 +576,14 @@ public static string UrlEncodeUnicode(string str) public static byte[] UrlEncodeUnicodeToBytes(string str) { if (str == null) + { return null; + } if (str.Length == 0) + { return new byte[0]; + } MemoryStream result = new MemoryStream(str.Length); @@ -522,18 +602,7 @@ public static byte[] UrlEncodeUnicodeToBytes(string str) /// The decoded text. public static string HtmlDecode(string s) { -#if NET_4_0 - if (s == null) - return null; - - using (var sw = new StringWriter ()) - { - HttpEncoder.Current.HtmlDecode (s, sw); - return sw.ToString (); - } -#else return HttpEncoder.HtmlDecode(s); -#endif } /// @@ -545,37 +614,18 @@ public static void HtmlDecode(string s, TextWriter output) { if (output == null) { -#if NET_4_0 - throw new ArgumentNullException ("output"); -#else throw new NullReferenceException(".NET emulation"); -#endif } if (!string.IsNullOrEmpty(s)) { -#if NET_4_0 - HttpEncoder.Current.HtmlDecode (s, output); -#else output.Write(HttpEncoder.HtmlDecode(s)); -#endif } } public static string HtmlEncode(string s) { -#if NET_4_0 - if (s == null) - return null; - - using (var sw = new StringWriter ()) - { - HttpEncoder.Current.HtmlEncode (s, sw); - return sw.ToString (); - } -#else return HttpEncoder.HtmlEncode(s); -#endif } /// @@ -587,128 +637,18 @@ public static void HtmlEncode(string s, TextWriter output) { if (output == null) { -#if NET_4_0 - throw new ArgumentNullException ("output"); -#else throw new NullReferenceException(".NET emulation"); -#endif } if (!string.IsNullOrEmpty(s)) { -#if NET_4_0 - HttpEncoder.Current.HtmlEncode (s, output); -#else output.Write(HttpEncoder.HtmlEncode(s)); -#endif - } - } - -#if NET_4_0 - public static string HtmlEncode (object value) - { - if (value == null) - return null; - - IHtmlString htmlString = value as IHtmlString; - - if (htmlString != null) - return htmlString.ToHtmlString (); - - return HtmlEncode (value.ToString ()); - } - - public static string JavaScriptStringEncode (string value) - { - return JavaScriptStringEncode (value, false); - } - - public static string JavaScriptStringEncode (string value, bool addDoubleQuotes) - { - if (String.IsNullOrEmpty (value)) - return addDoubleQuotes ? "\"\"" : String.Empty; - - int len = value.Length; - bool needEncode = false; - char c; - - for (int i = 0; i < len; i++) - { - c = value [i]; - - if (c >= 0 && c <= 31 || c == 34 || c == 39 || c == 60 || c == 62 || c == 92) { - needEncode = true; - break; - } } - - if (!needEncode) - return addDoubleQuotes ? "\"" + value + "\"" : value; - - var sb = new StringBuilder(); - - if (addDoubleQuotes) - sb.Append ('"'); - - for (int i = 0; i < len; i++) - { - c = value [i]; - - if (c >= 0 && c <= 7 || c == 11 || c >= 14 && c <= 31 || c == 39 || c == 60 || c == 62) - sb.AppendFormat ("\\u{0:x4}", (int)c); - else - { - switch ((int)c) - { - case 8: - sb.Append ("\\b"); - break; - - case 9: - sb.Append ("\\t"); - break; - - case 10: - sb.Append ("\\n"); - break; - - case 12: - sb.Append ("\\f"); - break; - - case 13: - sb.Append ("\\r"); - break; - - case 34: - sb.Append ("\\\""); - break; - - case 92: - sb.Append ("\\\\"); - break; - - default: - sb.Append (c); - break; - } - } - } - - if (addDoubleQuotes) - sb.Append ('"'); - - return sb.ToString (); } -#endif public static string UrlPathEncode(string s) { -#if NET_4_0 - return HttpEncoder.Current.UrlPathEncode (s); -#else return HttpEncoder.UrlPathEncode(s); -#endif } public static NameValueCollection ParseQueryString(string query) @@ -719,16 +659,24 @@ public static NameValueCollection ParseQueryString(string query) public static NameValueCollection ParseQueryString(string query, Encoding encoding) { if (query == null) + { throw new ArgumentNullException("query"); + } if (encoding == null) + { throw new ArgumentNullException("encoding"); + } if (query.Length == 0 || (query.Length == 1 && query[0] == '?')) + { return new NameValueCollection(); + } if (query[0] == '?') + { query = query.Substring(1); + } NameValueCollection result = new HttpQsCollection(); @@ -740,7 +688,9 @@ public static NameValueCollection ParseQueryString(string query, Encoding encodi internal static void ParseQueryString(string query, Encoding encoding, NameValueCollection result) { if (query.Length == 0) + { return; + } string decoded = HtmlDecode(query); int decodedLength = decoded.Length; @@ -749,7 +699,8 @@ internal static void ParseQueryString(string query, Encoding encoding, NameValue while (namePos <= decodedLength) { - int valuePos = -1, valueEnd = -1; + int valuePos = -1, + valueEnd = -1; for (int q = namePos; q < decodedLength; q++) { @@ -769,11 +720,12 @@ internal static void ParseQueryString(string query, Encoding encoding, NameValue first = false; if (decoded[namePos] == '?') + { namePos++; + } } - string name, - value; + string name; if (valuePos == -1) { @@ -795,15 +747,17 @@ internal static void ParseQueryString(string query, Encoding encoding, NameValue namePos = valueEnd + 1; } - value = UrlDecode(decoded.Substring(valuePos, valueEnd - valuePos), encoding); + string value = UrlDecode(decoded.Substring(valuePos, valueEnd - valuePos), encoding); result.Add(name, value); if (namePos == -1) + { break; + } } } - #endregion // Methods + #endregion } } diff --git a/RestSharp/Extensions/ReflectionExtensions.cs b/RestSharp/Extensions/ReflectionExtensions.cs index c7ade51d0..a872b2566 100644 --- a/RestSharp/Extensions/ReflectionExtensions.cs +++ b/RestSharp/Extensions/ReflectionExtensions.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -61,7 +63,9 @@ public static bool IsSubclassOfRawGeneric(this Type toCheck, Type generic) { while (toCheck != null && toCheck != typeof(object)) { - Type cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck; + Type cur = toCheck.IsGenericType + ? toCheck.GetGenericTypeDefinition() + : toCheck; if (generic == cur) { @@ -104,10 +108,10 @@ public static object FindEnumValue(this Type type, string value, CultureInfo cul { #if FRAMEWORK Enum ret = Enum.GetValues(type) - .Cast() - .FirstOrDefault(v => v.ToString() - .GetNameVariants(culture) - .Contains(value, StringComparer.Create(culture, true))); + .Cast() + .FirstOrDefault(v => v.ToString() + .GetNameVariants(culture) + .Contains(value, StringComparer.Create(culture, true))); if (ret == null) { @@ -115,7 +119,7 @@ public static object FindEnumValue(this Type type, string value, CultureInfo cul if (enumValueAsUnderlyingType != null && Enum.IsDefined(type, enumValueAsUnderlyingType)) { - ret = (Enum)Enum.ToObject(type, enumValueAsUnderlyingType); + ret = (Enum) Enum.ToObject(type, enumValueAsUnderlyingType); } } diff --git a/RestSharp/Extensions/ResponseExtensions.cs b/RestSharp/Extensions/ResponseExtensions.cs index ec078a12f..ed747cccb 100644 --- a/RestSharp/Extensions/ResponseExtensions.cs +++ b/RestSharp/Extensions/ResponseExtensions.cs @@ -1,26 +1,25 @@ - -namespace RestSharp.Extensions +namespace RestSharp.Extensions { public static class ResponseExtensions { public static IRestResponse ToAsyncResponse(this IRestResponse response) { return new RestResponse - { - ContentEncoding = response.ContentEncoding, - ContentLength = response.ContentLength, - ContentType = response.ContentType, - Cookies = response.Cookies, - ErrorException = response.ErrorException, - ErrorMessage = response.ErrorMessage, - Headers = response.Headers, - RawBytes = response.RawBytes, - ResponseStatus = response.ResponseStatus, - ResponseUri = response.ResponseUri, - Server = response.Server, - StatusCode = response.StatusCode, - StatusDescription = response.StatusDescription - }; + { + ContentEncoding = response.ContentEncoding, + ContentLength = response.ContentLength, + ContentType = response.ContentType, + Cookies = response.Cookies, + ErrorException = response.ErrorException, + ErrorMessage = response.ErrorMessage, + Headers = response.Headers, + RawBytes = response.RawBytes, + ResponseStatus = response.ResponseStatus, + ResponseUri = response.ResponseUri, + Server = response.Server, + StatusCode = response.StatusCode, + StatusDescription = response.StatusDescription + }; } } } diff --git a/RestSharp/Extensions/StringExtensions.cs b/RestSharp/Extensions/StringExtensions.cs index 5c273c1a4..48cbd8cbc 100644 --- a/RestSharp/Extensions/StringExtensions.cs +++ b/RestSharp/Extensions/StringExtensions.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -50,10 +52,14 @@ public static string UrlEncode(this string input) const int maxLength = 32766; if (input == null) + { throw new ArgumentNullException("input"); + } if (input.Length <= maxLength) + { return Uri.EscapeDataString(input); + } StringBuilder sb = new StringBuilder(input.Length * 2); int index = 0; @@ -104,7 +110,8 @@ public static bool HasValue(this string input) /// string public static string RemoveUnderscoresAndDashes(this string input) { - return input.Replace("_", "").Replace("-", ""); // avoiding regex + return input.Replace("_", "") + .Replace("-", ""); // avoiding regex } /// @@ -208,7 +215,9 @@ private static DateTime ExtractDate(string input, string pattern, CultureInfo cu { DateTime mod = DateTime.ParseExact(match.Groups[3].Value, "HHmm", culture); - dt = match.Groups[2].Value == "+" ? dt.Add(mod.TimeOfDay) : dt.Subtract(mod.TimeOfDay); + dt = match.Groups[2].Value == "+" + ? dt.Add(mod.TimeOfDay) + : dt.Subtract(mod.TimeOfDay); } } @@ -247,11 +256,15 @@ public static string ToPascalCase(this string lowercaseAndUnderscoredWord, Cultu public static string ToPascalCase(this string text, bool removeUnderscores, CultureInfo culture) { if (string.IsNullOrEmpty(text)) + { return text; + } text = text.Replace("_", " "); - string joinString = removeUnderscores ? string.Empty : "_"; + string joinString = removeUnderscores + ? string.Empty + : "_"; string[] words = text.Split(' '); if (words.Length > 1 || words[0].IsUpperCase()) @@ -264,7 +277,9 @@ public static string ToPascalCase(this string text, bool removeUnderscores, Cult string restOfWord = word.Substring(1); if (restOfWord.IsUpperCase()) + { restOfWord = restOfWord.ToLower(culture); + } char firstChar = char.ToUpper(word[0], culture); @@ -376,7 +391,9 @@ public static string AddSpaces(this string pascalCasedWord) public static IEnumerable GetNameVariants(this string name, CultureInfo culture) { if (string.IsNullOrEmpty(name)) + { yield break; + } yield return name; diff --git a/RestSharp/Extensions/XmlExtensions.cs b/RestSharp/Extensions/XmlExtensions.cs index a066c19d3..b515d445c 100644 --- a/RestSharp/Extensions/XmlExtensions.cs +++ b/RestSharp/Extensions/XmlExtensions.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System.Xml.Linq; @@ -34,7 +36,9 @@ public static XName AsNamespaced(this string name, string @namespace) XName xName = name; if (@namespace.HasValue()) + { xName = XName.Get(name, @namespace); + } return xName; } diff --git a/RestSharp/Http.Async.cs b/RestSharp/Http.Async.cs index 221362dba..c9577b318 100644 --- a/RestSharp/Http.Async.cs +++ b/RestSharp/Http.Async.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -42,42 +44,42 @@ public partial class Http public HttpWebRequest DeleteAsync(Action action) { - return GetStyleMethodInternalAsync("DELETE", action); + return this.GetStyleMethodInternalAsync("DELETE", action); } public HttpWebRequest GetAsync(Action action) { - return GetStyleMethodInternalAsync("GET", action); + return this.GetStyleMethodInternalAsync("GET", action); } public HttpWebRequest HeadAsync(Action action) { - return GetStyleMethodInternalAsync("HEAD", action); + return this.GetStyleMethodInternalAsync("HEAD", action); } public HttpWebRequest OptionsAsync(Action action) { - return GetStyleMethodInternalAsync("OPTIONS", action); + return this.GetStyleMethodInternalAsync("OPTIONS", action); } public HttpWebRequest PostAsync(Action action) { - return PutPostInternalAsync("POST", action); + return this.PutPostInternalAsync("POST", action); } public HttpWebRequest PutAsync(Action action) { - return PutPostInternalAsync("PUT", action); + return this.PutPostInternalAsync("PUT", action); } public HttpWebRequest PatchAsync(Action action) { - return PutPostInternalAsync("PATCH", action); + return this.PutPostInternalAsync("PATCH", action); } public HttpWebRequest MergeAsync(Action action) { - return PutPostInternalAsync("MERGE", action); + return this.PutPostInternalAsync("MERGE", action); } /// @@ -88,7 +90,7 @@ public HttpWebRequest MergeAsync(Action action) /// public HttpWebRequest AsPostAsync(Action action, string httpMethod) { - return PutPostInternalAsync(httpMethod.ToUpperInvariant(), action); + return this.PutPostInternalAsync(httpMethod.ToUpperInvariant(), action); } /// @@ -99,7 +101,7 @@ public HttpWebRequest AsPostAsync(Action action, string httpMethod /// public HttpWebRequest AsGetAsync(Action action, string httpMethod) { - return GetStyleMethodInternalAsync(httpMethod.ToUpperInvariant(), action); + return this.GetStyleMethodInternalAsync(httpMethod.ToUpperInvariant(), action); } private HttpWebRequest GetStyleMethodInternalAsync(string method, Action callback) @@ -108,27 +110,28 @@ private HttpWebRequest GetStyleMethodInternalAsync(string method, Action ResponseCallback(result, callback), webRequest); + IAsyncResult asyncResult = webRequest.BeginGetResponse( + result => this.ResponseCallback(result, callback), webRequest); - SetTimeout(asyncResult, this.timeoutState); + this.SetTimeout(asyncResult, this.timeoutState); } } catch (Exception ex) { - ExecuteCallback(CreateErrorResponse(ex), callback); + ExecuteCallback(this.CreateErrorResponse(ex), callback); } return webRequest; @@ -141,7 +144,9 @@ private HttpResponse CreateErrorResponse(Exception ex) if (webException != null && webException.Status == WebExceptionStatus.RequestCanceled) { - response.ResponseStatus = this.timeoutState.TimedOut ? ResponseStatus.TimedOut : ResponseStatus.Aborted; + response.ResponseStatus = this.timeoutState.TimedOut + ? ResponseStatus.TimedOut + : ResponseStatus.Aborted; return response; } @@ -159,13 +164,13 @@ private HttpWebRequest PutPostInternalAsync(string method, Action try { - webRequest = ConfigureAsyncWebRequest(method, Url); - PreparePostBody(webRequest); - WriteRequestBodyAsync(webRequest, callback); + webRequest = this.ConfigureAsyncWebRequest(method, this.Url); + this.PreparePostBody(webRequest); + this.WriteRequestBodyAsync(webRequest, callback); } catch (Exception ex) { - ExecuteCallback(CreateErrorResponse(ex), callback); + ExecuteCallback(this.CreateErrorResponse(ex), callback); } return webRequest; @@ -176,36 +181,39 @@ private void WriteRequestBodyAsync(HttpWebRequest webRequest, Action RequestStreamCallback(result, callback), webRequest); + asyncResult = webRequest.BeginGetRequestStream( + result => this.RequestStreamCallback(result, callback), webRequest); } else { - asyncResult = webRequest.BeginGetResponse(r => ResponseCallback(r, callback), webRequest); + asyncResult = webRequest.BeginGetResponse(r => this.ResponseCallback(r, callback), webRequest); } - SetTimeout(asyncResult, this.timeoutState); + this.SetTimeout(asyncResult, this.timeoutState); } #if !WINDOWS_PHONE private long CalculateContentLength() { - if (RequestBodyBytes != null) - return RequestBodyBytes.Length; + if (this.RequestBodyBytes != null) + { + return this.RequestBodyBytes.Length; + } - if (!HasFiles && !AlwaysMultipartFormData) + if (!this.HasFiles && !this.AlwaysMultipartFormData) { - return encoding.GetByteCount(RequestBody); + return this.encoding.GetByteCount(this.RequestBody); } // calculate length for multipart form long length = 0; - foreach (HttpFile file in Files) + foreach (HttpFile file in this.Files) { length += this.Encoding.GetByteCount(GetMultipartFileHeader(file)); length += file.ContentLength; @@ -223,7 +231,7 @@ private long CalculateContentLength() private void RequestStreamCallback(IAsyncResult result, Action callback) { - HttpWebRequest webRequest = (HttpWebRequest)result.AsyncState; + HttpWebRequest webRequest = (HttpWebRequest) result.AsyncState; if (this.timeoutState.TimedOut) { @@ -239,39 +247,39 @@ private void RequestStreamCallback(IAsyncResult result, Action cal { using (Stream requestStream = webRequest.EndGetRequestStream(result)) { - if (HasFiles || AlwaysMultipartFormData) + if (this.HasFiles || this.AlwaysMultipartFormData) { - WriteMultipartFormData(requestStream); + this.WriteMultipartFormData(requestStream); } - else if (RequestBodyBytes != null) + else if (this.RequestBodyBytes != null) { - requestStream.Write(RequestBodyBytes, 0, RequestBodyBytes.Length); + requestStream.Write(this.RequestBodyBytes, 0, this.RequestBodyBytes.Length); } - else if (RequestBody != null) + else if (this.RequestBody != null) { - WriteStringTo(requestStream, RequestBody); + this.WriteStringTo(requestStream, this.RequestBody); } } } catch (Exception ex) { - ExecuteCallback(CreateErrorResponse(ex), callback); + ExecuteCallback(this.CreateErrorResponse(ex), callback); return; } - IAsyncResult asyncResult = webRequest.BeginGetResponse(r => ResponseCallback(r, callback), webRequest); + IAsyncResult asyncResult = webRequest.BeginGetResponse(r => this.ResponseCallback(r, callback), webRequest); - SetTimeout(asyncResult, this.timeoutState); + this.SetTimeout(asyncResult, this.timeoutState); } private void SetTimeout(IAsyncResult asyncResult, TimeOutState timeOutState) { #if FRAMEWORK - if (Timeout != 0) + if (this.Timeout != 0) { ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle, - TimeoutCallback, timeOutState, Timeout, true); + TimeoutCallback, timeOutState, this.Timeout, true); } #endif } @@ -279,7 +287,9 @@ private void SetTimeout(IAsyncResult asyncResult, TimeOutState timeOutState) private static void TimeoutCallback(object state, bool timedOut) { if (!timedOut) + { return; + } TimeOutState timeoutState = state as TimeOutState; @@ -305,7 +315,7 @@ private static void GetRawResponseAsync(IAsyncResult result, Action callback GetRawResponseAsync(result, webResponse => { - ExtractResponseData(response, webResponse); + this.ExtractResponseData(response, webResponse); ExecuteCallback(response, callback); }); } catch (Exception ex) { - ExecuteCallback(CreateErrorResponse(ex), callback); + ExecuteCallback(this.CreateErrorResponse(ex), callback); } } @@ -403,15 +413,15 @@ private HttpWebRequest ConfigureAsyncWebRequest(string method, Uri url) WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp); WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp); #endif - HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); + HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(url); - webRequest.UseDefaultCredentials = UseDefaultCredentials; + webRequest.UseDefaultCredentials = this.UseDefaultCredentials; #if !WINDOWS_PHONE && !SILVERLIGHT - webRequest.PreAuthenticate = PreAuthenticate; + webRequest.PreAuthenticate = this.PreAuthenticate; #endif - AppendHeaders(webRequest); - AppendCookies(webRequest); + this.AppendHeaders(webRequest); + this.AppendCookies(webRequest); webRequest.Method = method; @@ -419,62 +429,62 @@ private HttpWebRequest ConfigureAsyncWebRequest(string method, Uri url) #if !WINDOWS_PHONE // WP7 doesn't as of Beta doesn't support a way to set this value either directly // or indirectly - if (!HasFiles && !AlwaysMultipartFormData) + if (!this.HasFiles && !this.AlwaysMultipartFormData) { webRequest.ContentLength = 0; } #endif - if (Credentials != null) + if (this.Credentials != null) { - webRequest.Credentials = Credentials; + webRequest.Credentials = this.Credentials; } #if !SILVERLIGHT - if (UserAgent.HasValue()) + if (this.UserAgent.HasValue()) { - webRequest.UserAgent = UserAgent; + webRequest.UserAgent = this.UserAgent; } #endif #if FRAMEWORK - if (ClientCertificates != null) + if (this.ClientCertificates != null) { - webRequest.ClientCertificates.AddRange(ClientCertificates); + webRequest.ClientCertificates.AddRange(this.ClientCertificates); } webRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip | DecompressionMethods.None; webRequest.ServicePoint.Expect100Continue = false; - if (Timeout != 0) + if (this.Timeout != 0) { - webRequest.Timeout = Timeout; + webRequest.Timeout = this.Timeout; } - if (ReadWriteTimeout != 0) + if (this.ReadWriteTimeout != 0) { - webRequest.ReadWriteTimeout = ReadWriteTimeout; + webRequest.ReadWriteTimeout = this.ReadWriteTimeout; } - if (Proxy != null) + if (this.Proxy != null) { - webRequest.Proxy = Proxy; + webRequest.Proxy = this.Proxy; } - if (CachePolicy != null) + if (this.CachePolicy != null) { - webRequest.CachePolicy = CachePolicy; + webRequest.CachePolicy = this.CachePolicy; } - if (FollowRedirects && MaxRedirects.HasValue) + if (this.FollowRedirects && this.MaxRedirects.HasValue) { - webRequest.MaximumAutomaticRedirections = MaxRedirects.Value; + webRequest.MaximumAutomaticRedirections = this.MaxRedirects.Value; } #endif #if !SILVERLIGHT - webRequest.AllowAutoRedirect = FollowRedirects; + webRequest.AllowAutoRedirect = this.FollowRedirects; #endif return webRequest; } diff --git a/RestSharp/Http.Sync.cs b/RestSharp/Http.Sync.cs index a78340724..24e2080ff 100644 --- a/RestSharp/Http.Sync.cs +++ b/RestSharp/Http.Sync.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion #if FRAMEWORK @@ -33,7 +35,7 @@ public partial class Http /// public HttpResponse Post() { - return PostPutInternal("POST"); + return this.PostPutInternal("POST"); } /// @@ -41,7 +43,7 @@ public HttpResponse Post() /// public HttpResponse Put() { - return PostPutInternal("PUT"); + return this.PostPutInternal("PUT"); } /// @@ -49,7 +51,7 @@ public HttpResponse Put() /// public HttpResponse Get() { - return GetStyleMethodInternal("GET"); + return this.GetStyleMethodInternal("GET"); } /// @@ -57,7 +59,7 @@ public HttpResponse Get() /// public HttpResponse Head() { - return GetStyleMethodInternal("HEAD"); + return this.GetStyleMethodInternal("HEAD"); } /// @@ -65,7 +67,7 @@ public HttpResponse Head() /// public HttpResponse Options() { - return GetStyleMethodInternal("OPTIONS"); + return this.GetStyleMethodInternal("OPTIONS"); } /// @@ -73,7 +75,7 @@ public HttpResponse Options() /// public HttpResponse Delete() { - return GetStyleMethodInternal("DELETE"); + return this.GetStyleMethodInternal("DELETE"); } /// @@ -81,7 +83,7 @@ public HttpResponse Delete() /// public HttpResponse Patch() { - return PostPutInternal("PATCH"); + return this.PostPutInternal("PATCH"); } /// @@ -89,7 +91,7 @@ public HttpResponse Patch() /// public HttpResponse Merge() { - return PostPutInternal("MERGE"); + return this.PostPutInternal("MERGE"); } /// @@ -99,7 +101,7 @@ public HttpResponse Merge() /// public HttpResponse AsGet(string httpMethod) { - return GetStyleMethodInternal(httpMethod.ToUpperInvariant()); + return this.GetStyleMethodInternal(httpMethod.ToUpperInvariant()); } /// @@ -109,41 +111,45 @@ public HttpResponse AsGet(string httpMethod) /// public HttpResponse AsPost(string httpMethod) { - return PostPutInternal(httpMethod.ToUpperInvariant()); + return this.PostPutInternal(httpMethod.ToUpperInvariant()); } private HttpResponse GetStyleMethodInternal(string method) { - HttpWebRequest webRequest = ConfigureWebRequest(method, Url); + HttpWebRequest webRequest = this.ConfigureWebRequest(method, this.Url); - if (HasBody && (method == "DELETE" || method == "OPTIONS")) + if (this.HasBody && (method == "DELETE" || method == "OPTIONS")) { - webRequest.ContentType = RequestContentType; - WriteRequestBody(webRequest); + webRequest.ContentType = this.RequestContentType; + this.WriteRequestBody(webRequest); } - return GetResponse(webRequest); + return this.GetResponse(webRequest); } private HttpResponse PostPutInternal(string method) { - HttpWebRequest webRequest = ConfigureWebRequest(method, Url); + HttpWebRequest webRequest = this.ConfigureWebRequest(method, this.Url); - PreparePostBody(webRequest); + this.PreparePostBody(webRequest); - WriteRequestBody(webRequest); - return GetResponse(webRequest); + this.WriteRequestBody(webRequest); + return this.GetResponse(webRequest); } partial void AddSyncHeaderActions() { - restrictedHeaderActions.Add("Connection", (r, v) => r.Connection = v); - restrictedHeaderActions.Add("Content-Length", (r, v) => r.ContentLength = Convert.ToInt64(v)); - restrictedHeaderActions.Add("Expect", (r, v) => r.Expect = v); - restrictedHeaderActions.Add("If-Modified-Since", (r, v) => r.IfModifiedSince = Convert.ToDateTime(v)); - restrictedHeaderActions.Add("Referer", (r, v) => r.Referer = v); - restrictedHeaderActions.Add("Transfer-Encoding", (r, v) => { r.TransferEncoding = v; r.SendChunked = true; }); - restrictedHeaderActions.Add("User-Agent", (r, v) => r.UserAgent = v); + this.restrictedHeaderActions.Add("Connection", (r, v) => r.Connection = v); + this.restrictedHeaderActions.Add("Content-Length", (r, v) => r.ContentLength = Convert.ToInt64(v)); + this.restrictedHeaderActions.Add("Expect", (r, v) => r.Expect = v); + this.restrictedHeaderActions.Add("If-Modified-Since", (r, v) => r.IfModifiedSince = Convert.ToDateTime(v)); + this.restrictedHeaderActions.Add("Referer", (r, v) => r.Referer = v); + this.restrictedHeaderActions.Add("Transfer-Encoding", (r, v) => + { + r.TransferEncoding = v; + r.SendChunked = true; + }); + this.restrictedHeaderActions.Add("User-Agent", (r, v) => r.UserAgent = v); } private void ExtractErrorResponse(HttpResponse httpResponse, Exception ex) @@ -172,11 +178,11 @@ private HttpResponse GetResponse(HttpWebRequest request) { HttpWebResponse webResponse = GetRawResponse(request); - ExtractResponseData(response, webResponse); + this.ExtractResponseData(response, webResponse); } catch (Exception ex) { - ExtractErrorResponse(response, ex); + this.ExtractErrorResponse(response, ex); } return response; @@ -186,12 +192,11 @@ private static HttpWebResponse GetRawResponse(HttpWebRequest request) { try { - return (HttpWebResponse)request.GetResponse(); + return (HttpWebResponse) request.GetResponse(); } catch (WebException ex) { - -#if MONODROID +#if MONODROID // In Android the connections might start to hang (never return // responces) after 3 sequential connection failures (i.e: exceptions) request.Abort(); @@ -214,26 +219,26 @@ private static HttpWebResponse GetRawResponse(HttpWebRequest request) private void WriteRequestBody(HttpWebRequest webRequest) { - if (HasBody || HasFiles || AlwaysMultipartFormData) + if (this.HasBody || this.HasFiles || this.AlwaysMultipartFormData) { #if !WINDOWS_PHONE - webRequest.ContentLength = CalculateContentLength(); + webRequest.ContentLength = this.CalculateContentLength(); #endif } using (Stream requestStream = webRequest.GetRequestStream()) { - if (HasFiles || AlwaysMultipartFormData) + if (this.HasFiles || this.AlwaysMultipartFormData) { - WriteMultipartFormData(requestStream); + this.WriteMultipartFormData(requestStream); } - else if (RequestBodyBytes != null) + else if (this.RequestBodyBytes != null) { - requestStream.Write(RequestBodyBytes, 0, RequestBodyBytes.Length); + requestStream.Write(this.RequestBodyBytes, 0, this.RequestBodyBytes.Length); } - else if (RequestBody != null) + else if (this.RequestBody != null) { - WriteStringTo(requestStream, RequestBody); + this.WriteStringTo(requestStream, this.RequestBody); } } } @@ -242,19 +247,19 @@ private void WriteRequestBody(HttpWebRequest webRequest) // TODO: duplication at the moment). private HttpWebRequest ConfigureWebRequest(string method, Uri url) { - HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); + HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(url); - webRequest.UseDefaultCredentials = UseDefaultCredentials; - webRequest.PreAuthenticate = PreAuthenticate; + webRequest.UseDefaultCredentials = this.UseDefaultCredentials; + webRequest.PreAuthenticate = this.PreAuthenticate; webRequest.ServicePoint.Expect100Continue = false; - AppendHeaders(webRequest); - AppendCookies(webRequest); + this.AppendHeaders(webRequest); + this.AppendCookies(webRequest); webRequest.Method = method; // make sure Content-Length header is always sent since default is -1 - if (!HasFiles && !AlwaysMultipartFormData) + if (!this.HasFiles && !this.AlwaysMultipartFormData) { webRequest.ContentLength = 0; } @@ -262,49 +267,49 @@ private HttpWebRequest ConfigureWebRequest(string method, Uri url) webRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip | DecompressionMethods.None; #if FRAMEWORK - if (ClientCertificates != null) + if (this.ClientCertificates != null) { - webRequest.ClientCertificates.AddRange(ClientCertificates); + webRequest.ClientCertificates.AddRange(this.ClientCertificates); } #endif - if (UserAgent.HasValue()) + if (this.UserAgent.HasValue()) { - webRequest.UserAgent = UserAgent; + webRequest.UserAgent = this.UserAgent; } - if (Timeout != 0) + if (this.Timeout != 0) { - webRequest.Timeout = Timeout; + webRequest.Timeout = this.Timeout; } - if (ReadWriteTimeout != 0) + if (this.ReadWriteTimeout != 0) { - webRequest.ReadWriteTimeout = ReadWriteTimeout; + webRequest.ReadWriteTimeout = this.ReadWriteTimeout; } - if (Credentials != null) + if (this.Credentials != null) { - webRequest.Credentials = Credentials; + webRequest.Credentials = this.Credentials; } - if (Proxy != null) + if (this.Proxy != null) { - webRequest.Proxy = Proxy; + webRequest.Proxy = this.Proxy; } #if FRAMEWORK - if (CachePolicy != null) + if (this.CachePolicy != null) { - webRequest.CachePolicy = CachePolicy; + webRequest.CachePolicy = this.CachePolicy; } #endif - webRequest.AllowAutoRedirect = FollowRedirects; + webRequest.AllowAutoRedirect = this.FollowRedirects; - if (FollowRedirects && MaxRedirects.HasValue) + if (this.FollowRedirects && this.MaxRedirects.HasValue) { - webRequest.MaximumAutomaticRedirections = MaxRedirects.Value; + webRequest.MaximumAutomaticRedirections = this.MaxRedirects.Value; } return webRequest; diff --git a/RestSharp/Http.cs b/RestSharp/Http.cs index ff6a064ec..30f138c0b 100644 --- a/RestSharp/Http.cs +++ b/RestSharp/Http.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -29,6 +31,7 @@ #if FRAMEWORK using System.Net.Cache; using System.Security.Cryptography.X509Certificates; +using System.Text.RegularExpressions; #endif namespace RestSharp @@ -54,7 +57,7 @@ public IHttp Create() /// protected bool HasParameters { - get { return Parameters.Any(); } + get { return this.Parameters.Any(); } } /// @@ -62,7 +65,7 @@ protected bool HasParameters /// protected bool HasCookies { - get { return Cookies.Any(); } + get { return this.Cookies.Any(); } } /// @@ -70,7 +73,7 @@ protected bool HasCookies /// protected bool HasBody { - get { return RequestBodyBytes != null || !string.IsNullOrEmpty(RequestBody); } + get { return this.RequestBodyBytes != null || !string.IsNullOrEmpty(this.RequestBody); } } /// @@ -78,7 +81,7 @@ protected bool HasBody /// protected bool HasFiles { - get { return Files.Any(); } + get { return this.Files.Any(); } } /// @@ -148,7 +151,11 @@ protected bool HasFiles private Encoding encoding = Encoding.UTF8; - public Encoding Encoding { get { return this.encoding; } set { this.encoding = value; } } + public Encoding Encoding + { + get { return this.encoding; } + set { this.encoding = value; } + } /// /// HTTP headers to be sent with request @@ -211,8 +218,8 @@ public Http() this.Files = new List(); this.Parameters = new List(); this.Cookies = new List(); - - restrictedHeaderActions = new Dictionary>(StringComparer.OrdinalIgnoreCase); + this.restrictedHeaderActions = new Dictionary>( + StringComparer.OrdinalIgnoreCase); this.AddSharedHeaderActions(); this.AddSyncHeaderActions(); @@ -226,8 +233,8 @@ public Http() private void AddSharedHeaderActions() { - restrictedHeaderActions.Add("Accept", (r, v) => r.Accept = v); - restrictedHeaderActions.Add("Content-Type", (r, v) => r.ContentType = v); + this.restrictedHeaderActions.Add("Accept", (r, v) => r.Accept = v); + this.restrictedHeaderActions.Add("Content-Type", (r, v) => r.ContentType = v); #if NET4 restrictedHeaderActions.Add("Date", (r, v) => { @@ -241,12 +248,12 @@ private void AddSharedHeaderActions() restrictedHeaderActions.Add("Host", (r, v) => r.Host = v); #else - restrictedHeaderActions.Add("Date", (r, v) => { /* Set by system */ }); - restrictedHeaderActions.Add("Host", (r, v) => { /* Set by system */ }); + this.restrictedHeaderActions.Add("Date", (r, v) => { /* Set by system */ }); + this.restrictedHeaderActions.Add("Host", (r, v) => { /* Set by system */ }); #endif #if FRAMEWORK - restrictedHeaderActions.Add("Range", AddRange); + this.restrictedHeaderActions.Add("Range", AddRange); #endif } @@ -266,7 +273,7 @@ private static string GetMultipartFileHeader(HttpFile file) private string GetMultipartFormData(HttpParameter param) { - string format = param.Name == RequestContentType + string format = param.Name == this.RequestContentType ? "--{0}{3}Content-Type: {4}{3}Content-Disposition: form-data; name=\"{1}\"{3}{3}{2}{3}" : "--{0}{3}Content-Disposition: form-data; name=\"{1}\"{3}{3}{2}{3}"; @@ -284,11 +291,11 @@ private static string GetMultipartFooter() // http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.headers.aspx private void AppendHeaders(HttpWebRequest webRequest) { - foreach (HttpHeader header in Headers) + foreach (HttpHeader header in this.Headers) { - if (restrictedHeaderActions.ContainsKey(header.Name)) + if (this.restrictedHeaderActions.ContainsKey(header.Name)) { - restrictedHeaderActions[header.Name].Invoke(webRequest, header.Value); + this.restrictedHeaderActions[header.Name].Invoke(webRequest, header.Value); } else { @@ -305,15 +312,15 @@ private void AppendCookies(HttpWebRequest webRequest) { webRequest.CookieContainer = this.CookieContainer ?? new CookieContainer(); - foreach (HttpCookie httpCookie in Cookies) + foreach (HttpCookie httpCookie in this.Cookies) { #if FRAMEWORK Cookie cookie = new Cookie - { - Name = httpCookie.Name, - Value = httpCookie.Value, - Domain = webRequest.RequestUri.Host - }; + { + Name = httpCookie.Name, + Value = httpCookie.Value, + Domain = webRequest.RequestUri.Host + }; webRequest.CookieContainer.Add(cookie); #else @@ -333,10 +340,12 @@ private string EncodeParameters() { StringBuilder querystring = new StringBuilder(); - foreach (HttpParameter p in Parameters) + foreach (HttpParameter p in this.Parameters) { if (querystring.Length > 1) + { querystring.Append("&"); + } querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), p.Value.UrlEncode()); } @@ -346,18 +355,18 @@ private string EncodeParameters() private void PreparePostBody(HttpWebRequest webRequest) { - if (HasFiles || AlwaysMultipartFormData) + if (this.HasFiles || this.AlwaysMultipartFormData) { webRequest.ContentType = GetMultipartFormContentType(); } - else if (HasParameters) + else if (this.HasParameters) { webRequest.ContentType = "application/x-www-form-urlencoded"; - RequestBody = EncodeParameters(); + this.RequestBody = this.EncodeParameters(); } - else if (HasBody) + else if (this.HasBody) { - webRequest.ContentType = RequestContentType; + webRequest.ContentType = this.RequestContentType; } } @@ -370,22 +379,22 @@ private void WriteStringTo(Stream stream, string toWrite) private void WriteMultipartFormData(Stream requestStream) { - foreach (HttpParameter param in Parameters) + foreach (HttpParameter param in this.Parameters) { - WriteStringTo(requestStream, GetMultipartFormData(param)); + this.WriteStringTo(requestStream, this.GetMultipartFormData(param)); } - foreach (HttpFile file in Files) + foreach (HttpFile file in this.Files) { // Add just the first part of this param, since we will write the file data directly to the Stream - WriteStringTo(requestStream, GetMultipartFileHeader(file)); + this.WriteStringTo(requestStream, GetMultipartFileHeader(file)); // Write the file data directly to the Stream, rather than serializing it to a string. file.Writer(requestStream); - WriteStringTo(requestStream, LINE_BREAK); + this.WriteStringTo(requestStream, LINE_BREAK); } - WriteStringTo(requestStream, GetMultipartFooter()); + this.WriteStringTo(requestStream, GetMultipartFooter()); } private void ExtractResponseData(HttpResponse response, HttpWebResponse webResponse) @@ -413,7 +422,7 @@ private void ExtractResponseData(HttpResponse response, HttpWebResponse webRespo ProcessResponseStream(webResponseStream, response); } #else - ProcessResponseStream(webResponseStream, response); + this.ProcessResponseStream(webResponseStream, response); #endif response.StatusCode = webResponse.StatusCode; @@ -449,7 +458,11 @@ private void ExtractResponseData(HttpResponse response, HttpWebResponse webRespo { string headerValue = webResponse.Headers[headerName]; - response.Headers.Add(new HttpHeader { Name = headerName, Value = headerValue }); + response.Headers.Add(new HttpHeader + { + Name = headerName, + Value = headerValue + }); } webResponse.Close(); @@ -458,20 +471,20 @@ private void ExtractResponseData(HttpResponse response, HttpWebResponse webRespo private void ProcessResponseStream(Stream webResponseStream, HttpResponse response) { - if (ResponseWriter == null) + if (this.ResponseWriter == null) { response.RawBytes = webResponseStream.ReadAsBytes(); } else { - ResponseWriter(webResponseStream); + this.ResponseWriter(webResponseStream); } } #if FRAMEWORK private static void AddRange(HttpWebRequest r, string range) { - System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(range, "(\\w+)=(\\d+)-(\\d+)$"); + Match m = Regex.Match(range, "(\\w+)=(\\d+)-(\\d+)$"); if (!m.Success) { diff --git a/RestSharp/HttpHeader.cs b/RestSharp/HttpHeader.cs index 6ad0786e2..6544aea32 100644 --- a/RestSharp/HttpHeader.cs +++ b/RestSharp/HttpHeader.cs @@ -1,5 +1,4 @@ - -namespace RestSharp +namespace RestSharp { /// /// Representation of an HTTP header diff --git a/RestSharp/HttpParameter.cs b/RestSharp/HttpParameter.cs index c65c268a7..735073411 100644 --- a/RestSharp/HttpParameter.cs +++ b/RestSharp/HttpParameter.cs @@ -1,5 +1,4 @@ - -namespace RestSharp +namespace RestSharp { /// /// Representation of an HTTP parameter (QueryString or Form value) diff --git a/RestSharp/HttpResponse.cs b/RestSharp/HttpResponse.cs index cac055cc5..bce4e376e 100644 --- a/RestSharp/HttpResponse.cs +++ b/RestSharp/HttpResponse.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -34,8 +36,8 @@ public class HttpResponse : IHttpResponse public HttpResponse() { this.ResponseStatus = ResponseStatus.None; - Headers = new List(); - Cookies = new List(); + this.Headers = new List(); + this.Cookies = new List(); } /// @@ -58,7 +60,7 @@ public HttpResponse() /// public string Content { - get { return this.content ?? (this.content = RawBytes.AsString()); } + get { return this.content ?? (this.content = this.RawBytes.AsString()); } } /// diff --git a/RestSharp/IHttp.cs b/RestSharp/IHttp.cs index f0b3a170d..75e967585 100644 --- a/RestSharp/IHttp.cs +++ b/RestSharp/IHttp.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; diff --git a/RestSharp/IHttpFactory.cs b/RestSharp/IHttpFactory.cs index 3c6f97788..b49a64967 100644 --- a/RestSharp/IHttpFactory.cs +++ b/RestSharp/IHttpFactory.cs @@ -6,7 +6,8 @@ public interface IHttpFactory IHttp Create(); } - public class SimpleFactory : IHttpFactory where T : IHttp, new() + public class SimpleFactory : IHttpFactory + where T : IHttp, new() { public IHttp Create() { diff --git a/RestSharp/IRestClient.cs b/RestSharp/IRestClient.cs index c4efa26dc..1b200e506 100644 --- a/RestSharp/IRestClient.cs +++ b/RestSharp/IRestClient.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -90,7 +92,8 @@ public interface IRestClient /// Request to be executed /// Callback function to be executed upon completion providing access to the async handle. /// The HTTP method to execute - RestRequestAsyncHandle ExecuteAsyncGet(IRestRequest request, Action callback, string httpMethod); + RestRequestAsyncHandle ExecuteAsyncGet(IRestRequest request, Action callback, string httpMethod); /// /// Executes a POST-style request and callback asynchronously, authenticating if needed @@ -98,7 +101,8 @@ public interface IRestClient /// Request to be executed /// Callback function to be executed upon completion providing access to the async handle. /// The HTTP method to execute - RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action callback, string httpMethod); + RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action callback, string httpMethod); /// /// Executes a GET-style request and callback asynchronously, authenticating if needed @@ -107,7 +111,8 @@ public interface IRestClient /// Request to be executed /// Callback function to be executed upon completion /// The HTTP method to execute - RestRequestAsyncHandle ExecuteAsyncGet(IRestRequest request, Action, RestRequestAsyncHandle> callback, string httpMethod); + RestRequestAsyncHandle ExecuteAsyncGet(IRestRequest request, Action, + RestRequestAsyncHandle> callback, string httpMethod); /// /// Executes a GET-style request and callback asynchronously, authenticating if needed @@ -116,7 +121,8 @@ public interface IRestClient /// Request to be executed /// Callback function to be executed upon completion /// The HTTP method to execute - RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action, RestRequestAsyncHandle> callback, string httpMethod); + RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action, + RestRequestAsyncHandle> callback, string httpMethod); void AddHandler(string contentType, IDeserializer deserializer); diff --git a/RestSharp/IRestRequest.cs b/RestSharp/IRestRequest.cs index 7d79444af..2d0b0c88d 100644 --- a/RestSharp/IRestRequest.cs +++ b/RestSharp/IRestRequest.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; diff --git a/RestSharp/Parameter.cs b/RestSharp/Parameter.cs index 0a0f82422..9e7c932ad 100644 --- a/RestSharp/Parameter.cs +++ b/RestSharp/Parameter.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion namespace RestSharp @@ -47,7 +49,7 @@ public class Parameter /// String public override string ToString() { - return string.Format("{0}={1}", Name, Value); + return string.Format("{0}={1}", this.Name, this.Value); } } } diff --git a/RestSharp/Properties/AssemblyInfo.cs b/RestSharp/Properties/AssemblyInfo.cs index ca865fde0..89c28dc18 100644 --- a/RestSharp/Properties/AssemblyInfo.cs +++ b/RestSharp/Properties/AssemblyInfo.cs @@ -5,20 +5,24 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyTitle("RestSharp")] // 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. + [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM + [assembly: Guid("d2b12a34-b748-47f9-8ad6-f84da992c64b")] #if SIGNED [assembly: InternalsVisibleTo("RestSharp.IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100fda57af14a288d46e3efea89617037585c4de57159cd536ca6dff792ea1d6addc665f2fccb4285413d9d44db5a1be87cb82686db200d16325ed9c42c89cd4824d8cc447f7cee2ac000924c3bceeb1b7fcb5cc1a3901785964d48ce14172001084134f4dcd9973c3776713b595443b1064bb53e2eeb924969244d354e46495e9d"), InternalsVisibleTo("RestSharp.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100fda57af14a288d46e3efea89617037585c4de57159cd536ca6dff792ea1d6addc665f2fccb4285413d9d44db5a1be87cb82686db200d16325ed9c42c89cd4824d8cc447f7cee2ac000924c3bceeb1b7fcb5cc1a3901785964d48ce14172001084134f4dcd9973c3776713b595443b1064bb53e2eeb924969244d354e46495e9d")] #else + [assembly: InternalsVisibleTo("RestSharp.IntegrationTests"), InternalsVisibleTo("RestSharp.Tests")] #endif diff --git a/RestSharp/RestClient.Async.cs b/RestSharp/RestClient.Async.cs index e235ab870..911ff1969 100644 --- a/RestSharp/RestClient.Async.cs +++ b/RestSharp/RestClient.Async.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -84,7 +86,7 @@ private RestRequestAsyncHandle ExecuteAsync(IRestRequest request, this.ConfigureHttp(request, http); RestRequestAsyncHandle asyncHandle = new RestRequestAsyncHandle(); - Action responseCb = r => this.ProcessResponse(request, r, asyncHandle, callback); + Action responseCb = r => ProcessResponse(request, r, asyncHandle, callback); if (this.UseSynchronizationContext && SynchronizationContext.Current != null) { @@ -109,8 +111,8 @@ private static HttpWebRequest DoAsPostAsync(IHttp http, Action res return http.AsPostAsync(responseCb, method); } - private void ProcessResponse(IRestRequest request, HttpResponse httpResponse, RestRequestAsyncHandle asyncHandle, - Action callback) + private static void ProcessResponse(IRestRequest request, HttpResponse httpResponse, + RestRequestAsyncHandle asyncHandle, Action callback) { RestResponse restResponse = ConvertToRestResponse(request, httpResponse); callback(restResponse, asyncHandle); @@ -157,9 +159,8 @@ public virtual RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, (response, asyncHandle) => this.DeserializeResponse(request, callback, response, asyncHandle), httpMethod); } - private void DeserializeResponse(IRestRequest request, - Action, RestRequestAsyncHandle> callback, IRestResponse response, - RestRequestAsyncHandle asyncHandle) + private void DeserializeResponse(IRestRequest request, Action, + RestRequestAsyncHandle> callback, IRestResponse response, RestRequestAsyncHandle asyncHandle) { IRestResponse restResponse; diff --git a/RestSharp/RestClient.Sync.cs b/RestSharp/RestClient.Sync.cs index a81ecded5..dedaca6e6 100644 --- a/RestSharp/RestClient.Sync.cs +++ b/RestSharp/RestClient.Sync.cs @@ -13,7 +13,7 @@ public partial class RestClient /// Response data public byte[] DownloadData(IRestRequest request) { - IRestResponse response = Execute(request); + IRestResponse response = this.Execute(request); return response.RawBytes; } @@ -25,7 +25,7 @@ public byte[] DownloadData(IRestRequest request) /// RestResponse public virtual IRestResponse Execute(IRestRequest request) { - string method = Enum.GetName(typeof (Method), request.Method); + string method = Enum.GetName(typeof(Method), request.Method); switch (request.Method) { @@ -33,42 +33,41 @@ public virtual IRestResponse Execute(IRestRequest request) case Method.PUT: case Method.PATCH: case Method.MERGE: - return Execute(request, method, DoExecuteAsPost); + return this.Execute(request, method, DoExecuteAsPost); default: - return Execute(request, method, DoExecuteAsGet); + return this.Execute(request, method, DoExecuteAsGet); } } public IRestResponse ExecuteAsGet(IRestRequest request, string httpMethod) { - return Execute(request, httpMethod, DoExecuteAsGet); + return this.Execute(request, httpMethod, DoExecuteAsGet); } public IRestResponse ExecuteAsPost(IRestRequest request, string httpMethod) { request.Method = Method.POST; // Required by RestClient.BuildUri... - return Execute(request, httpMethod, DoExecuteAsPost); + return this.Execute(request, httpMethod, DoExecuteAsPost); } private IRestResponse Execute(IRestRequest request, string httpMethod, Func getResponse) { - AuthenticateIfNeeded(this, request); + this.AuthenticateIfNeeded(this, request); IRestResponse response = new RestResponse(); try { - IHttp http = HttpFactory.Create(); + IHttp http = this.HttpFactory.Create(); - ConfigureHttp(request, http); + this.ConfigureHttp(request, http); response = ConvertToRestResponse(request, getResponse(http, httpMethod)); response.Request = request; response.Request.IncreaseNumAttempts(); - } catch (Exception ex) { @@ -98,17 +97,17 @@ private static HttpResponse DoExecuteAsPost(IHttp http, string method) /// RestResponse[[T]] with deserialized data in Data property public virtual IRestResponse Execute(IRestRequest request) where T : new() { - return Deserialize(request, Execute(request)); + return this.Deserialize(request, this.Execute(request)); } public IRestResponse ExecuteAsGet(IRestRequest request, string httpMethod) where T : new() { - return Deserialize(request, ExecuteAsGet(request, httpMethod)); + return this.Deserialize(request, this.ExecuteAsGet(request, httpMethod)); } public IRestResponse ExecuteAsPost(IRestRequest request, string httpMethod) where T : new() { - return Deserialize(request, ExecuteAsPost(request, httpMethod)); + return this.Deserialize(request, this.ExecuteAsPost(request, httpMethod)); } } } diff --git a/RestSharp/RestClient.cs b/RestSharp/RestClient.cs index d7f6c2e0c..7b33c730e 100644 --- a/RestSharp/RestClient.cs +++ b/RestSharp/RestClient.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -157,7 +159,9 @@ public RestClient(Uri baseUrl) : this() public RestClient(string baseUrl) : this() { if (string.IsNullOrEmpty(baseUrl)) + { throw new ArgumentNullException("baseUrl"); + } this.BaseUrl = new Uri(baseUrl); } @@ -181,11 +185,11 @@ public void AddHandler(string contentType, IDeserializer deserializer) { this.ContentHandlers[contentType] = deserializer; - if (contentType != "*" && !structuredSyntaxSuffixWildcardRegex.IsMatch(contentType)) + if (contentType != "*" && !this.structuredSyntaxSuffixWildcardRegex.IsMatch(contentType)) { this.AcceptTypes.Add(contentType); // add Accept header based on registered deserializers - string accepts = string.Join(", ", AcceptTypes.ToArray()); + string accepts = string.Join(", ", this.AcceptTypes.ToArray()); this.RemoveDefaultParameter("Accept"); this.AddDefaultParameter("Accept", accepts, ParameterType.HttpHeader); @@ -221,49 +225,61 @@ public void ClearHandlers() private IDeserializer GetHandler(string contentType) { if (contentType == null) + { throw new ArgumentNullException("contentType"); + } if (string.IsNullOrEmpty(contentType) && this.ContentHandlers.ContainsKey("*")) { - return ContentHandlers["*"]; + return this.ContentHandlers["*"]; } int semicolonIndex = contentType.IndexOf(';'); if (semicolonIndex > -1) + { contentType = contentType.Substring(0, semicolonIndex); + } if (this.ContentHandlers.ContainsKey(contentType)) + { return this.ContentHandlers[contentType]; + } // https://tools.ietf.org/html/rfc6839#page-4 - Match structuredSyntaxSuffixMatch = structuredSyntaxSuffixRegex.Match(contentType); + Match structuredSyntaxSuffixMatch = this.structuredSyntaxSuffixRegex.Match(contentType); if (structuredSyntaxSuffixMatch.Success) { string structuredSyntaxSuffixWildcard = "*" + structuredSyntaxSuffixMatch.Value; if (this.ContentHandlers.ContainsKey(structuredSyntaxSuffixWildcard)) + { return this.ContentHandlers[structuredSyntaxSuffixWildcard]; + } } if (this.ContentHandlers.ContainsKey("*")) + { return this.ContentHandlers["*"]; + } return null; } #if SILVERLIGHT private readonly Regex structuredSyntaxSuffixRegex = new Regex(@"\+\w+$"); + private readonly Regex structuredSyntaxSuffixWildcardRegex = new Regex(@"^\*\+\w+$"); #else private readonly Regex structuredSyntaxSuffixRegex = new Regex(@"\+\w+$", RegexOptions.Compiled); + private readonly Regex structuredSyntaxSuffixWildcardRegex = new Regex(@"^\*\+\w+$", RegexOptions.Compiled); #endif private void AuthenticateIfNeeded(RestClient client, IRestRequest request) { - if (Authenticator != null) + if (this.Authenticator != null) { this.Authenticator.Authenticate(client, request); } @@ -277,7 +293,9 @@ private void AuthenticateIfNeeded(RestClient client, IRestRequest request) public Uri BuildUri(IRestRequest request) { if (this.BaseUrl == null) + { throw new NullReferenceException("RestClient must contain a value for BaseUrl"); + } string assembled = request.Resource; IEnumerable urlParms = request.Parameters.Where(p => p.Type == ParameterType.UrlSegment); @@ -293,7 +311,9 @@ public Uri BuildUri(IRestRequest request) } if (!string.IsNullOrEmpty(assembled)) + { assembled = assembled.Replace("{" + p.Name + "}", p.Value.ToString().UrlEncode()); + } builder.Path = builder.Path.UrlDecode().Replace("{" + p.Name + "}", p.Value.ToString().UrlEncode()); } @@ -308,7 +328,9 @@ public Uri BuildUri(IRestRequest request) if (this.BaseUrl != null && !string.IsNullOrEmpty(this.BaseUrl.AbsoluteUri)) { if (!this.BaseUrl.AbsoluteUri.EndsWith("/") && !string.IsNullOrEmpty(assembled)) + { assembled = string.Concat("/", assembled); + } assembled = string.IsNullOrEmpty(assembled) ? this.BaseUrl.AbsoluteUri @@ -319,20 +341,28 @@ public Uri BuildUri(IRestRequest request) if (request.Method != Method.POST && request.Method != Method.PUT && request.Method != Method.PATCH) { - parameters = request.Parameters.Where( - p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString).ToList(); + parameters = request.Parameters + .Where(p => p.Type == ParameterType.GetOrPost || + p.Type == ParameterType.QueryString) + .ToList(); } else { - parameters = request.Parameters.Where(p => p.Type == ParameterType.QueryString).ToList(); + parameters = request.Parameters + .Where(p => p.Type == ParameterType.QueryString) + .ToList(); } if (!parameters.Any()) + { return new Uri(assembled); + } // build and attach querystring string data = EncodeParameters(parameters); - string separator = assembled != null && assembled.Contains("?") ? "&" : "?"; + string separator = assembled != null && assembled.Contains("?") + ? "&" + : "?"; assembled = string.Concat(assembled, separator, data); @@ -341,7 +371,8 @@ public Uri BuildUri(IRestRequest request) private static string EncodeParameters(IEnumerable parameters) { - return string.Join("&", parameters.Select(EncodeParameter).ToArray()); + return string.Join("&", parameters.Select(EncodeParameter) + .ToArray()); } private static string EncodeParameter(Parameter parameter) @@ -357,10 +388,10 @@ private void ConfigureHttp(IRestRequest request, IHttp http) http.AlwaysMultipartFormData = request.AlwaysMultipartFormData; http.UseDefaultCredentials = request.UseDefaultCredentials; http.ResponseWriter = request.ResponseWriter; - http.CookieContainer = CookieContainer; + http.CookieContainer = this.CookieContainer; // move RestClient.DefaultParameters into Request.Parameters - foreach (Parameter p in DefaultParameters) + foreach (Parameter p in this.DefaultParameters) { if (request.Parameters.Any(p2 => p2.Name == p.Name && p2.Type == p.Type)) { @@ -373,26 +404,32 @@ private void ConfigureHttp(IRestRequest request, IHttp http) // Add Accept header based on registered deserializers if none has been set by the caller. if (request.Parameters.All(p2 => p2.Name.ToLowerInvariant() != "accept")) { - string accepts = string.Join(", ", AcceptTypes.ToArray()); + string accepts = string.Join(", ", this.AcceptTypes.ToArray()); request.AddParameter("Accept", accepts, ParameterType.HttpHeader); } - http.Url = BuildUri(request); + http.Url = this.BuildUri(request); http.PreAuthenticate = this.PreAuthenticate; - string userAgent = UserAgent ?? http.UserAgent; + string userAgent = this.UserAgent ?? http.UserAgent; - http.UserAgent = userAgent.HasValue() ? userAgent : "RestSharp/" + version; + http.UserAgent = userAgent.HasValue() + ? userAgent + : "RestSharp/" + version; - int timeout = request.Timeout > 0 ? request.Timeout : Timeout; + int timeout = request.Timeout > 0 + ? request.Timeout + : this.Timeout; if (timeout > 0) { http.Timeout = timeout; } - int readWriteTimeout = request.ReadWriteTimeout > 0 ? request.ReadWriteTimeout : ReadWriteTimeout; + int readWriteTimeout = request.ReadWriteTimeout > 0 + ? request.ReadWriteTimeout + : this.ReadWriteTimeout; if (readWriteTimeout > 0) { @@ -400,17 +437,17 @@ private void ConfigureHttp(IRestRequest request, IHttp http) } #if !SILVERLIGHT - http.FollowRedirects = FollowRedirects; + http.FollowRedirects = this.FollowRedirects; #endif #if FRAMEWORK - if (ClientCertificates != null) + if (this.ClientCertificates != null) { http.ClientCertificates = this.ClientCertificates; } - http.MaxRedirects = MaxRedirects; - http.CachePolicy = CachePolicy; + http.MaxRedirects = this.MaxRedirects; + http.CachePolicy = this.CachePolicy; #endif if (request.Credentials != null) @@ -482,9 +519,13 @@ private void ConfigureHttp(IRestRequest request, IHttp http) object val = body.Value; if (val is byte[]) - http.RequestBodyBytes = (byte[])val; + { + http.RequestBodyBytes = (byte[]) val; + } else + { http.RequestBody = Convert.ToString(body.Value); + } } else { @@ -504,9 +545,9 @@ private void ConfigureHttp(IRestRequest request, IHttp http) #if FRAMEWORK private void ConfigureProxy(IHttp http) { - if (Proxy != null) + if (this.Proxy != null) { - http.Proxy = Proxy; + http.Proxy = this.Proxy; } } #endif diff --git a/RestSharp/RestClientExtensions.cs b/RestSharp/RestClientExtensions.cs index 047f38718..99cafea4b 100644 --- a/RestSharp/RestClientExtensions.cs +++ b/RestSharp/RestClientExtensions.cs @@ -149,8 +149,8 @@ public static RestRequestAsyncHandle DeleteAsync(this IRestClient client, IRestR #if NET4 public static RestResponse ExecuteDynamic(this IRestClient client, IRestRequest request) { - var response = client.Execute(request); - var generic = (RestResponse)response; + IRestResponse response = client.Execute(request); + RestResponse generic = (RestResponse)response; dynamic content = SimpleJson.DeserializeObject(response.Content); generic.Data = content; @@ -350,7 +350,12 @@ public static void RemoveDefaultParameter(this IRestClient restClient, string na /// This request public static void AddDefaultParameter(this IRestClient restClient, string name, object value) { - restClient.AddDefaultParameter(new Parameter { Name = name, Value = value, Type = ParameterType.GetOrPost }); + restClient.AddDefaultParameter(new Parameter + { + Name = name, + Value = value, + Type = ParameterType.GetOrPost + }); } /// @@ -368,7 +373,12 @@ public static void AddDefaultParameter(this IRestClient restClient, string name, public static void AddDefaultParameter(this IRestClient restClient, string name, object value, ParameterType type) { - restClient.AddDefaultParameter(new Parameter { Name = name, Value = value, Type = type }); + restClient.AddDefaultParameter(new Parameter + { + Name = name, + Value = value, + Type = type + }); } /// diff --git a/RestSharp/RestRequest.cs b/RestSharp/RestRequest.cs index ec47bb870..f7cc6b2b7 100644 --- a/RestSharp/RestRequest.cs +++ b/RestSharp/RestRequest.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -115,7 +117,9 @@ public RestRequest(Uri resource) : this(resource, Method.GET) { } /// Resource to use for this request /// Method to use for this request public RestRequest(Uri resource, Method method) - : this(resource.IsAbsoluteUri ? resource.AbsolutePath + resource.Query : resource.OriginalString, method) + : this(resource.IsAbsoluteUri + ? resource.AbsolutePath + resource.Query + : resource.OriginalString, method) { //resource.PathAndQuery not supported by Silverlight :( } @@ -133,7 +137,7 @@ public IRestRequest AddFile(string name, string path, string contentType = null) FileInfo f = new FileInfo(path); long fileLength = f.Length; - return AddFile(new FileParameter + return this.AddFile(new FileParameter { Name = name, FileName = Path.GetFileName(path), @@ -145,7 +149,7 @@ public IRestRequest AddFile(string name, string path, string contentType = null) file.BaseStream.CopyTo(s); } }, - ContentType = contentType + ContentType = contentType }); } @@ -172,13 +176,13 @@ public IRestRequest AddFile(string name, byte[] bytes, string fileName, string c /// This request public IRestRequest AddFile(string name, Action writer, string fileName, string contentType = null) { - return AddFile(new FileParameter - { - Name = name, - Writer = writer, - FileName = fileName, - ContentType = contentType - }); + return this.AddFile(new FileParameter + { + Name = name, + Writer = writer, + FileName = fileName, + ContentType = contentType + }); } private IRestRequest AddFile(FileParameter file) @@ -200,20 +204,20 @@ public IRestRequest AddFileBytes(string name, byte[] bytes, string filename, str { long length = bytes.Length; - return AddFile(new FileParameter - { - Name = name, - FileName = filename, - ContentLength = length, - ContentType = contentType, - Writer = s => - { - using (StreamReader file = new StreamReader(new MemoryStream(bytes))) - { - file.BaseStream.CopyTo(s); - } - } - }); + return this.AddFile(new FileParameter + { + Name = name, + FileName = filename, + ContentLength = length, + ContentType = contentType, + Writer = s => + { + using (StreamReader file = new StreamReader(new MemoryStream(bytes))) + { + file.BaseStream.CopyTo(s); + } + } + }); } /// @@ -228,17 +232,17 @@ public IRestRequest AddBody(object obj, string xmlNamespace) string serialized; string contentType; - switch (RequestFormat) + switch (this.RequestFormat) { case DataFormat.Json: - serialized = JsonSerializer.Serialize(obj); - contentType = JsonSerializer.ContentType; + serialized = this.JsonSerializer.Serialize(obj); + contentType = this.JsonSerializer.ContentType; break; case DataFormat.Xml: this.XmlSerializer.Namespace = xmlNamespace; - serialized = XmlSerializer.Serialize(obj); - contentType = XmlSerializer.ContentType; + serialized = this.XmlSerializer.Serialize(obj); + contentType = this.XmlSerializer.ContentType; break; default: @@ -323,33 +327,36 @@ public IRestRequest AddObject(object obj, params string[] includedProperties) (includedProperties.Length > 0 && includedProperties.Contains(prop.Name)); if (!isAllowed) + { continue; + } Type propType = prop.PropertyType; object val = prop.GetValue(obj, null); if (val == null) + { continue; + } if (propType.IsArray) { Type elementType = propType.GetElementType(); - if (((Array)val).Length > 0 && + if (((Array) val).Length > 0 && elementType != null && - (elementType.IsPrimitive|| elementType.IsValueType || elementType == typeof(string))) + (elementType.IsPrimitive || elementType.IsValueType || elementType == typeof(string))) { // convert the array to an array of strings - string[] values = (from object item in ((Array)val) - select item.ToString()) - .ToArray(); + string[] values = (from object item in ((Array) val) + select item.ToString()).ToArray(); val = string.Join(",", values); } else { // try to cast it - val = string.Join(",", (string[])val); + val = string.Join(",", (string[]) val); } } diff --git a/RestSharp/RestRequestAsyncHandle.cs b/RestSharp/RestRequestAsyncHandle.cs index 0066c4f2f..666e8bea2 100644 --- a/RestSharp/RestRequestAsyncHandle.cs +++ b/RestSharp/RestRequestAsyncHandle.cs @@ -6,19 +6,19 @@ public class RestRequestAsyncHandle { public HttpWebRequest WebRequest; - public RestRequestAsyncHandle() - { - } + public RestRequestAsyncHandle() { } public RestRequestAsyncHandle(HttpWebRequest webRequest) { - WebRequest = webRequest; + this.WebRequest = webRequest; } public void Abort() { - if (WebRequest != null) - WebRequest.Abort(); + if (this.WebRequest != null) + { + this.WebRequest.Abort(); + } } } } diff --git a/RestSharp/RestResponse.cs b/RestSharp/RestResponse.cs index e756591f1..8c5c57907 100644 --- a/RestSharp/RestResponse.cs +++ b/RestSharp/RestResponse.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -34,8 +36,8 @@ public abstract class RestResponseBase protected RestResponseBase() { this.ResponseStatus = ResponseStatus.None; - Headers = new List(); - Cookies = new List(); + this.Headers = new List(); + this.Cookies = new List(); } /// diff --git a/RestSharp/Serializers/DotNetXmlSerializer.cs b/RestSharp/Serializers/DotNetXmlSerializer.cs index d09351faa..cd962cce2 100644 --- a/RestSharp/Serializers/DotNetXmlSerializer.cs +++ b/RestSharp/Serializers/DotNetXmlSerializer.cs @@ -14,8 +14,8 @@ public class DotNetXmlSerializer : ISerializer /// public DotNetXmlSerializer() { - ContentType = "application/xml"; - Encoding = Encoding.UTF8; + this.ContentType = "application/xml"; + this.Encoding = Encoding.UTF8; } /// @@ -25,7 +25,7 @@ public DotNetXmlSerializer() public DotNetXmlSerializer(string @namespace) : this() { - Namespace = @namespace; + this.Namespace = @namespace; } /// @@ -37,10 +37,10 @@ public string Serialize(object obj) { XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); - ns.Add(string.Empty, Namespace); + ns.Add(string.Empty, this.Namespace); System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType()); - EncodingStringWriter writer = new EncodingStringWriter(Encoding); + EncodingStringWriter writer = new EncodingStringWriter(this.Encoding); serializer.Serialize(writer, obj, ns); @@ -86,7 +86,7 @@ public EncodingStringWriter(Encoding encoding) public override Encoding Encoding { - get { return encoding; } + get { return this.encoding; } } } } diff --git a/RestSharp/Serializers/ISerializer.cs b/RestSharp/Serializers/ISerializer.cs index 084a66e92..db1c4b052 100644 --- a/RestSharp/Serializers/ISerializer.cs +++ b/RestSharp/Serializers/ISerializer.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion namespace RestSharp.Serializers diff --git a/RestSharp/Serializers/JsonSerializer.cs b/RestSharp/Serializers/JsonSerializer.cs index eeadd5450..a3a45b374 100644 --- a/RestSharp/Serializers/JsonSerializer.cs +++ b/RestSharp/Serializers/JsonSerializer.cs @@ -12,7 +12,7 @@ public class JsonSerializer : ISerializer /// public JsonSerializer() { - ContentType = "application/json"; + this.ContentType = "application/json"; } /// diff --git a/RestSharp/Serializers/SerializeAsAttribute.cs b/RestSharp/Serializers/SerializeAsAttribute.cs index 6a0ced7d1..028ba5f90 100644 --- a/RestSharp/Serializers/SerializeAsAttribute.cs +++ b/RestSharp/Serializers/SerializeAsAttribute.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -30,9 +32,9 @@ public sealed class SerializeAsAttribute : Attribute { public SerializeAsAttribute() { - NameStyle = NameStyle.AsIs; - Index = int.MaxValue; - Culture = CultureInfo.InvariantCulture; + this.NameStyle = NameStyle.AsIs; + this.Index = int.MaxValue; + this.Culture = CultureInfo.InvariantCulture; } /// @@ -69,13 +71,13 @@ public string TransformName(string input) { string name = this.Name ?? input; - switch (NameStyle) + switch (this.NameStyle) { case NameStyle.CamelCase: - return name.ToCamelCase(Culture); + return name.ToCamelCase(this.Culture); case NameStyle.PascalCase: - return name.ToPascalCase(Culture); + return name.ToPascalCase(this.Culture); case NameStyle.LowerCase: return name.ToLower(); diff --git a/RestSharp/Serializers/XmlSerializer.cs b/RestSharp/Serializers/XmlSerializer.cs index 16e0decce..46357cb9e 100644 --- a/RestSharp/Serializers/XmlSerializer.cs +++ b/RestSharp/Serializers/XmlSerializer.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -35,7 +37,7 @@ public class XmlSerializer : ISerializer /// public XmlSerializer() { - ContentType = "text/xml"; + this.ContentType = "text/xml"; } /// @@ -44,8 +46,8 @@ public XmlSerializer() /// XML namespace public XmlSerializer(string @namespace) { - Namespace = @namespace; - ContentType = "text/xml"; + this.Namespace = @namespace; + this.ContentType = "text/xml"; } /// @@ -65,13 +67,13 @@ public string Serialize(object obj) name = options.TransformName(options.Name ?? name); } - XElement root = new XElement(name.AsNamespaced(Namespace)); + XElement root = new XElement(name.AsNamespaced(this.Namespace)); if (obj is IList) { string itemTypeName = ""; - foreach (object item in (IList)obj) + foreach (object item in (IList) obj) { Type type = item.GetType(); SerializeAsAttribute opts = type.GetAttribute(); @@ -86,18 +88,20 @@ public string Serialize(object obj) itemTypeName = type.Name; } - XElement instance = new XElement(itemTypeName.AsNamespaced(Namespace)); + XElement instance = new XElement(itemTypeName.AsNamespaced(this.Namespace)); - Map(instance, item); + this.Map(instance, item); root.Add(instance); } } else - Map(root, obj); + { + this.Map(root, obj); + } - if (RootElement.HasValue()) + if (this.RootElement.HasValue()) { - XElement wrapper = new XElement(RootElement.AsNamespaced(Namespace), root); + XElement wrapper = new XElement(this.RootElement.AsNamespaced(this.Namespace), root); doc.Add(wrapper); } else @@ -112,10 +116,12 @@ private void Map(XContainer root, object obj) { Type objType = obj.GetType(); IEnumerable props = from p in objType.GetProperties() - let indexAttribute = p.GetAttribute() - where p.CanRead && p.CanWrite - orderby indexAttribute == null ? int.MaxValue : indexAttribute.Index - select p; + let indexAttribute = p.GetAttribute() + where p.CanRead && p.CanWrite + orderby indexAttribute == null + ? int.MaxValue + : indexAttribute.Index + select p; SerializeAsAttribute globalOptions = objType.GetAttribute(); foreach (PropertyInfo prop in props) @@ -128,14 +134,16 @@ where p.CanRead && p.CanWrite continue; } - string value = GetSerializedValue(rawValue); + string value = this.GetSerializedValue(rawValue); Type propType = prop.PropertyType; bool useAttribute = false; SerializeAsAttribute settings = prop.GetAttribute(); if (settings != null) { - name = settings.Name.HasValue() ? settings.Name : name; + name = settings.Name.HasValue() + ? settings.Name + : name; useAttribute = settings.Attribute; } @@ -150,7 +158,7 @@ where p.CanRead && p.CanWrite name = globalOptions.TransformName(name); } - XName nsName = name.AsNamespaced(Namespace); + XName nsName = name.AsNamespaced(this.Namespace); XElement element = new XElement(nsName); if (propType.IsPrimitive || propType.IsValueType || propType == typeof(string)) @@ -167,7 +175,7 @@ where p.CanRead && p.CanWrite { string itemTypeName = ""; - foreach (object item in (IList)rawValue) + foreach (object item in (IList) rawValue) { if (itemTypeName == "") { @@ -179,15 +187,15 @@ where p.CanRead && p.CanWrite : type.Name; } - XElement instance = new XElement(itemTypeName.AsNamespaced(Namespace)); + XElement instance = new XElement(itemTypeName.AsNamespaced(this.Namespace)); - Map(instance, item); + this.Map(instance, item); element.Add(instance); } } else { - Map(element, rawValue); + this.Map(element, rawValue); } root.Add(element); @@ -198,14 +206,14 @@ private string GetSerializedValue(object obj) { object output = obj; - if (obj is DateTime && DateFormat.HasValue()) + if (obj is DateTime && this.DateFormat.HasValue()) { - output = ((DateTime)obj).ToString(DateFormat, CultureInfo.InvariantCulture); + output = ((DateTime) obj).ToString(this.DateFormat, CultureInfo.InvariantCulture); } if (obj is bool) { - output = ((bool)obj).ToString(CultureInfo.InvariantCulture).ToLower(); + output = ((bool) obj).ToString(CultureInfo.InvariantCulture).ToLower(); } if (IsNumeric(obj)) @@ -216,67 +224,102 @@ private string GetSerializedValue(object obj) return output.ToString(); } - static string SerializeNumber(object number) + private static string SerializeNumber(object number) { if (number is long) - return ((long)number).ToString(CultureInfo.InvariantCulture); + { + return ((long) number).ToString(CultureInfo.InvariantCulture); + } if (number is ulong) - return ((ulong)number).ToString(CultureInfo.InvariantCulture); + { + return ((ulong) number).ToString(CultureInfo.InvariantCulture); + } if (number is int) - return ((int)number).ToString(CultureInfo.InvariantCulture); + { + return ((int) number).ToString(CultureInfo.InvariantCulture); + } if (number is uint) - return ((uint)number).ToString(CultureInfo.InvariantCulture); + { + return ((uint) number).ToString(CultureInfo.InvariantCulture); + } if (number is decimal) - return ((decimal)number).ToString(CultureInfo.InvariantCulture); + { + return ((decimal) number).ToString(CultureInfo.InvariantCulture); + } if (number is float) - return ((float)number).ToString(CultureInfo.InvariantCulture); + { + return ((float) number).ToString(CultureInfo.InvariantCulture); + } - return (Convert.ToDouble(number, CultureInfo.InvariantCulture).ToString("r", CultureInfo.InvariantCulture)); + return (Convert.ToDouble(number, CultureInfo.InvariantCulture) + .ToString("r", CultureInfo.InvariantCulture)); } /// /// Determines if a given object is numeric in any way /// (can be integer, double, null, etc). /// - static bool IsNumeric(object value) + private static bool IsNumeric(object value) { if (value is sbyte) + { return true; + } if (value is byte) + { return true; + } if (value is short) + { return true; + } if (value is ushort) + { return true; + } if (value is int) + { return true; + } if (value is uint) + { return true; + } if (value is long) + { return true; + } if (value is ulong) + { return true; + } if (value is float) + { return true; + } if (value is double) + { return true; + } if (value is decimal) + { return true; + } return false; } diff --git a/RestSharp/SharedAssemblyInfo.cs b/RestSharp/SharedAssemblyInfo.cs index b064dc2ae..8f1faecc1 100644 --- a/RestSharp/SharedAssemblyInfo.cs +++ b/RestSharp/SharedAssemblyInfo.cs @@ -1,9 +1,11 @@ using System; using System.Reflection; +using RestSharp; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyDescription("Simple REST and HTTP API Client")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("John Sheehan, RestSharp Community")] @@ -22,22 +24,27 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] + [assembly: AssemblyVersion(SharedAssemblyInfo.VERSION + ".0")] #if SIGNED [assembly: AssemblyInformationalVersion(SharedAssemblyInfo.FILE_VERSION)] [assembly: AssemblyFileVersion(SharedAssemblyInfo.FILE_VERSION + ".0")] #else + [assembly: AssemblyInformationalVersion(SharedAssemblyInfo.VERSION)] [assembly: AssemblyFileVersion(SharedAssemblyInfo.VERSION + ".0")] #endif -class SharedAssemblyInfo +namespace RestSharp { + internal class SharedAssemblyInfo + { #if SIGNED - public const string VERSION = "100.0.0"; - public const string FILE_VERSION = "105.1.0"; + public const string VERSION = "100.0.0"; + public const string FILE_VERSION = "105.1.0"; #else - public const string VERSION = "105.1.0"; + public const string VERSION = "105.1.0"; #endif + } } diff --git a/RestSharp/Validation/Require.cs b/RestSharp/Validation/Require.cs index af5bacfed..077f792ca 100644 --- a/RestSharp/Validation/Require.cs +++ b/RestSharp/Validation/Require.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; diff --git a/RestSharp/Validation/Validate.cs b/RestSharp/Validation/Validate.cs index 908831bc2..d6ee14ae7 100644 --- a/RestSharp/Validation/Validate.cs +++ b/RestSharp/Validation/Validate.cs @@ -1,4 +1,5 @@ #region License + // Copyright 2010 John Sheehan // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + #endregion using System; @@ -45,7 +47,9 @@ public static void IsBetween(int value, int min, int max) public static void IsValidLength(string value, int maxSize) { if (value == null) + { return; + } if (value.Length > maxSize) { diff --git a/RestSharp/packages.config b/RestSharp/packages.config index e25ef8502..9ef0f3e1c 100644 --- a/RestSharp/packages.config +++ b/RestSharp/packages.config @@ -1,4 +1,5 @@  + - + \ No newline at end of file From 7974f068c336e47e4965291af24e497962e9f5f5 Mon Sep 17 00:00:00 2001 From: Michael Hallett Date: Sat, 15 Aug 2015 23:44:41 -0700 Subject: [PATCH 7/9] added new data file for tests --- .../SampleData/deserialize_as_list.xml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 RestSharp.Tests/SampleData/deserialize_as_list.xml diff --git a/RestSharp.Tests/SampleData/deserialize_as_list.xml b/RestSharp.Tests/SampleData/deserialize_as_list.xml new file mode 100644 index 000000000..3509f55fb --- /dev/null +++ b/RestSharp.Tests/SampleData/deserialize_as_list.xml @@ -0,0 +1,17 @@ + + + + + 1 + Jackson + oddball + + + + + 1 + Jackson + evenball + + + \ No newline at end of file From d0a0c7cb8db98440c986d914a08400893adb6f89 Mon Sep 17 00:00:00 2001 From: Michael Hallett Date: Sat, 15 Aug 2015 23:49:40 -0700 Subject: [PATCH 8/9] added this prefix to the compression library (missed before) and cleared warn as error on build in windows phone project --- .nuget/RestSharp.Build.dll | Bin 7680 -> 7168 bytes .nuget/Signed/RestSharp.Build.dll | Bin 8192 -> 7680 bytes RestSharp/Compression/ZLib/Crc32.cs | 64 ++++----- RestSharp/Compression/ZLib/GZipStream.cs | 84 ++++++------ RestSharp/Compression/ZLib/InfTree.cs | 6 +- RestSharp/Compression/ZLib/Inflate.cs | 60 ++++---- RestSharp/Compression/ZLib/ZLib.cs | 4 +- RestSharp/Compression/ZLib/ZLibCodec.cs | 8 +- RestSharp/Compression/ZLib/ZLibStream.cs | 167 +++++++++++------------ Tools/NuGet.exe | Bin 1664512 -> 1686528 bytes 10 files changed, 196 insertions(+), 197 deletions(-) diff --git a/.nuget/RestSharp.Build.dll b/.nuget/RestSharp.Build.dll index ed9b656c54ca3e10b7ca29273469a78ff337ae85..9cb109f6f282196df950040f8de235e7a8dc9202 100644 GIT binary patch delta 1396 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 T&pPR$j?b&;v*rKIk`ehom9sjh delta 1891 zcmZWqdu&rx82_DfUwy5v?b>c@H`{Kou3bk1V-JUc!C<0jz&St+ghvSAz>X@01V^Xx z5F&=<@&^JcVbLIn5gN=Q32w$963Ku-!b1s?2x5q`7!2bv{mxxsW8UO`_xygp?|$d| zzH`pKZR6S|Y<({@>a(6EWUedVK`XNYxkRV~WO-%#zH(kWxBcQs``NL;EJ05Is-^az z%Qhdd5#Ch+`1LwZnf@{>u~c}73ecUaZ)Q=JuYb)-SfPHIh1}VdMAP*Q-5d&*76TQ! zo7bk^EL+;K$^PLNhxYfBUf%KT6VqNOZFOTXVcUVZj@yl+gw`M;A_&;0S-zCBHI z4sE~p<&uwQ?tjga-~C%pUB$V+vGTOTUDGG7&mZ4$v1ZhtGZv(rt~djg4hA^*8V<;o zDAY)ZORWM#9@nLzx&Xs;d8jVHFkKm{6G#nrp!N?YAi%Hy+E879NIB05+XvPyGKGg7 zfQ6bYwNgPcB7iF{VUN*wIKabZat%Al$&KrjXPh2lP8qHG>|PJt=6(Dxf8tN3-)VsjA3U zC3^B8O-*@3&mE+x)C{c-)R0_3VzQM?!cXxM1)}ZCq{^%qKOojQNV$1LS3Y-5lxH~ zvBhTjzfQ$P6D5!79C2E2+WaE1gqyTPSePe;7Z=TrTD2UpC^0j%M5&;m8Z8w|IG!e< z_S3tkXoY-Xn$+S+M1`07!7@)jr_^nxm;;mR0aTdfvrIO`gw=$0PqDN_9-8iSrCiNG^hdf+W7PCI|8gKopEGJb{ zlVt7cYIXx|RYbF^tu&6S>scK{TW6p~^`>wdx9}0mW6k6gWINTvtP}^-qbz`TAyZLn z@H{W4-d>~e>!_!36sKuC1~ z@{-le!fYPf%syv7=qD{J*&%(rb)~D3x~W!+nH z%a*Q#{pr~*Gm|Ba+4TiEK9i=&cIPtA^>=dSgiV_4TxBnixNKq0pfIIM0M52e3Ju$~ zkZh-io$Ji)HkmcKz+VWi``ihxG5vjaJofNsN2eBk26WPYtCRj#FE-XUu4}$KtL)5! z7drAM@93>the CRC32 calculation public int GetCrc32(Stream input) { - return GetCrc32AndCopy(input, null); + return this.GetCrc32AndCopy(input, null); } /// @@ -132,26 +132,26 @@ public int GetCrc32AndCopy(Stream input, Stream output) byte[] buffer = new byte[BUFFER_SIZE]; const int readSize = BUFFER_SIZE; - TotalBytesRead = 0; + this.TotalBytesRead = 0; int count = input.Read(buffer, 0, readSize); if (output != null) output.Write(buffer, 0, count); - TotalBytesRead += count; + this.TotalBytesRead += count; while (count > 0) { - SlurpBlock(buffer, 0, count); + this.SlurpBlock(buffer, 0, count); count = input.Read(buffer, 0, readSize); if (output != null) output.Write(buffer, 0, count); - TotalBytesRead += count; + this.TotalBytesRead += count; } - return (int) (~runningCrc32Result); + return (int) (~this.runningCrc32Result); } } @@ -164,7 +164,7 @@ public int GetCrc32AndCopy(Stream input, Stream output) /// The CRC-ized result. public int ComputeCrc32(int w, byte b) { - return InternalComputeCrc32((uint) w, b); + return this.InternalComputeCrc32((uint) w, b); } internal int InternalComputeCrc32(uint w, byte b) @@ -188,10 +188,10 @@ public void SlurpBlock(byte[] block, int offset, int count) { int x = offset + i; - runningCrc32Result = ((runningCrc32Result) >> 8) ^ crc32Table[(block[x]) ^ ((runningCrc32Result) & 0x000000FF)]; + this.runningCrc32Result = ((this.runningCrc32Result) >> 8) ^ crc32Table[(block[x]) ^ ((this.runningCrc32Result) & 0x000000FF)]; } - TotalBytesRead += count; + this.TotalBytesRead += count; } } @@ -282,10 +282,10 @@ public CrcCalculatorStream(Stream stream, long length, bool leaveOpen) // value. private CrcCalculatorStream(bool leaveOpen, long length, Stream stream) { - innerStream = stream; - crc32 = new Crc32(); - lengthLimit = length; - LeaveOpen = leaveOpen; + this.innerStream = stream; + this.crc32 = new Crc32(); + this.lengthLimit = length; + this.LeaveOpen = leaveOpen; } /// @@ -296,12 +296,12 @@ private CrcCalculatorStream(bool leaveOpen, long length, Stream stream) /// This is either the total number of bytes read, or the total number of bytes /// written, depending on the direction of this stream. /// - public long TotalBytesSlurped { get { return crc32.TotalBytesRead; } } + public long TotalBytesSlurped { get { return this.crc32.TotalBytesRead; } } /// /// Provides the current CRC for all blocks slurped in. /// - public int Crc { get { return crc32.Crc32Result; } } + public int Crc { get { return this.crc32.Crc32Result; } } /// /// Indicates whether the underlying stream will be left open when the @@ -328,21 +328,21 @@ public override int Read(byte[] buffer, int offset, int count) // calling ReadToEnd() on it, We can "over-read" the zip data and get a // corrupt string. The length limits that, prevents that problem. - if (lengthLimit != UNSET_LENGTH_LIMIT) + if (this.lengthLimit != UNSET_LENGTH_LIMIT) { - if (crc32.TotalBytesRead >= lengthLimit) + if (this.crc32.TotalBytesRead >= this.lengthLimit) return 0; // EOF - long bytesRemaining = lengthLimit - crc32.TotalBytesRead; + long bytesRemaining = this.lengthLimit - this.crc32.TotalBytesRead; if (bytesRemaining < count) bytesToRead = (int) bytesRemaining; } - int n = innerStream.Read(buffer, offset, bytesToRead); + int n = this.innerStream.Read(buffer, offset, bytesToRead); if (n > 0) - crc32.SlurpBlock(buffer, offset, n); + this.crc32.SlurpBlock(buffer, offset, n); return n; } @@ -356,9 +356,9 @@ public override int Read(byte[] buffer, int offset, int count) public override void Write(byte[] buffer, int offset, int count) { if (count > 0) - crc32.SlurpBlock(buffer, offset, count); + this.crc32.SlurpBlock(buffer, offset, count); - innerStream.Write(buffer, offset, count); + this.innerStream.Write(buffer, offset, count); } /// @@ -366,7 +366,7 @@ public override void Write(byte[] buffer, int offset, int count) /// public override bool CanRead { - get { return innerStream.CanRead; } + get { return this.innerStream.CanRead; } } /// @@ -374,7 +374,7 @@ public override bool CanRead /// public override bool CanSeek { - get { return innerStream.CanSeek; } + get { return this.innerStream.CanSeek; } } /// @@ -382,7 +382,7 @@ public override bool CanSeek /// public override bool CanWrite { - get { return innerStream.CanWrite; } + get { return this.innerStream.CanWrite; } } /// @@ -390,7 +390,7 @@ public override bool CanWrite /// public override void Flush() { - innerStream.Flush(); + this.innerStream.Flush(); } /// @@ -398,7 +398,7 @@ public override void Flush() /// public override long Length { - get { return lengthLimit == UNSET_LENGTH_LIMIT ? innerStream.Length : lengthLimit; } + get { return this.lengthLimit == UNSET_LENGTH_LIMIT ? this.innerStream.Length : this.lengthLimit; } } /// @@ -406,7 +406,7 @@ public override long Length /// public override long Position { - get { return crc32.TotalBytesRead; } + get { return this.crc32.TotalBytesRead; } set { throw new NotImplementedException(); } } @@ -432,7 +432,7 @@ public override void SetLength(long value) void IDisposable.Dispose() { - Close(); + this.Close(); } /// @@ -442,8 +442,8 @@ public override void Close() { base.Close(); - if (!LeaveOpen) - innerStream.Close(); + if (!this.LeaveOpen) + this.innerStream.Close(); } } } diff --git a/RestSharp/Compression/ZLib/GZipStream.cs b/RestSharp/Compression/ZLib/GZipStream.cs index ecdd9bbe4..29f718660 100644 --- a/RestSharp/Compression/ZLib/GZipStream.cs +++ b/RestSharp/Compression/ZLib/GZipStream.cs @@ -132,13 +132,13 @@ internal class GZipStream : Stream /// public string Comment { - get { return comment; } + get { return this.comment; } set { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("GZipStream"); - comment = value; + this.comment = value; } } @@ -161,29 +161,29 @@ public string Comment /// public string FileName { - get { return fileName; } + get { return this.fileName; } set { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("GZipStream"); - fileName = value; + this.fileName = value; - if (fileName == null) + if (this.fileName == null) return; - if (fileName.IndexOf("/") != -1) + if (this.fileName.IndexOf("/") != -1) { - fileName = fileName.Replace("/", "\\"); + this.fileName = this.fileName.Replace("/", "\\"); } - if (fileName.EndsWith("\\")) + if (this.fileName.EndsWith("\\")) throw new Exception("Illegal filename"); - if (fileName.IndexOf("\\") != -1) + if (this.fileName.IndexOf("\\") != -1) { // trim any leading path - fileName = Path.GetFileName(fileName); + this.fileName = Path.GetFileName(this.fileName); } } } @@ -196,7 +196,7 @@ public string FileName /// When compressing data, you can set this before the first call to Write(). When /// decompressing, you can retrieve this value any time after the first call to /// Read(). - public DateTime? LastModified; + //public DateTime? LastModified; /// /// The CRC on the GZIP stream. @@ -274,7 +274,7 @@ public string FileName /// A tuning knob to trade speed for effectiveness. public GZipStream(Stream stream) { - BaseStream = new ZlibBaseStream(stream, ZlibStreamFlavor.Gzip, false); + this.BaseStream = new ZlibBaseStream(stream, ZlibStreamFlavor.Gzip, false); } #region Zlib properties @@ -284,13 +284,13 @@ public GZipStream(Stream stream) /// virtual public FlushType FlushMode { - get { return (BaseStream.FlushMode); } + get { return (this.BaseStream.FlushMode); } set { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("GZipStream"); - BaseStream.FlushMode = value; + this.BaseStream.FlushMode = value; } } @@ -312,32 +312,32 @@ virtual public FlushType FlushMode /// public int BufferSize { - get { return BaseStream.BufferSize; } + get { return this.BaseStream.BufferSize; } set { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("GZipStream"); - if (BaseStream.workingBuffer != null) + if (this.BaseStream.workingBuffer != null) throw new ZlibException("The working buffer is already set."); if (value < ZlibConstants.WORKING_BUFFER_SIZE_MIN) throw new ZlibException(string.Format("Don't be silly. {0} bytes?? Use a bigger buffer.", value)); - BaseStream.BufferSize = value; + this.BaseStream.BufferSize = value; } } /// Returns the total number of bytes input so far. virtual public long TotalIn { - get { return BaseStream.z.TotalBytesIn; } + get { return this.BaseStream.z.TotalBytesIn; } } /// Returns the total number of bytes output so far. virtual public long TotalOut { - get { return BaseStream.z.TotalBytesOut; } + get { return this.BaseStream.z.TotalBytesOut; } } #endregion @@ -355,15 +355,15 @@ protected override void Dispose(bool disposing) { try { - if (!disposed) + if (!this.disposed) { - if (disposing && (BaseStream != null)) + if (disposing && (this.BaseStream != null)) { - BaseStream.Close(); - Crc32 = BaseStream.Crc32; + this.BaseStream.Close(); + this.Crc32 = this.BaseStream.Crc32; } - disposed = true; + this.disposed = true; } } finally @@ -382,10 +382,10 @@ public override bool CanRead { get { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("GZipStream"); - return BaseStream.Stream.CanRead; + return this.BaseStream.Stream.CanRead; } } @@ -410,10 +410,10 @@ public override bool CanWrite { get { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("GZipStream"); - return BaseStream.Stream.CanWrite; + return this.BaseStream.Stream.CanWrite; } } @@ -422,10 +422,10 @@ public override bool CanWrite /// public override void Flush() { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("GZipStream"); - BaseStream.Flush(); + this.BaseStream.Flush(); } /// @@ -449,8 +449,8 @@ public override long Position { get { - if (BaseStream.streamMode == ZlibBaseStream.StreamMode.Reader) - return BaseStream.z.TotalBytesIn + BaseStream.GzipHeaderByteCount; + if (this.BaseStream.streamMode == ZlibBaseStream.StreamMode.Reader) + return this.BaseStream.z.TotalBytesIn + this.BaseStream.GzipHeaderByteCount; return 0; } @@ -488,19 +488,19 @@ public override long Position /// the number of bytes actually read public override int Read(byte[] buffer, int offset, int count) { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("GZipStream"); - int n = BaseStream.Read(buffer, offset, count); + int n = this.BaseStream.Read(buffer, offset, count); // Console.WriteLine("GZipStream::Read(buffer, off({0}), c({1}) = {2}", offset, count, n); // Console.WriteLine( Util.FormatByteArray(buffer, offset, n) ); - if (!firstReadDone) + if (!this.firstReadDone) { - firstReadDone = true; - FileName = BaseStream.GzipFileName; - Comment = BaseStream.GzipComment; + this.firstReadDone = true; + this.FileName = this.BaseStream.GzipFileName; + this.Comment = this.BaseStream.GzipComment; } return n; diff --git a/RestSharp/Compression/ZLib/InfTree.cs b/RestSharp/Compression/ZLib/InfTree.cs index cf841f4e0..30c9aed5e 100644 --- a/RestSharp/Compression/ZLib/InfTree.cs +++ b/RestSharp/Compression/ZLib/InfTree.cs @@ -440,7 +440,7 @@ internal int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZlibCodec this.InitWorkArea(19); this.Hn[0] = 0; - result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, this.Hn, this.V); + result = this.huft_build(c, 0, 19, 19, null, null, tb, bb, hp, this.Hn, this.V); if (result == Z_DATA_ERROR) { @@ -462,7 +462,7 @@ internal int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, // build literal/length tree this.InitWorkArea(288); this.Hn[0] = 0; - result = huft_build(c, 0, nl, 257, Cplens, Cplext, tl, bl, hp, this.Hn, this.V); + result = this.huft_build(c, 0, nl, 257, Cplens, Cplext, tl, bl, hp, this.Hn, this.V); if (result != Z_OK || bl[0] == 0) { @@ -481,7 +481,7 @@ internal int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, // build distance tree this.InitWorkArea(288); - result = huft_build(c, nl, nd, 0, Cpdist, Cpdext, td, bd, hp, this.Hn, this.V); + result = this.huft_build(c, nl, nd, 0, Cpdist, Cpdext, td, bd, hp, this.Hn, this.V); if (result != Z_OK || (bd[0] == 0 && nl > 257)) { diff --git a/RestSharp/Compression/ZLib/Inflate.cs b/RestSharp/Compression/ZLib/Inflate.cs index da00e8233..a8286f101 100644 --- a/RestSharp/Compression/ZLib/Inflate.cs +++ b/RestSharp/Compression/ZLib/Inflate.cs @@ -144,7 +144,7 @@ internal InflateBlocks(ZlibCodec codec, object checkfn, int w) this.End = w; this.Checkfn = checkfn; this.Mode = TYPE; - Reset(null); + this.Reset(null); } internal void Reset(long[] c) @@ -206,7 +206,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } n--; @@ -258,7 +258,7 @@ internal int Process(int r) this.Codec.TotalBytesIn += p - this.Codec.NextIn; this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } break; @@ -277,7 +277,7 @@ internal int Process(int r) this.Codec.TotalBytesIn += p - this.Codec.NextIn; this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } n--; @@ -296,7 +296,7 @@ internal int Process(int r) this.Codec.TotalBytesIn += p - this.Codec.NextIn; this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } this.Left = (b & 0xffff); @@ -313,7 +313,7 @@ internal int Process(int r) this.Codec.TotalBytesIn += p - this.Codec.NextIn; this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } if (m == 0) @@ -327,7 +327,7 @@ internal int Process(int r) if (m == 0) { this.Write = q; - r = Flush(r); + r = this.Flush(r); q = this.Write; m = q < this.Read ? this.Read - q - 1 : this.End - q; @@ -346,7 +346,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } } } @@ -388,7 +388,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } n--; @@ -410,7 +410,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); @@ -454,7 +454,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } n--; @@ -494,7 +494,7 @@ internal int Process(int r) this.Codec.TotalBytesIn += p - this.Codec.NextIn; this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } this.Index = 0; @@ -531,7 +531,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } n--; @@ -574,7 +574,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } n--; @@ -604,7 +604,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } c = c == 16 ? this.Blens[i - 1] : 0; @@ -645,7 +645,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } this.Codes.Init(bl[0], bd[0], this.Hufts, tl[0], this.Hufts, td[0]); @@ -664,7 +664,7 @@ internal int Process(int r) this.Write = q; if ((r = this.Codes.Process(this, r)) != ZlibConstants.Z_STREAM_END) - return Flush(r); + return this.Flush(r); r = ZlibConstants.Z_OK; p = this.Codec.NextIn; @@ -685,7 +685,7 @@ internal int Process(int r) case DRY: this.Write = q; - r = Flush(r); + r = this.Flush(r); q = this.Write; //m = q < this.Read ? this.Read - q - 1 : this.End - q; @@ -699,7 +699,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } this.Mode = DONE; @@ -715,7 +715,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); case BAD: r = ZlibConstants.Z_DATA_ERROR; @@ -726,7 +726,7 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); default: r = ZlibConstants.Z_STREAM_ERROR; @@ -737,14 +737,14 @@ internal int Process(int r) this.Codec.NextIn = p; this.Write = q; - return Flush(r); + return this.Flush(r); } } } internal void Free() { - Reset(null); + this.Reset(null); this.Window = null; this.Hufts = null; //ZFREE(z, s); @@ -949,7 +949,7 @@ internal int Process(InflateBlocks blocks, int r) z.TotalBytesIn += p - z.NextIn; z.NextIn = p; blocks.Write = q; - r = InflateFast(this.Lbits, this.Dbits, this.Ltree, this.LtreeIndex, this.Dtree, this.DtreeIndex, blocks, z); + r = this.InflateFast(this.Lbits, this.Dbits, this.Ltree, this.LtreeIndex, this.Dtree, this.DtreeIndex, blocks, z); p = z.NextIn; n = z.AvailableBytesIn; b = blocks.Bitb; @@ -1700,7 +1700,7 @@ internal int Reset() { this.Codec.TotalBytesIn = this.Codec.TotalBytesOut = 0; this.Codec.Message = null; - this.Mode = HandleRfc1950HeaderBytes ? METHOD : BLOCKS; + this.Mode = this.HandleRfc1950HeaderBytes ? METHOD : BLOCKS; this.Blocks.Reset(null); return ZlibConstants.Z_OK; @@ -1733,7 +1733,7 @@ internal int Initialize(ZlibCodec codec, int w) // set window size if (w < 8 || w > 15) { - End(); + this.End(); throw new ZlibException("Bad window size."); //return ZlibConstants.Z_STREAM_ERROR; @@ -1741,10 +1741,10 @@ internal int Initialize(ZlibCodec codec, int w) this.Wbits = w; - this.Blocks = new InflateBlocks(codec, HandleRfc1950HeaderBytes ? this : null, 1 << w); + this.Blocks = new InflateBlocks(codec, this.HandleRfc1950HeaderBytes ? this : null, 1 << w); // reset state - Reset(); + this.Reset(); return ZlibConstants.Z_OK; } @@ -1902,7 +1902,7 @@ internal int Inflate(FlushType flush) r = f; this.Blocks.Reset(this.Was); - if (!HandleRfc1950HeaderBytes) + if (!this.HandleRfc1950HeaderBytes) { this.Mode = DONE; @@ -2070,7 +2070,7 @@ internal int Sync() r = this.Codec.TotalBytesIn; w = this.Codec.TotalBytesOut; - Reset(); + this.Reset(); this.Codec.TotalBytesIn = r; this.Codec.TotalBytesOut = w; this.Mode = BLOCKS; diff --git a/RestSharp/Compression/ZLib/ZLib.cs b/RestSharp/Compression/ZLib/ZLib.cs index 8ce5e6277..3f4c50477 100644 --- a/RestSharp/Compression/ZLib/ZLib.cs +++ b/RestSharp/Compression/ZLib/ZLib.cs @@ -195,12 +195,12 @@ public static int ReadInput(TextReader sourceTextReader, byte[] target, int star internal static byte[] ToByteArray(string sourceString) { - return UTF8Encoding.UTF8.GetBytes(sourceString); + return Encoding.UTF8.GetBytes(sourceString); } internal static char[] ToCharArray(byte[] byteArray) { - return UTF8Encoding.UTF8.GetChars(byteArray); + return Encoding.UTF8.GetChars(byteArray); } } diff --git a/RestSharp/Compression/ZLib/ZLibCodec.cs b/RestSharp/Compression/ZLib/ZLibCodec.cs index 529d0618f..361921102 100644 --- a/RestSharp/Compression/ZLib/ZLibCodec.cs +++ b/RestSharp/Compression/ZLib/ZLibCodec.cs @@ -156,7 +156,7 @@ sealed internal class ZlibCodec /// public ZlibCodec() { - int rc = InitializeInflate(); + int rc = this.InitializeInflate(); if (rc != ZlibConstants.Z_OK) throw new ZlibException("Cannot initialize for inflate."); @@ -172,7 +172,7 @@ public ZlibCodec() /// Z_OK if everything goes well. public int InitializeInflate() { - return InitializeInflate(this.WindowBits); + return this.InitializeInflate(this.WindowBits); } /// @@ -195,7 +195,7 @@ public int InitializeInflate() /// Z_OK if everything goes well. public int InitializeInflate(bool expectRfc1950Header) { - return InitializeInflate(this.WindowBits, expectRfc1950Header); + return this.InitializeInflate(this.WindowBits, expectRfc1950Header); } /// @@ -208,7 +208,7 @@ public int InitializeInflate(int windowBits) { this.WindowBits = windowBits; - return InitializeInflate(windowBits, true); + return this.InitializeInflate(windowBits, true); } /// diff --git a/RestSharp/Compression/ZLib/ZLibStream.cs b/RestSharp/Compression/ZLib/ZLibStream.cs index a0ed375b9..02157c093 100644 --- a/RestSharp/Compression/ZLib/ZLibStream.cs +++ b/RestSharp/Compression/ZLib/ZLibStream.cs @@ -93,7 +93,7 @@ virtual public FlushType FlushMode get { return (this.BaseStream.FlushMode); } set { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("ZlibStream"); this.BaseStream.FlushMode = value; @@ -121,7 +121,7 @@ public int BufferSize get { return this.BaseStream.BufferSize; } set { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("ZlibStream"); if (this.BaseStream.workingBuffer != null) @@ -161,12 +161,12 @@ protected override void Dispose(bool disposing) { try { - if (!disposed) + if (!this.disposed) { if (disposing && (this.BaseStream != null)) this.BaseStream.Close(); - disposed = true; + this.disposed = true; } } finally @@ -185,7 +185,7 @@ public override bool CanRead { get { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("ZlibStream"); return this.BaseStream.Stream.CanRead; @@ -213,7 +213,7 @@ public override bool CanWrite { get { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("ZlibStream"); return this.BaseStream.Stream.CanWrite; @@ -225,7 +225,7 @@ public override bool CanWrite /// public override void Flush() { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("ZlibStream"); this.BaseStream.Flush(); @@ -290,7 +290,7 @@ public override long Position /// the number of bytes to read. public override int Read(byte[] buffer, int offset, int count) { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("ZlibStream"); return this.BaseStream.Read(buffer, offset, count); @@ -338,7 +338,7 @@ public override void SetLength(long value) /// the number of bytes to write. public override void Write(byte[] buffer, int offset, int count) { - if (disposed) + if (this.disposed) throw new ObjectDisposedException("ZlibStream"); this.BaseStream.Write(buffer, offset, count); @@ -442,7 +442,7 @@ internal class ZlibBaseStream : Stream protected internal DateTime GzipMtime; protected internal int GzipHeaderByteCount; - internal int Crc32 { get { return crc == null ? 0 : crc.Crc32Result; } } + internal int Crc32 { get { return this.crc == null ? 0 : this.crc.Crc32Result; } } public ZlibBaseStream(Stream stream, ZlibStreamFlavor flavor, bool leaveOpen) { @@ -455,7 +455,7 @@ public ZlibBaseStream(Stream stream, ZlibStreamFlavor flavor, bool leaveOpen) if (flavor == ZlibStreamFlavor.Gzip) { - crc = new Crc32(); + this.crc = new Crc32(); } } @@ -463,21 +463,21 @@ private ZlibCodec Z { get { - if (z == null) + if (this.z == null) { bool wantRfc1950Header = (this.Flavor == ZlibStreamFlavor.Zlib); - z = new ZlibCodec(); - z.InitializeInflate(wantRfc1950Header); + this.z = new ZlibCodec(); + this.z.InitializeInflate(wantRfc1950Header); } - return z; + return this.z; } } private byte[] WorkingBuffer { - get { return workingBuffer ?? (workingBuffer = new byte[this.BufferSize]); } + get { return this.workingBuffer ?? (this.workingBuffer = new byte[this.BufferSize]); } } // workitem 7813 - totally unnecessary @@ -494,88 +494,88 @@ public override void Write(byte[] buffer, int offset, int count) { // workitem 7159 // calculate the CRC on the unccompressed data (before writing) - if (crc != null) - crc.SlurpBlock(buffer, offset, count); + if (this.crc != null) + this.crc.SlurpBlock(buffer, offset, count); - if (streamMode == StreamMode.Undefined) - streamMode = StreamMode.Writer; - else if (streamMode != StreamMode.Writer) + if (this.streamMode == StreamMode.Undefined) + this.streamMode = StreamMode.Writer; + else if (this.streamMode != StreamMode.Writer) throw new ZlibException("Cannot Write after Reading."); if (count == 0) return; // first reference of z property will initialize the private var _z - z.InputBuffer = buffer; - z.NextIn = offset; - z.AvailableBytesIn = count; + this.z.InputBuffer = buffer; + this.z.NextIn = offset; + this.z.AvailableBytesIn = count; bool done; do { - z.OutputBuffer = WorkingBuffer; - z.NextOut = 0; - z.AvailableBytesOut = workingBuffer.Length; + this.z.OutputBuffer = this.WorkingBuffer; + this.z.NextOut = 0; + this.z.AvailableBytesOut = this.workingBuffer.Length; //int rc = (_wantCompress) // ? _z.Deflate(_flushMode) // : _z.Inflate(_flushMode); - int rc = z.Inflate(this.FlushMode); + int rc = this.z.Inflate(this.FlushMode); if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) - throw new ZlibException("inflating: " + z.Message); + throw new ZlibException("inflating: " + this.z.Message); - this.Stream.Write(workingBuffer, 0, workingBuffer.Length - z.AvailableBytesOut); + this.Stream.Write(this.workingBuffer, 0, this.workingBuffer.Length - this.z.AvailableBytesOut); - done = z.AvailableBytesIn == 0 && z.AvailableBytesOut != 0; + done = this.z.AvailableBytesIn == 0 && this.z.AvailableBytesOut != 0; // If GZIP and de-compress, we're done when 8 bytes remain. if (this.Flavor == ZlibStreamFlavor.Gzip) - done = (z.AvailableBytesIn == 8 && z.AvailableBytesOut != 0); + done = (this.z.AvailableBytesIn == 8 && this.z.AvailableBytesOut != 0); } while (!done); } private void Finish() { - if (z == null) + if (this.z == null) return; - switch (streamMode) + switch (this.streamMode) { case StreamMode.Writer: bool done; do { - z.OutputBuffer = WorkingBuffer; - z.NextOut = 0; - z.AvailableBytesOut = workingBuffer.Length; + this.z.OutputBuffer = this.WorkingBuffer; + this.z.NextOut = 0; + this.z.AvailableBytesOut = this.workingBuffer.Length; //int rc = (_wantCompress) // ? _z.Deflate(FlushType.Finish) // : _z.Inflate(FlushType.Finish); - int rc = z.Inflate(FlushType.Finish); + int rc = this.z.Inflate(FlushType.Finish); if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) - throw new ZlibException("inflating: " + z.Message); + throw new ZlibException("inflating: " + this.z.Message); - if (workingBuffer.Length - z.AvailableBytesOut > 0) + if (this.workingBuffer.Length - this.z.AvailableBytesOut > 0) { - this.Stream.Write(workingBuffer, 0, workingBuffer.Length - z.AvailableBytesOut); + this.Stream.Write(this.workingBuffer, 0, this.workingBuffer.Length - this.z.AvailableBytesOut); } - done = z.AvailableBytesIn == 0 && z.AvailableBytesOut != 0; + done = this.z.AvailableBytesIn == 0 && this.z.AvailableBytesOut != 0; // If GZIP and de-compress, we're done when 8 bytes remain. if (this.Flavor == ZlibStreamFlavor.Gzip) - done = (z.AvailableBytesIn == 8 && z.AvailableBytesOut != 0); + done = (this.z.AvailableBytesIn == 8 && this.z.AvailableBytesOut != 0); } while (!done); - Flush(); + this.Flush(); // workitem 7159 if (this.Flavor == ZlibStreamFlavor.Gzip) @@ -589,24 +589,23 @@ private void Finish() if (this.Flavor == ZlibStreamFlavor.Gzip) { // workitem 8501: handle edge case (decompress empty stream) - if (z.TotalBytesOut == 0L) + if (this.z.TotalBytesOut == 0L) return; // Read and potentially verify the GZIP trailer: CRC32 and size mod 2^32 byte[] trailer = new byte[8]; - if (z.AvailableBytesIn != 8) + if (this.z.AvailableBytesIn != 8) { - throw new ZlibException(string.Format("Protocol error. AvailableBytesIn={0}, expected 8", - z.AvailableBytesIn)); + throw new ZlibException(string.Format("Protocol error. AvailableBytesIn={0}, expected 8", this.z.AvailableBytesIn)); } - Array.Copy(z.InputBuffer, z.NextIn, trailer, 0, trailer.Length); + Array.Copy(this.z.InputBuffer, this.z.NextIn, trailer, 0, trailer.Length); int crc32Expected = BitConverter.ToInt32(trailer, 0); - int crc32Actual = crc.Crc32Result; + int crc32Actual = this.crc.Crc32Result; int isizeExpected = BitConverter.ToInt32(trailer, 4); - int isizeActual = (int) (z.TotalBytesOut & 0x00000000FFFFFFFF); + int isizeActual = (int) (this.z.TotalBytesOut & 0x00000000FFFFFFFF); // Console.WriteLine("GZipStream: slurped trailer crc(0x{0:X8}) isize({1})", crc32_expected, isize_expected); // Console.WriteLine("GZipStream: calc'd data crc(0x{0:X8}) isize({1})", crc32_actual, isize_actual); @@ -623,7 +622,7 @@ private void Finish() private void End() { - if (Z == null) + if (this.Z == null) return; //if (_wantCompress) @@ -632,10 +631,10 @@ private void End() //} //else //{ - z.EndInflate(); + this.z.EndInflate(); //} - z = null; + this.z = null; } public override void Close() @@ -733,7 +732,7 @@ private int _ReadAndValidateGzipHeader() int timet = BitConverter.ToInt32(header, 4); - GzipMtime = GZipStream.UnixEpoch.AddSeconds(timet); + this.GzipMtime = GZipStream.UnixEpoch.AddSeconds(timet); totalBytesRead += n; if ((header[3] & 0x04) == 0x04) @@ -754,13 +753,13 @@ private int _ReadAndValidateGzipHeader() } if ((header[3] & 0x08) == 0x08) - GzipFileName = ReadZeroTerminatedString(); + this.GzipFileName = this.ReadZeroTerminatedString(); if ((header[3] & 0x10) == 0x010) - GzipComment = ReadZeroTerminatedString(); + this.GzipComment = this.ReadZeroTerminatedString(); if ((header[3] & 0x02) == 0x02) - Read(this.Buf1, 0, 1); // CRC16, ignore + this.Read(this.Buf1, 0, 1); // CRC16, ignore return totalBytesRead; } @@ -773,29 +772,29 @@ public override int Read(byte[] buffer, int offset, int count) // (b) return 0 only upon EOF, or if count = 0 // (c) if not EOF, then return at least 1 byte, up to bytes - if (streamMode == StreamMode.Undefined) + if (this.streamMode == StreamMode.Undefined) { if (!this.Stream.CanRead) throw new ZlibException("The stream is not readable."); // for the first read, set up some controls. - streamMode = StreamMode.Reader; + this.streamMode = StreamMode.Reader; // (The first reference to _z goes through the private accessor which // may initialize it.) - Z.AvailableBytesIn = 0; + this.Z.AvailableBytesIn = 0; if (this.Flavor == ZlibStreamFlavor.Gzip) { - GzipHeaderByteCount = _ReadAndValidateGzipHeader(); + this.GzipHeaderByteCount = this._ReadAndValidateGzipHeader(); // workitem 8501: handle edge case (decompress empty stream) - if (GzipHeaderByteCount == 0) + if (this.GzipHeaderByteCount == 0) return 0; } } - if (streamMode != StreamMode.Reader) + if (this.streamMode != StreamMode.Reader) throw new ZlibException("Cannot Read after Writing."); if (count == 0) @@ -816,58 +815,58 @@ public override int Read(byte[] buffer, int offset, int count) int rc; // set up the output of the deflate/inflate codec: - z.OutputBuffer = buffer; - z.NextOut = offset; - z.AvailableBytesOut = count; + this.z.OutputBuffer = buffer; + this.z.NextOut = offset; + this.z.AvailableBytesOut = count; // This is necessary in case _workingBuffer has been resized. (new byte[]) // (The first reference to _workingBuffer goes through the private accessor which // may initialize it.) - z.InputBuffer = WorkingBuffer; + this.z.InputBuffer = this.WorkingBuffer; do { // need data in _workingBuffer in order to deflate/inflate. Here, we check if we have any. - if ((z.AvailableBytesIn == 0) && (!nomoreinput)) + if ((this.z.AvailableBytesIn == 0) && (!this.nomoreinput)) { // No data available, so try to Read data from the captive stream. - z.NextIn = 0; - z.AvailableBytesIn = this.Stream.Read(workingBuffer, 0, workingBuffer.Length); + this.z.NextIn = 0; + this.z.AvailableBytesIn = this.Stream.Read(this.workingBuffer, 0, this.workingBuffer.Length); - if (z.AvailableBytesIn == 0) - nomoreinput = true; + if (this.z.AvailableBytesIn == 0) + this.nomoreinput = true; } // we have data in InputBuffer; now compress or decompress as appropriate //rc = (_wantCompress) // ? _z.Deflate(_flushMode) // : _z.Inflate(_flushMode); - rc = z.Inflate(this.FlushMode); + rc = this.z.Inflate(this.FlushMode); - if (nomoreinput && (rc == ZlibConstants.Z_BUF_ERROR)) + if (this.nomoreinput && (rc == ZlibConstants.Z_BUF_ERROR)) return 0; if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) - throw new ZlibException(string.Format("inflating: rc={0} msg={1}", rc, z.Message)); + throw new ZlibException(string.Format("inflating: rc={0} msg={1}", rc, this.z.Message)); - if ((nomoreinput || rc == ZlibConstants.Z_STREAM_END) && (z.AvailableBytesOut == count)) + if ((this.nomoreinput || rc == ZlibConstants.Z_STREAM_END) && (this.z.AvailableBytesOut == count)) break; // nothing more to read } //while (_z.AvailableBytesOut == count && rc == ZlibConstants.Z_OK); - while (z.AvailableBytesOut > 0 && !nomoreinput && rc == ZlibConstants.Z_OK); + while (this.z.AvailableBytesOut > 0 && !this.nomoreinput && rc == ZlibConstants.Z_OK); // workitem 8557 // is there more room in output? - if (z.AvailableBytesOut > 0) + if (this.z.AvailableBytesOut > 0) { - if (rc == ZlibConstants.Z_OK && z.AvailableBytesIn == 0) + if (rc == ZlibConstants.Z_OK && this.z.AvailableBytesIn == 0) { // deferred } // are we completely done reading? - if (nomoreinput) + if (this.nomoreinput) { // and in compression? /*if (_wantCompress) @@ -883,11 +882,11 @@ public override int Read(byte[] buffer, int offset, int count) } - rc = (count - z.AvailableBytesOut); + rc = (count - this.z.AvailableBytesOut); // calculate CRC after reading - if (crc != null) - crc.SlurpBlock(buffer, offset, rc); + if (this.crc != null) + this.crc.SlurpBlock(buffer, offset, rc); return rc; } diff --git a/Tools/NuGet.exe b/Tools/NuGet.exe index 9ca66594f912a1fe7aec510819006fb1a80bc1a9..324daa842c51a9936d8baeabbc21da1e01bc9a4d 100644 GIT binary patch literal 1686528 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 J|995F{{fUW9S8sb literal 1664512 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
  • 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

    w}k|O3;Ng3Ak`gW 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 z zpXaYP$LY5z1M|9koI^Wb&i8|`rw{U5jJ=4k&lj`{6Xuug{g?JUF!$rIxDof|kO^sz z2XI~=VCSi9e)YP8A?A1lx>Qks^vVAHc{XmhoPQ33`mM+5TNIOTS_6vu+q#bHW839? z0(R_s5*}A~pZD3iAGRO#=f}Ana{J+s>w)jzb8x=rn=mY1F=0eBA%8s`e-Fpm4)<@# zoPJXjcH5x;#H_>WUe07Yw!hTvH8H=zxNf;?$gXa`Y&U3!$AR3>|7h|-zo3Tv{BOtE z5Bs(6S15<)=<7TM?^|eFoPOUXKwLN1FD??;%sY@dE4iF~@t> zaX-h`0jIO=EiC#4{02Fv4|3ao(JvgD^BnfZRfiaRA#dHz5fs<&ACG|_9v=;dt{9x_ zg|;t&WH6!E3EOJ*j{)3IJg=0 zYr~Le+iIM~qyLgeM4xl*^}i3o?4*!>R|oMC2z$y8=kH4Bf+3FswiWX8DnEbQ_sL;# z73a&0&uJ~bdCwfi{f~Zc51iYRjr;HIIe+Z`PS~@d9lz^-kkfNG)#yT4w@2#=kdBWB z!#nW)+pag@>oy|(VtA^UZ^9IB+!0LA=Y8uT{hAEY2ahx7FnFBfTz($^@w_*WgILFQ zIBZ4#!N-%s?&C5p7vFDYZ=>E=&;9fwGY`z`DMKRLjQePwEQ#}RKeX$4LgE$p<8f

    >2--I}aFCqV3hWqn}_Ps+y^e(pjbMW|1 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 RGHFl)S5g03{{M}@-vCWeV3Gg; From 2257cf1ae1d85319032e791cae086e756a71b686 Mon Sep 17 00:00:00 2001 From: Michael Hallett Date: Sat, 15 Aug 2015 23:52:00 -0700 Subject: [PATCH 9/9] one more warn as error fix --- .nuget/RestSharp.Build.dll | Bin 7168 -> 7168 bytes .nuget/Signed/RestSharp.Build.dll | Bin 7680 -> 7680 bytes RestSharp/Compression/ZLib/GZipStream.cs | 16 ++++++++-------- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.nuget/RestSharp.Build.dll b/.nuget/RestSharp.Build.dll index 9cb109f6f282196df950040f8de235e7a8dc9202..0b948cdbc27c08c8ce952628b120002e91d4d128 100644 GIT binary patch delta 64 zcmV-G0Kfl$IDj~ihywF6v5FQF5D)tB&%6EjK&-Akj!L-eAW0#naz;vTNQNNB#-^oP@^VJJ$iZ^c%+QSHxoSY{jCD7?2reU>g TzH>vaK~8sh&56x3L^9X`4bvDr diff --git a/.nuget/Signed/RestSharp.Build.dll b/.nuget/Signed/RestSharp.Build.dll index 0ddefbe84f623010367597a4e50ce3f73bf48004..1179208a5c1ab7aa0bb55e7554243ee142839c39 100644 GIT binary patch delta 205 zcmV;;05bo8Jb*lqhywC5k%~?N;?1$zb^(6{6R=+8zDOrUfxh&oRh`sujLjc`7VpOA z2fmLmzUa}{EwN+fgKDl?7j?`&)&N2&R|Z090HMM(d&S98bKld-1FrO){j3wQtz|>w z1q-^At@Y}_6dfHOoD&E*C6iDR@(8rcY+#o5n75@YST(VI1RobEG$X(k!J~exa&`e` zv(N%~5D-P!mrXqF) zv(N%~5D;~XU{(u(Tt}4Z_cMQdxc9SI6J!DcwlR~w6&esX;mZ#HX9z~W|7XYEZ!#vc H=oJ_U+$Uui diff --git a/RestSharp/Compression/ZLib/GZipStream.cs b/RestSharp/Compression/ZLib/GZipStream.cs index 29f718660..aaaef52c4 100644 --- a/RestSharp/Compression/ZLib/GZipStream.cs +++ b/RestSharp/Compression/ZLib/GZipStream.cs @@ -188,14 +188,14 @@ public string FileName } } - ///

    - /// The last modified time for the GZIP stream. - /// - /// - /// GZIP allows the storage of a last modified time with each GZIP entry. - /// When compressing data, you can set this before the first call to Write(). When - /// decompressing, you can retrieve this value any time after the first call to - /// Read(). + // / + // / The last modified time for the GZIP stream. + // / + // / + // / GZIP allows the storage of a last modified time with each GZIP entry. + // / When compressing data, you can set this before the first call to Write(). When + // / decompressing, you can retrieve this value any time after the first call to + // / Read(). //public DateTime? LastModified; ///
  • 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