mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-04-22 18:22:49 +08:00
naming and plan
This commit is contained in:
parent
711a3d6a91
commit
cea6a557e9
@ -1,14 +0,0 @@
|
|||||||
namespace Ocelot.Library.Infrastructure.BaseUrlRepository
|
|
||||||
{
|
|
||||||
public class BaseUrlMap
|
|
||||||
{
|
|
||||||
public BaseUrlMap(string downstreamBaseUrl, string upstreamBaseUrl)
|
|
||||||
{
|
|
||||||
DownstreamBaseUrl = downstreamBaseUrl;
|
|
||||||
UpstreamBaseUrl = upstreamBaseUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string DownstreamBaseUrl {get;private set;}
|
|
||||||
public string UpstreamBaseUrl {get;private set;}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
using Ocelot.Library.Infrastructure.Responses;
|
|
||||||
|
|
||||||
namespace Ocelot.Library.Infrastructure.BaseUrlRepository
|
|
||||||
{
|
|
||||||
public class BaseUrlMapKeyAlreadyExists : Error
|
|
||||||
{
|
|
||||||
public BaseUrlMapKeyAlreadyExists()
|
|
||||||
: base("This key has already been used")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
using Ocelot.Library.Infrastructure.Responses;
|
|
||||||
|
|
||||||
namespace Ocelot.Library.Infrastructure.BaseUrlRepository
|
|
||||||
{
|
|
||||||
public class BaseUrlMapKeyDoesNotExist : Error
|
|
||||||
{
|
|
||||||
public BaseUrlMapKeyDoesNotExist()
|
|
||||||
: base("This key does not exist")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
using Ocelot.Library.Infrastructure.Responses;
|
|
||||||
|
|
||||||
namespace Ocelot.Library.Infrastructure.BaseUrlRepository
|
|
||||||
{
|
|
||||||
public interface IBaseUrlMapRepository
|
|
||||||
{
|
|
||||||
Response AddBaseUrlMap(BaseUrlMap baseUrlMap);
|
|
||||||
Response<BaseUrlMap> GetBaseUrlMap(string downstreamUrl);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using Ocelot.Library.Infrastructure.Responses;
|
|
||||||
|
|
||||||
namespace Ocelot.Library.Infrastructure.BaseUrlRepository
|
|
||||||
{
|
|
||||||
public class InMemoryBaseUrlMapRepository : IBaseUrlMapRepository
|
|
||||||
{
|
|
||||||
private readonly Dictionary<string, string> _routes;
|
|
||||||
public InMemoryBaseUrlMapRepository()
|
|
||||||
{
|
|
||||||
_routes = new Dictionary<string,string>();
|
|
||||||
}
|
|
||||||
public Response AddBaseUrlMap(BaseUrlMap baseUrlMap)
|
|
||||||
{
|
|
||||||
if(_routes.ContainsKey(baseUrlMap.DownstreamBaseUrl))
|
|
||||||
{
|
|
||||||
return new ErrorResponse(new List<Error>(){new BaseUrlMapKeyAlreadyExists()});
|
|
||||||
}
|
|
||||||
|
|
||||||
_routes.Add(baseUrlMap.DownstreamBaseUrl, baseUrlMap.UpstreamBaseUrl);
|
|
||||||
|
|
||||||
return new OkResponse();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Response<BaseUrlMap> GetBaseUrlMap(string downstreamUrl)
|
|
||||||
{
|
|
||||||
string upstreamUrl = null;
|
|
||||||
|
|
||||||
if(_routes.TryGetValue(downstreamUrl, out upstreamUrl))
|
|
||||||
{
|
|
||||||
return new OkResponse<BaseUrlMap>(new BaseUrlMap(downstreamUrl, upstreamUrl));
|
|
||||||
}
|
|
||||||
|
|
||||||
return new ErrorResponse<BaseUrlMap>(new List<Error>(){new BaseUrlMapKeyDoesNotExist()});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,14 @@
|
|||||||
|
namespace Ocelot.Library.Infrastructure.HostUrlRepository
|
||||||
|
{
|
||||||
|
public class HostUrlMap
|
||||||
|
{
|
||||||
|
public HostUrlMap(string downstreamHostUrl, string upstreamHostUrl)
|
||||||
|
{
|
||||||
|
DownstreamHostUrl = downstreamHostUrl;
|
||||||
|
UpstreamHostUrl = upstreamHostUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string DownstreamHostUrl {get;private set;}
|
||||||
|
public string UpstreamHostUrl {get;private set;}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
|
|
||||||
|
namespace Ocelot.Library.Infrastructure.HostUrlRepository
|
||||||
|
{
|
||||||
|
public class HostUrlMapKeyAlreadyExists : Error
|
||||||
|
{
|
||||||
|
public HostUrlMapKeyAlreadyExists()
|
||||||
|
: base("This key has already been used")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
|
|
||||||
|
namespace Ocelot.Library.Infrastructure.HostUrlRepository
|
||||||
|
{
|
||||||
|
public class HostUrlMapKeyDoesNotExist : Error
|
||||||
|
{
|
||||||
|
public HostUrlMapKeyDoesNotExist()
|
||||||
|
: base("This key does not exist")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
|
|
||||||
|
namespace Ocelot.Library.Infrastructure.HostUrlRepository
|
||||||
|
{
|
||||||
|
public interface IHostUrlMapRepository
|
||||||
|
{
|
||||||
|
Response AddBaseUrlMap(HostUrlMap baseUrlMap);
|
||||||
|
Response<HostUrlMap> GetBaseUrlMap(string downstreamUrl);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
|
|
||||||
|
namespace Ocelot.Library.Infrastructure.HostUrlRepository
|
||||||
|
{
|
||||||
|
public class InMemoryHostUrlMapRepository : IHostUrlMapRepository
|
||||||
|
{
|
||||||
|
private readonly Dictionary<string, string> _routes;
|
||||||
|
public InMemoryHostUrlMapRepository()
|
||||||
|
{
|
||||||
|
_routes = new Dictionary<string,string>();
|
||||||
|
}
|
||||||
|
public Response AddBaseUrlMap(HostUrlMap baseUrlMap)
|
||||||
|
{
|
||||||
|
if(_routes.ContainsKey(baseUrlMap.DownstreamHostUrl))
|
||||||
|
{
|
||||||
|
return new ErrorResponse(new List<Error>(){new HostUrlMapKeyAlreadyExists()});
|
||||||
|
}
|
||||||
|
|
||||||
|
_routes.Add(baseUrlMap.DownstreamHostUrl, baseUrlMap.UpstreamHostUrl);
|
||||||
|
|
||||||
|
return new OkResponse();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Response<HostUrlMap> GetBaseUrlMap(string downstreamUrl)
|
||||||
|
{
|
||||||
|
string upstreamUrl = null;
|
||||||
|
|
||||||
|
if(_routes.TryGetValue(downstreamUrl, out upstreamUrl))
|
||||||
|
{
|
||||||
|
return new OkResponse<HostUrlMap>(new HostUrlMap(downstreamUrl, upstreamUrl));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ErrorResponse<HostUrlMap>(new List<Error>(){new HostUrlMapKeyDoesNotExist()});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -15,5 +15,13 @@ namespace Ocelot.Library.Infrastructure.Responses
|
|||||||
}
|
}
|
||||||
|
|
||||||
public List<Error> Errors { get; private set; }
|
public List<Error> Errors { get; private set; }
|
||||||
|
|
||||||
|
public bool IsError
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Errors.Count > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -14,5 +14,6 @@ namespace Ocelot.Library.Infrastructure.Responses
|
|||||||
}
|
}
|
||||||
|
|
||||||
public T Data { get; private set; }
|
public T Data { get; private set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,9 +0,0 @@
|
|||||||
using Ocelot.Library.Infrastructure.Responses;
|
|
||||||
|
|
||||||
namespace Ocelot.Library.Infrastructure.UrlFinder
|
|
||||||
{
|
|
||||||
public interface IUpstreamBaseUrlFinder
|
|
||||||
{
|
|
||||||
Response<string> FindUpstreamBaseUrl(string downstreamBaseUrl);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,9 @@
|
|||||||
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
|
|
||||||
|
namespace Ocelot.Library.Infrastructure.UrlFinder
|
||||||
|
{
|
||||||
|
public interface IUpstreamHostUrlFinder
|
||||||
|
{
|
||||||
|
Response<string> FindUpstreamHostUrl(string downstreamHostUrl);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
|
|
||||||
|
namespace Ocelot.Library.Infrastructure.UrlFinder
|
||||||
|
{
|
||||||
|
public class UnableToFindUpstreamHostUrl : Error
|
||||||
|
{
|
||||||
|
public UnableToFindUpstreamHostUrl()
|
||||||
|
: base("Unable to find upstream base url")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,22 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Ocelot.Library.Infrastructure.BaseUrlRepository;
|
|
||||||
using Ocelot.Library.Infrastructure.Responses;
|
|
||||||
|
|
||||||
namespace Ocelot.Library.Infrastructure.UrlFinder
|
|
||||||
{
|
|
||||||
public class UpstreamBaseUrlFinder : IUpstreamBaseUrlFinder
|
|
||||||
{
|
|
||||||
private readonly IBaseUrlMapRepository _baseUrlMapRepository;
|
|
||||||
|
|
||||||
public UpstreamBaseUrlFinder(IBaseUrlMapRepository baseUrlMapRepository)
|
|
||||||
{
|
|
||||||
_baseUrlMapRepository = baseUrlMapRepository;
|
|
||||||
}
|
|
||||||
public Response<string> FindUpstreamBaseUrl(string downstreamBaseUrl)
|
|
||||||
{
|
|
||||||
var baseUrl = _baseUrlMapRepository.GetBaseUrlMap(downstreamBaseUrl);
|
|
||||||
|
|
||||||
return new OkResponse<string>(baseUrl.Data.UpstreamBaseUrl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Ocelot.Library.Infrastructure.HostUrlRepository;
|
||||||
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
|
|
||||||
|
namespace Ocelot.Library.Infrastructure.UrlFinder
|
||||||
|
{
|
||||||
|
public class UpstreamHostUrlFinder : IUpstreamHostUrlFinder
|
||||||
|
{
|
||||||
|
private readonly IHostUrlMapRepository _hostUrlMapRepository;
|
||||||
|
|
||||||
|
public UpstreamHostUrlFinder(IHostUrlMapRepository hostUrlMapRepository)
|
||||||
|
{
|
||||||
|
_hostUrlMapRepository = hostUrlMapRepository;
|
||||||
|
}
|
||||||
|
public Response<string> FindUpstreamHostUrl(string downstreamBaseUrl)
|
||||||
|
{
|
||||||
|
var baseUrl = _hostUrlMapRepository.GetBaseUrlMap(downstreamBaseUrl);
|
||||||
|
|
||||||
|
if(baseUrl.IsError)
|
||||||
|
{
|
||||||
|
return new ErrorResponse<string>(new List<Error> {new UnableToFindUpstreamHostUrl()});
|
||||||
|
}
|
||||||
|
|
||||||
|
return new OkResponse<string>(baseUrl.Data.UpstreamHostUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,12 +0,0 @@
|
|||||||
using Ocelot.Library.Infrastructure.Responses;
|
|
||||||
|
|
||||||
namespace Ocelot.Library.Infrastructure.UrlPathRepository
|
|
||||||
{
|
|
||||||
public class DownstreamUrlPathTemplateAlreadyExists : Error
|
|
||||||
{
|
|
||||||
public DownstreamUrlPathTemplateAlreadyExists()
|
|
||||||
: base("This key has already been used")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
using Ocelot.Library.Infrastructure.Responses;
|
|
||||||
|
|
||||||
namespace Ocelot.Library.Infrastructure.UrlPathRepository
|
|
||||||
{
|
|
||||||
public class DownstreamUrlPathTemplateDoesNotExist : Error
|
|
||||||
{
|
|
||||||
public DownstreamUrlPathTemplateDoesNotExist()
|
|
||||||
: base("This key does not exist")
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -14,6 +14,13 @@ namespace Ocelot.Library.Middleware
|
|||||||
|
|
||||||
public async Task Invoke(HttpContext context)
|
public async Task Invoke(HttpContext context)
|
||||||
{
|
{
|
||||||
|
//get the downstream host from the request context
|
||||||
|
//get the upstream host from the host repository
|
||||||
|
//if no upstream host fail this request
|
||||||
|
//get the downstream path from the request context
|
||||||
|
//get the downstream path template from the path template finder
|
||||||
|
//todo think about variables..
|
||||||
|
//add any query string..
|
||||||
await _next.Invoke(context);
|
await _next.Invoke(context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,21 @@
|
|||||||
using Ocelot.Library.Infrastructure.Responses;
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
using Ocelot.Library.Infrastructure.BaseUrlRepository;
|
using Ocelot.Library.Infrastructure.HostUrlRepository;
|
||||||
using Shouldly;
|
using Shouldly;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Ocelot.UnitTests
|
namespace Ocelot.UnitTests
|
||||||
{
|
{
|
||||||
public class BaseUrlMapRepositoryTests
|
public class HostUrlMapRepositoryTests
|
||||||
{
|
{
|
||||||
private string _upstreamBaseUrl;
|
private string _upstreamBaseUrl;
|
||||||
private string _downstreamBaseUrl;
|
private string _downstreamBaseUrl;
|
||||||
private IBaseUrlMapRepository _repository;
|
private IHostUrlMapRepository _repository;
|
||||||
private Response _response;
|
private Response _response;
|
||||||
private Response<BaseUrlMap> _getRouteResponse;
|
private Response<HostUrlMap> _getRouteResponse;
|
||||||
|
|
||||||
public BaseUrlMapRepositoryTests()
|
public HostUrlMapRepositoryTests()
|
||||||
{
|
{
|
||||||
_repository = new InMemoryBaseUrlMapRepository();
|
_repository = new InMemoryHostUrlMapRepository();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@ -66,7 +66,7 @@ namespace Ocelot.UnitTests
|
|||||||
private void ThenTheKeyDoesNotExist()
|
private void ThenTheKeyDoesNotExist()
|
||||||
{
|
{
|
||||||
_getRouteResponse.ShouldNotBeNull();
|
_getRouteResponse.ShouldNotBeNull();
|
||||||
_getRouteResponse.ShouldBeOfType<ErrorResponse<BaseUrlMap>>();
|
_getRouteResponse.ShouldBeOfType<ErrorResponse<HostUrlMap>>();
|
||||||
_getRouteResponse.Errors[0].Message.ShouldBe("This key does not exist");
|
_getRouteResponse.Errors[0].Message.ShouldBe("This key does not exist");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,8 +77,8 @@ namespace Ocelot.UnitTests
|
|||||||
|
|
||||||
private void ThenTheRouteIsReturned()
|
private void ThenTheRouteIsReturned()
|
||||||
{
|
{
|
||||||
_getRouteResponse.Data.DownstreamBaseUrl.ShouldBe(_downstreamBaseUrl);
|
_getRouteResponse.Data.DownstreamHostUrl.ShouldBe(_downstreamBaseUrl);
|
||||||
_getRouteResponse.Data.UpstreamBaseUrl.ShouldBe(_upstreamBaseUrl);
|
_getRouteResponse.Data.UpstreamHostUrl.ShouldBe(_upstreamBaseUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GivenIHaveSetUpAnApiKeyAndUpstreamUrl(string apiKey, string upstreamUrl)
|
private void GivenIHaveSetUpAnApiKeyAndUpstreamUrl(string apiKey, string upstreamUrl)
|
||||||
@ -100,7 +100,7 @@ namespace Ocelot.UnitTests
|
|||||||
|
|
||||||
private void WhenIAddTheConfiguration()
|
private void WhenIAddTheConfiguration()
|
||||||
{
|
{
|
||||||
_response = _repository.AddBaseUrlMap(new BaseUrlMap(_downstreamBaseUrl, _upstreamBaseUrl));
|
_response = _repository.AddBaseUrlMap(new HostUrlMap(_downstreamBaseUrl, _upstreamBaseUrl));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ThenTheResponseIsSuccesful()
|
private void ThenTheResponseIsSuccesful()
|
@ -1,4 +1,4 @@
|
|||||||
using Ocelot.Library.Infrastructure.BaseUrlRepository;
|
using Ocelot.Library.Infrastructure.HostUrlRepository;
|
||||||
using Ocelot.Library.Infrastructure.UrlFinder;
|
using Ocelot.Library.Infrastructure.UrlFinder;
|
||||||
using Ocelot.Library.Infrastructure.Responses;
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
@ -9,28 +9,41 @@ namespace Ocelot.UnitTests
|
|||||||
{
|
{
|
||||||
public class UpstreamBaseUrlFinderTests
|
public class UpstreamBaseUrlFinderTests
|
||||||
{
|
{
|
||||||
private IUpstreamBaseUrlFinder _upstreamBaseUrlFinder;
|
private IUpstreamHostUrlFinder _upstreamBaseUrlFinder;
|
||||||
private IBaseUrlMapRepository _baseUrlMapRepository;
|
private IHostUrlMapRepository _hostUrlMapRepository;
|
||||||
private string _downstreamBaseUrl;
|
private string _downstreamBaseUrl;
|
||||||
private Response<string> _result;
|
private Response<string> _result;
|
||||||
public UpstreamBaseUrlFinderTests()
|
public UpstreamBaseUrlFinderTests()
|
||||||
{
|
{
|
||||||
_baseUrlMapRepository = new InMemoryBaseUrlMapRepository();
|
_hostUrlMapRepository = new InMemoryHostUrlMapRepository();
|
||||||
_upstreamBaseUrlFinder = new UpstreamBaseUrlFinder(_baseUrlMapRepository);
|
_upstreamBaseUrlFinder = new UpstreamHostUrlFinder(_hostUrlMapRepository);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void can_find_base_url()
|
public void can_find_base_url()
|
||||||
{
|
{
|
||||||
GivenTheBaseUrlMapExists(new BaseUrlMap("api.tom.com", "api.laura.com"));
|
GivenTheBaseUrlMapExists(new HostUrlMap("api.tom.com", "api.laura.com"));
|
||||||
GivenTheDownstreamBaseUrlIs("api.tom.com");
|
GivenTheDownstreamBaseUrlIs("api.tom.com");
|
||||||
WhenIFindTheMatchingUpstreamBaseUrl();
|
WhenIFindTheMatchingUpstreamBaseUrl();
|
||||||
ThenTheFollowingIsReturned("api.laura.com");
|
ThenTheFollowingIsReturned("api.laura.com");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GivenTheBaseUrlMapExists(BaseUrlMap baseUrlMap)
|
[Fact]
|
||||||
|
public void cant_find_base_url()
|
||||||
{
|
{
|
||||||
_baseUrlMapRepository.AddBaseUrlMap(baseUrlMap);
|
GivenTheDownstreamBaseUrlIs("api.tom.com");
|
||||||
|
WhenIFindTheMatchingUpstreamBaseUrl();
|
||||||
|
ThenAnErrorIsReturned();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ThenAnErrorIsReturned()
|
||||||
|
{
|
||||||
|
_result.Errors.Count.ShouldBe(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GivenTheBaseUrlMapExists(HostUrlMap baseUrlMap)
|
||||||
|
{
|
||||||
|
_hostUrlMapRepository.AddBaseUrlMap(baseUrlMap);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,7 +54,7 @@ namespace Ocelot.UnitTests
|
|||||||
|
|
||||||
private void WhenIFindTheMatchingUpstreamBaseUrl()
|
private void WhenIFindTheMatchingUpstreamBaseUrl()
|
||||||
{
|
{
|
||||||
_result = _upstreamBaseUrlFinder.FindUpstreamBaseUrl(_downstreamBaseUrl);
|
_result = _upstreamBaseUrlFinder.FindUpstreamHostUrl(_downstreamBaseUrl);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user