Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 18 additions & 8 deletions Src/Recombee.ApiClient/RecombeeClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ public partial class RecombeeClient
readonly byte[] secretTokenBytes;

readonly bool useHttpsAsDefault;
readonly bool isClient;

readonly string hostUri = "rapi.recombee.com";
readonly string clientHostUri = "client-rapi.recombee.com";

readonly int BATCH_MAX_SIZE = 10000; //Maximal number of requests within one batch request

Expand All @@ -31,16 +33,21 @@ public partial class RecombeeClient
/// <param name="databaseId">ID of the database.</param>
/// <param name="secretToken">Corresponding secret token.</param>
/// <param name="useHttpsAsDefault">If true, all requests are sent using HTTPS</param>
public RecombeeClient(string databaseId, string secretToken, bool useHttpsAsDefault = true)
/// <param name="isClient">If true, access the API using client->server communication with the public token as the secretToken instead of using server->server communication with the private token</param>
public RecombeeClient(string databaseId, string secretToken, bool useHttpsAsDefault = true, bool isClient = false)
{
this.databaseId = databaseId;
this.secretTokenBytes = Encoding.ASCII.GetBytes(secretToken);
this.useHttpsAsDefault = useHttpsAsDefault;
this.isClient = isClient;
this.httpClient = createHttpClient();

var envHostUri = Environment.GetEnvironmentVariable("RAPI_URI");
if(envHostUri != null)
this.hostUri = envHostUri;
if (envHostUri != null)
{
this.hostUri = envHostUri;
this.clientHostUri = envHostUri;
}
}

private HttpClient createHttpClient()
Expand Down Expand Up @@ -280,30 +287,33 @@ private string ProcessRequestUri(Request request)
uriBuilder.Query = QueryParameters(request);
AppendHmacParameters(uriBuilder);
uriBuilder.Scheme = (request.EnsureHttps || useHttpsAsDefault) ? "https" : "http";
uriBuilder.Host = hostUri;
uriBuilder.Host = isClient ? clientHostUri : hostUri;
return uriBuilder.ToString();
}

private string QueryParameters(Request request)
{
{
var encodedQueryStringParams = request.QueryParameters().
Select (p => string.Format("{0}={1}", p.Key, WebUtility.UrlEncode(String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", p.Value))));
return string.Join("&", encodedQueryStringParams);
}

private Int32 UnixTimestampNow()
private Int32 UnixTimestampNow()
{
return (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
}
private void AppendHmacParameters(UriBuilder uriBuilder)
{
uriBuilder.Query = StripLeadingQuestionMark(uriBuilder.Query) + (uriBuilder.Query.Length == 0 ? "" : "&") + string.Format("hmac_timestamp={0}",this.UnixTimestampNow());
string timestampParam = isClient ? "frontend_timestamp" : "hmac_timestamp";
string signParam = isClient ? "frontend_sign" : "hmac_sign";

uriBuilder.Query = StripLeadingQuestionMark(uriBuilder.Query) + (uriBuilder.Query.Length == 0 ? "" : "&") + string.Format("{0}={1}",timestampParam,this.UnixTimestampNow());
using(var myhmacsha1 = new HMACSHA1(this.secretTokenBytes))
{
var uriToBeSigned = uriBuilder.Path + uriBuilder.Query;
byte[] hmacBytes = myhmacsha1.ComputeHash(Encoding.ASCII.GetBytes(uriToBeSigned));
string hmacRes = BitConverter.ToString(hmacBytes).Replace("-","");
uriBuilder.Query = StripLeadingQuestionMark(uriBuilder.Query) + string.Format("&hmac_sign={0}",hmacRes);
uriBuilder.Query = StripLeadingQuestionMark(uriBuilder.Query) + string.Format("&{0}={1}",signParam,hmacRes);
}
}
}
Expand Down