@@ -26,30 +26,50 @@ public class IpDataClient : IIpDataClient
2626 /// <summary>The HTTP client</summary>
2727 private readonly IHttpClient _httpClient ;
2828
29+ /// <summary>The API URL builder</summary>
30+ private readonly ApiUrls _apiUrls ;
31+
2932 /// <inheritdoc />
3033 public string ApiKey { get ; }
3134
3235 /// <summary>Initializes a new instance of the <see cref="IpDataClient"/> class.</summary>
3336 /// <param name="apiKey">The API key.</param>
3437 public IpDataClient ( string apiKey )
35- : this ( apiKey , new HttpClientAdapter ( ) )
38+ : this ( apiKey , new HttpClientAdapter ( ) , null )
3639 {
3740 }
3841
3942 /// <summary>Initializes a new instance of the <see cref="IpDataClient"/> class.</summary>
4043 /// <param name="apiKey">The API key.</param>
4144 /// <param name="httpClient">The HTTP client.</param>
4245 public IpDataClient ( string apiKey , HttpClient httpClient )
43- : this ( apiKey , new HttpClientAdapter ( httpClient ) )
46+ : this ( apiKey , new HttpClientAdapter ( httpClient ) , null )
4447 {
4548 }
4649
4750 /// <summary>Initializes a new instance of the <see cref="IpDataClient"/> class.</summary>
4851 /// <param name="apiKey">The API key.</param>
4952 /// <param name="httpClient">The HTTP client.</param>
53+ public IpDataClient ( string apiKey , IHttpClient httpClient )
54+ : this ( apiKey , httpClient , null )
55+ {
56+ }
57+
58+ /// <summary>Initializes a new instance of the <see cref="IpDataClient"/> class with a custom base URL.</summary>
59+ /// <param name="apiKey">The API key.</param>
60+ /// <param name="baseUrl">The base URL (e.g. https://eu-api.ipdata.co for the EU endpoint).</param>
61+ public IpDataClient ( string apiKey , Uri baseUrl )
62+ : this ( apiKey , new HttpClientAdapter ( ) , baseUrl )
63+ {
64+ }
65+
66+ /// <summary>Initializes a new instance of the <see cref="IpDataClient"/> class.</summary>
67+ /// <param name="apiKey">The API key.</param>
68+ /// <param name="httpClient">The HTTP client.</param>
69+ /// <param name="baseUrl">The base URL. Defaults to https://api.ipdata.co when null.</param>
5070 /// <exception cref="ArgumentException">The {nameof(apiKey)} {apiKey} - apiKey</exception>
5171 /// <exception cref="ArgumentNullException">httpClient - The {nameof(httpClient)}</exception>
52- public IpDataClient ( string apiKey , IHttpClient httpClient )
72+ public IpDataClient ( string apiKey , IHttpClient httpClient , Uri baseUrl )
5373 {
5474 if ( string . IsNullOrWhiteSpace ( apiKey ) )
5575 {
@@ -63,6 +83,7 @@ public IpDataClient(string apiKey, IHttpClient httpClient)
6383 $ "The { nameof ( httpClient ) } can't be null") ;
6484
6585 ApiKey = apiKey ;
86+ _apiUrls = new ApiUrls ( baseUrl ) ;
6687 }
6788
6889 /// <inheritdoc />
@@ -72,7 +93,7 @@ public Task<IpInfo> Lookup() =>
7293 /// <inheritdoc />
7394 public async Task < IpInfo > Lookup ( CultureInfo culture )
7495 {
75- var url = ApiUrls . Get ( ApiKey , culture ) ;
96+ var url = _apiUrls . Get ( ApiKey , culture ) ;
7697 var request = new HttpRequestMessage ( HttpMethod . Get , url ) ;
7798 var json = await SendRequestAsync ( _httpClient , request ) . ConfigureAwait ( false ) ;
7899 return _serializer . Deserialize < IpInfo > ( json ) ;
@@ -85,7 +106,7 @@ public Task<IpInfo> Lookup(string ip) =>
85106 /// <inheritdoc />
86107 public async Task < IpInfo > Lookup ( string ip , CultureInfo culture )
87108 {
88- var url = ApiUrls . Get ( ApiKey , ip , culture ) ;
109+ var url = _apiUrls . Get ( ApiKey , ip , culture ) ;
89110 var request = new HttpRequestMessage ( HttpMethod . Get , url ) ;
90111 var json = await SendRequestAsync ( _httpClient , request ) . ConfigureAwait ( false ) ;
91112 return _serializer . Deserialize < IpInfo > ( json ) ;
@@ -94,15 +115,15 @@ public async Task<IpInfo> Lookup(string ip, CultureInfo culture)
94115 /// <inheritdoc />
95116 public Task < string > Lookup ( string ip , Expression < Func < IpInfo , object > > fieldSelector )
96117 {
97- var url = ApiUrls . Get ( ApiKey , ip , fieldSelector ) ;
118+ var url = _apiUrls . Get ( ApiKey , ip , fieldSelector ) ;
98119 var request = new HttpRequestMessage ( HttpMethod . Get , url ) ;
99120 return SendRequestAsync ( _httpClient , request ) ;
100121 }
101122
102123 /// <inheritdoc />
103124 public async Task < IpInfo > Lookup ( string ip , params Expression < Func < IpInfo , object > > [ ] fieldSelectors )
104125 {
105- var url = ApiUrls . Get ( ApiKey , ip , fieldSelectors ) ;
126+ var url = _apiUrls . Get ( ApiKey , ip , fieldSelectors ) ;
106127 var request = new HttpRequestMessage ( HttpMethod . Get , url ) ;
107128 var json = await SendRequestAsync ( _httpClient , request ) . ConfigureAwait ( false ) ;
108129 return _serializer . Deserialize < IpInfo > ( json ) ;
@@ -111,7 +132,7 @@ public async Task<IpInfo> Lookup(string ip, params Expression<Func<IpInfo, objec
111132 /// <inheritdoc />
112133 public async Task < IEnumerable < IpInfo > > Lookup ( IReadOnlyCollection < string > ips )
113134 {
114- var url = ApiUrls . Bulk ( ApiKey ) ;
135+ var url = _apiUrls . Bulk ( ApiKey ) ;
115136 var request = new HttpRequestMessage ( HttpMethod . Post , url )
116137 {
117138 Content = new StringContent ( _serializer . Serialize ( ips ) , Encoding . UTF8 , "application/json" )
@@ -121,10 +142,19 @@ public async Task<IEnumerable<IpInfo>> Lookup(IReadOnlyCollection<string> ips)
121142 return _serializer . Deserialize < IEnumerable < IpInfo > > ( json ) ;
122143 }
123144
145+ /// <inheritdoc />
146+ public async Task < CompanyInfo > Company ( string ip )
147+ {
148+ var url = _apiUrls . Company ( ApiKey , ip ) ;
149+ var request = new HttpRequestMessage ( HttpMethod . Get , url ) ;
150+ var json = await SendRequestAsync ( _httpClient , request ) . ConfigureAwait ( false ) ;
151+ return _serializer . Deserialize < CompanyInfo > ( json ) ;
152+ }
153+
124154 /// <inheritdoc />
125155 public async Task < CarrierInfo > Carrier ( string ip )
126156 {
127- var url = ApiUrls . Carrier ( ApiKey , ip ) ;
157+ var url = _apiUrls . Carrier ( ApiKey , ip ) ;
128158 var request = new HttpRequestMessage ( HttpMethod . Get , url ) ;
129159 var json = await SendRequestAsync ( _httpClient , request ) . ConfigureAwait ( false ) ;
130160 return _serializer . Deserialize < CarrierInfo > ( json ) ;
@@ -133,7 +163,7 @@ public async Task<CarrierInfo> Carrier(string ip)
133163 /// <inheritdoc />
134164 public async Task < AsnInfo > Asn ( string ip )
135165 {
136- var url = ApiUrls . Asn ( ApiKey , ip ) ;
166+ var url = _apiUrls . Asn ( ApiKey , ip ) ;
137167 var request = new HttpRequestMessage ( HttpMethod . Get , url ) ;
138168 var json = await SendRequestAsync ( _httpClient , request ) . ConfigureAwait ( false ) ;
139169 return _serializer . Deserialize < AsnInfo > ( json ) ;
@@ -142,7 +172,7 @@ public async Task<AsnInfo> Asn(string ip)
142172 /// <inheritdoc />
143173 public async Task < Models . TimeZone > TimeZone ( string ip )
144174 {
145- var url = ApiUrls . TimeZone ( ApiKey , ip ) ;
175+ var url = _apiUrls . TimeZone ( ApiKey , ip ) ;
146176 var request = new HttpRequestMessage ( HttpMethod . Get , url ) ;
147177 var json = await SendRequestAsync ( _httpClient , request ) . ConfigureAwait ( false ) ;
148178 return _serializer . Deserialize < Models . TimeZone > ( json ) ;
@@ -151,7 +181,7 @@ public async Task<AsnInfo> Asn(string ip)
151181 /// <inheritdoc />
152182 public async Task < Currency > Currency ( string ip )
153183 {
154- var url = ApiUrls . Currency ( ApiKey , ip ) ;
184+ var url = _apiUrls . Currency ( ApiKey , ip ) ;
155185 var request = new HttpRequestMessage ( HttpMethod . Get , url ) ;
156186 var json = await SendRequestAsync ( _httpClient , request ) . ConfigureAwait ( false ) ;
157187 return _serializer . Deserialize < Currency > ( json ) ;
@@ -160,7 +190,7 @@ public async Task<Currency> Currency(string ip)
160190 /// <inheritdoc />
161191 public async Task < Threat > Threat ( string ip )
162192 {
163- var url = ApiUrls . Threat ( ApiKey , ip ) ;
193+ var url = _apiUrls . Threat ( ApiKey , ip ) ;
164194 var request = new HttpRequestMessage ( HttpMethod . Get , url ) ;
165195 var json = await SendRequestAsync ( _httpClient , request ) . ConfigureAwait ( false ) ;
166196 return _serializer . Deserialize < Threat > ( json ) ;
0 commit comments