Skip to content

Commit 725f7bb

Browse files
committed
Started reworking on v3 api, merged into the main branch
1 parent fe79203 commit 725f7bb

37 files changed

+11688
-282
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,6 @@ _ReSharper*/
3232
*.pidb
3333
*.userprefs
3434
*~
35-
*.nupkg
35+
*.nupkg
36+
test[\-]results
37+
TestResult.xml

Core/Core.csproj

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
33
<PropertyGroup>
44
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -62,7 +62,6 @@
6262
<Reference Include="System.ServiceModel.Web" />
6363
<Reference Include="System.Web" />
6464
<Reference Include="System.Web.Extensions">
65-
<RequiredTargetFramework>3.5</RequiredTargetFramework>
6665
</Reference>
6766
<Reference Include="System.Xml.Linq">
6867
</Reference>
@@ -101,6 +100,14 @@
101100
<Compile Include="Models\User.cs" />
102101
<Compile Include="Services\ICacheProvider.cs" />
103102
<Compile Include="Services\ILogProvider.cs" />
103+
<Compile Include="GithubRequest.cs" />
104+
<Compile Include="GithubResponse.cs" />
105+
<Compile Include="GithubErrorResponse.cs" />
106+
<Compile Include="Services\IAuthProvider.cs" />
107+
<Compile Include="GithubAuthenticationException.cs" />
108+
<Compile Include="GithubFailedResponse.cs" />
109+
<Compile Include="GithubRequestWithBinaryFileToSend.cs" />
110+
<Compile Include="GithubRequestWithReturnType.cs" />
104111
</ItemGroup>
105112
<ItemGroup>
106113
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System;
2+
3+
namespace GithubSharp.Core
4+
{
5+
public class GithubAuthenticationException : Exception
6+
{
7+
public GithubAuthenticationException (string uri)
8+
:base(string.Format("Failed to authenticate for {0}", uri))
9+
{
10+
}
11+
}
12+
}
13+

Core/GithubErrorResponse.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace GithubSharp.Core
5+
{
6+
public class GithubErrorResponse : GithubResponseWithModel<GithubErrorResponseModel>
7+
{
8+
}
9+
10+
11+
public class GithubErrorResponseModel
12+
{
13+
public string Message {
14+
get;
15+
set;
16+
}
17+
18+
public IEnumerable<GithubError> Errors {
19+
get;
20+
set;
21+
}
22+
}
23+
24+
public class GithubError
25+
{
26+
public string Resource {
27+
get;
28+
set;
29+
}
30+
31+
public string Field {
32+
get;
33+
set;
34+
}
35+
36+
public string Code {
37+
get;
38+
set;
39+
}
40+
}
41+
}
42+

Core/GithubFailedResponse.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System;
2+
3+
namespace GithubSharp.Core
4+
{
5+
public class GithubFailedResponse : GithubResponse, IGithubResponse
6+
{
7+
public GithubFailedResponse (string uri)
8+
{
9+
FailedUri = uri;
10+
}
11+
12+
public string FailedUri {
13+
get;
14+
set;
15+
}
16+
}
17+
}
18+

Core/GithubRequest.cs

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
using System;
2+
using GithubSharp.Core.Base;
3+
4+
namespace GithubSharp.Core
5+
{
6+
public interface IGithubRequest
7+
{
8+
string Method { get;}
9+
string Path {get;set;}
10+
IGithubResponse GetResponse();
11+
Core.Services.ILogProvider LogProvider {get;set;}
12+
Core.Services.IAuthProvider AuthProvider {get;set;}
13+
Core.Services.ICacheProvider CacheProvider {get;set;}
14+
int? PagingRequestAmount {get;set;}
15+
int? PagingCurrentPage {get;set;}
16+
}
17+
18+
19+
public class GithubRequest : IGithubRequest
20+
{
21+
public Core.Services.ILogProvider LogProvider {get;set;}
22+
public Core.Services.IAuthProvider AuthProvider {get;set;}
23+
public Core.Services.ICacheProvider CacheProvider {get;set;}
24+
public virtual string Method { get;set; }
25+
public virtual string Path { get;set; }
26+
public virtual int? PagingRequestAmount { get;set; }
27+
public virtual int? PagingCurrentPage { get;set; }
28+
29+
public GithubRequest(
30+
Core.Services.ILogProvider logProvider,
31+
Core.Services.ICacheProvider cacheProvider,
32+
Core.Services.IAuthProvider authProvider,
33+
string path)
34+
:this(logProvider, cacheProvider, authProvider, path, "GET")
35+
{
36+
}
37+
38+
public GithubRequest(
39+
Core.Services.ILogProvider logProvider,
40+
Core.Services.ICacheProvider cacheProvider,
41+
Core.Services.IAuthProvider authProvider,
42+
string path,
43+
string method)
44+
{
45+
LogProvider = logProvider;
46+
CacheProvider = cacheProvider;
47+
AuthProvider = authProvider;
48+
Path = path;
49+
Method = method;
50+
}
51+
52+
public virtual bool IsCached(string uri)
53+
{
54+
return CacheProvider.IsCached<IGithubResponse>(uri);
55+
}
56+
57+
public virtual IGithubResponse GetFromCache(string uri)
58+
{
59+
var cached = CacheProvider.Get<IGithubResponse>(uri);
60+
return cached;
61+
}
62+
63+
public virtual void Cache(IGithubResponse response, string uri)
64+
{
65+
CacheProvider.Set(response, uri);
66+
}
67+
68+
public virtual System.Net.HttpWebRequest PrepareWebRequest(System.Net.HttpWebRequest webRequest)
69+
{
70+
webRequest.Accept = "application/vnd.github+json";
71+
72+
return webRequest;
73+
}
74+
75+
//Hack for mono
76+
public static bool Validator (object sender,
77+
System.Security.Cryptography.X509Certificates.X509Certificate certificate,
78+
System.Security.Cryptography.X509Certificates.X509Chain chain,
79+
System.Net.Security.SslPolicyErrors sslPolicyErrors)
80+
{
81+
return true;
82+
}
83+
84+
public string AddQueryStringToUri(string uri,
85+
string name,
86+
string val)
87+
{
88+
return string.Format("{0}{1}{2}={3}",
89+
uri,
90+
uri.Contains("?") ? "&" : "?",
91+
name,
92+
val);
93+
}
94+
95+
public virtual string AddPagingToUri(string uri)
96+
{
97+
if (PagingCurrentPage.HasValue)
98+
uri = AddQueryStringToUri(uri, "page", PagingCurrentPage.Value.ToString());
99+
if (PagingRequestAmount.HasValue)
100+
uri = AddQueryStringToUri(uri, "per_page", PagingRequestAmount.Value.ToString());
101+
return uri;
102+
}
103+
104+
public virtual string PrepareUri(string uri)
105+
{
106+
return uri;
107+
}
108+
109+
public virtual GithubResponse ParsePagingLinks(GithubResponse response, string linkHeader)
110+
{
111+
foreach (var header in linkHeader.Split(new char [] { ',' })){
112+
var splitted = header.Split(new char[] { ';' });
113+
var link = splitted[0].Trim();
114+
var what = splitted[1].Trim();
115+
what = what.Substring(5);
116+
what = what.Substring(0, what.Length-1);
117+
link = link.Substring(1);
118+
link = link.Substring(0, link.Length-1);
119+
switch(what)
120+
{
121+
case "next" : response.LinkNext = link;break;
122+
case "prev" : response.LinkPrevious = link;break;
123+
case "first" : response.LinkFirst = link;break;
124+
default : response.LinkLast = link;break;
125+
}
126+
}
127+
return response;
128+
}
129+
130+
public virtual IGithubResponse GetResponse ()
131+
{
132+
var uri = string.Format("{0}/{1}",
133+
GithubSharp.Core.GithubURLs.GithubApiBaseUrl,
134+
Path);
135+
136+
uri = AddPagingToUri(uri);
137+
138+
uri = PrepareUri(uri);
139+
140+
if (IsCached(uri))
141+
{
142+
LogProvider.LogMessage("Returning cached result for {0}", uri);
143+
return GetFromCache(uri) as GithubResponse;
144+
}
145+
146+
//Hack for mono
147+
System.Net.ServicePointManager.ServerCertificateValidationCallback = Validator;
148+
149+
var webRequest = System.Net.HttpWebRequest.Create(new Uri(uri)) as System.Net.HttpWebRequest;
150+
151+
webRequest.Method = Method;
152+
153+
var authResult = AuthProvider.PreRequestAuth(this, webRequest);
154+
155+
if (!authResult.Success)
156+
{
157+
var authError = new GithubAuthenticationException(uri);
158+
if (LogProvider.HandleAndReturnIfToThrowError(authError))
159+
{
160+
throw authError;
161+
}
162+
return new GithubFailedResponse(uri);
163+
}
164+
165+
webRequest = PrepareWebRequest(authResult.WebRequest);
166+
167+
try
168+
{
169+
var response = webRequest.GetResponse();
170+
var responseString = new System.IO.StreamReader(response.GetResponseStream()).ReadToEnd();
171+
var responseToReturn = new GithubResponse
172+
{
173+
RateLimitLimit = int.Parse(response.Headers["X-RateLimit-Limit"]),
174+
RateLimitRemaining = int.Parse(response.Headers["X-RateLimit-Remaining"]),
175+
Response = responseString
176+
};
177+
if (!string.IsNullOrEmpty(response.Headers.Get("Link")))
178+
{
179+
responseToReturn = ParsePagingLinks(
180+
responseToReturn,
181+
response.Headers.Get("Link"));
182+
}
183+
Cache(responseToReturn, uri);
184+
return responseToReturn;
185+
186+
}
187+
catch (Exception error)
188+
{
189+
if (LogProvider.HandleAndReturnIfToThrowError(error))
190+
throw;
191+
return new GithubFailedResponse(uri);
192+
}
193+
}
194+
195+
196+
}
197+
198+
199+
200+
}
201+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System;
2+
3+
namespace GithubSharp.Core
4+
{
5+
public interface IGithubRequestWithBinaryFileToSend : IGithubRequest
6+
{
7+
System.IO.Stream BinaryToSend {get;set;}
8+
}
9+
10+
public interface IGithubRequestWithBinaryFileToSendWithReturnType<TReturnType> : IGithubRequestWithBinaryFileToSend
11+
where TReturnType : class
12+
{
13+
}
14+
15+
//TODO : Implement if needed
16+
public class GithubRequestWithBinaryFileToSend
17+
{
18+
public GithubRequestWithBinaryFileToSend ()
19+
{
20+
}
21+
}
22+
}
23+
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using System;
2+
using GithubSharp.Core.Base;
3+
4+
namespace GithubSharp.Core
5+
{
6+
public class GithubRequestWithReturnType<TReturnType> : GithubRequest
7+
where TReturnType : class
8+
{
9+
public GithubRequestWithReturnType (Core.Services.ILogProvider logProvider,
10+
Core.Services.ICacheProvider cacheProvider,
11+
Core.Services.IAuthProvider authProvider,
12+
string path)
13+
: base(logProvider, cacheProvider, authProvider, path)
14+
{
15+
}
16+
public GithubRequestWithReturnType (Core.Services.ILogProvider logProvider,
17+
Core.Services.ICacheProvider cacheProvider,
18+
Core.Services.IAuthProvider authProvider,
19+
string path,
20+
string method)
21+
: base(logProvider, cacheProvider, authProvider, path, method)
22+
{
23+
}
24+
25+
public override bool IsCached (string uri)
26+
{
27+
return CacheProvider.IsCached<TReturnType>(uri);
28+
}
29+
30+
public new IGithubResponseWithReturnType<TReturnType> GetResponse()
31+
{
32+
var baseResult = base.GetResponse() as IGithubResponseWithReturnType<TReturnType>;
33+
try
34+
{
35+
baseResult.Result = JsonConverter.FromJson<TReturnType>(baseResult.Response);
36+
}
37+
catch (Exception error)
38+
{
39+
if (LogProvider.HandleAndReturnIfToThrowError(error))
40+
throw;
41+
}
42+
43+
return baseResult;
44+
}
45+
}
46+
}
47+

0 commit comments

Comments
 (0)