Skip to content

Commit 0e9149f

Browse files
committed
chore(Assistant V2): Revised service abstraction, added support for POST with no data
1 parent b4c386e commit 0e9149f

File tree

3 files changed

+119
-3
lines changed

3 files changed

+119
-3
lines changed

Scripts/Connection/RESTConnector.cs

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,10 @@ public Request()
214214
/// </summary>
215215
public bool Delete { get; set; }
216216
/// <summary>
217+
/// True to send a post method.
218+
/// </summary>
219+
public bool Post { get; set; }
220+
/// <summary>
217221
/// The name of the function to invoke on the server.
218222
/// </summary>
219223
public string Function { get; set; }
@@ -406,7 +410,7 @@ private IEnumerator ProcessRequestQueue()
406410
Response resp = new Response();
407411

408412
DateTime startTime = DateTime.Now;
409-
if (!req.Delete)
413+
if (!req.Delete && !req.Post)
410414
{
411415
WWW www = null;
412416
if (req.Forms != null)
@@ -549,6 +553,33 @@ private IEnumerator ProcessRequestQueue()
549553

550554
www.Dispose();
551555
}
556+
else if(req.Post)
557+
{
558+
float timeout = Mathf.Max(Constants.Config.Timeout, req.Timeout);
559+
560+
PostRequest postReq = new PostRequest();
561+
Runnable.Run(postReq.Send(url, req.Headers));
562+
while (!postReq.IsComplete)
563+
{
564+
if (req.Cancel)
565+
break;
566+
if ((DateTime.Now - startTime).TotalSeconds > timeout)
567+
break;
568+
yield return null;
569+
}
570+
571+
if (req.Cancel)
572+
continue;
573+
574+
resp.Success = postReq.Success;
575+
resp.Data = postReq.Data;
576+
resp.Error = postReq.Error;
577+
resp.HttpResponseCode = postReq.HttpResponseCode;
578+
resp.ElapsedTime = (float)(DateTime.Now - startTime).TotalSeconds;
579+
resp.Headers = postReq.ResponseHeaders;
580+
if (req.OnResponse != null)
581+
req.OnResponse(req, resp);
582+
}
552583
else
553584
{
554585

@@ -695,6 +726,72 @@ public IEnumerator Send(string url, Dictionary<string, string> headers)
695726
IsComplete = true;
696727
}
697728
};
729+
730+
private class PostRequest
731+
{
732+
public string URL { get; set; }
733+
public Dictionary<string, string> Headers { get; set; }
734+
public bool IsComplete { get; set; }
735+
public bool Success { get; set; }
736+
public long HttpResponseCode { get; set; }
737+
public byte[] Data { get; set; }
738+
public Error Error { get; set; }
739+
public Dictionary<string, string> ResponseHeaders { get; set; }
740+
741+
public IEnumerator Send(string url, Dictionary<string, string> headers)
742+
{
743+
#if ENABLE_DEBUGGING
744+
Log.Debug("PostRequest.Send()", "PostRequest, Send: {0}", url);
745+
#endif
746+
747+
URL = url;
748+
Headers = new Dictionary<string, string>();
749+
foreach (var kp in headers)
750+
{
751+
if (kp.Key != "User-Agent")
752+
Headers[kp.Key] = kp.Value;
753+
}
754+
755+
#if !NETFX_CORE
756+
// This fixes the exception thrown by self-signed certificates.
757+
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
758+
#endif
759+
760+
#if ENABLE_DEBUGGING
761+
Log.Debug("PostRequest.Send()", "PostRequest, ProcessRequest {0}", URL);
762+
#endif
763+
UnityWebRequest postReq = UnityWebRequest.Get(URL);
764+
postReq.method = UnityWebRequest.kHttpVerbPOST;
765+
postReq.downloadHandler = new DownloadHandlerBuffer();
766+
767+
foreach (var kp in Headers)
768+
postReq.SetRequestHeader(kp.Key, kp.Value);
769+
#if UNITY_2017_2_OR_NEWER
770+
yield return postReq.SendWebRequest();
771+
#else
772+
yield return postReq.Send();
773+
#endif
774+
Error error = null;
775+
if (!string.IsNullOrEmpty(postReq.error))
776+
{
777+
error = new Error()
778+
{
779+
URL = url,
780+
ErrorCode = postReq.responseCode,
781+
ErrorMessage = postReq.error,
782+
Response = postReq.downloadHandler.text,
783+
ResponseHeaders = postReq.GetResponseHeaders()
784+
};
785+
}
786+
787+
Success = postReq.responseCode == HTTP_STATUS_OK || postReq.responseCode == HTTP_STATUS_OK || postReq.responseCode == HTTP_STATUS_NO_CONTENT || postReq.responseCode == HTTP_STATUS_ACCEPTED;
788+
HttpResponseCode = postReq.responseCode;
789+
ResponseHeaders = postReq.GetResponseHeaders();
790+
Data = postReq.downloadHandler.data;
791+
Error = error;
792+
IsComplete = true;
793+
}
794+
};
698795
#endregion
699796
}
700797
}

Scripts/Services/Assistant/v2/Assistant.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,10 @@ public bool CreateSession(SuccessCallback<SessionResponse> successCallback, Fail
141141
req.Headers.Add(kvp.Key, kvp.Value);
142142
}
143143
}
144+
req.Headers["Content-Type"] = "application/json";
144145
req.Parameters["version"] = VersionDate;
145146
req.OnResponse = OnCreateSessionResponse;
147+
req.Post = true;
146148

147149
RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format("/v2/assistants/{0}/sessions", assistantId));
148150
if (connector == null)
@@ -244,6 +246,7 @@ public bool DeleteSession(SuccessCallback<object> successCallback, FailCallback
244246
}
245247
req.Parameters["version"] = VersionDate;
246248
req.OnResponse = OnDeleteSessionResponse;
249+
req.Delete = true;
247250

248251
RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format("/v2/assistants/{0}/sessions/{1}", assistantId, sessionId));
249252
if (connector == null)
@@ -346,6 +349,22 @@ public bool Message(SuccessCallback<MessageResponse> successCallback, FailCallba
346349
req.Headers.Add(kvp.Key, kvp.Value);
347350
}
348351
}
352+
353+
IDictionary<string, string> requestDict = new Dictionary<string, string>();
354+
int iterator = 0;
355+
StringBuilder stringBuilder = new StringBuilder("{");
356+
foreach (KeyValuePair<string, string> property in requestDict)
357+
{
358+
string delimeter = iterator < requestDict.Count - 1 ? "," : "";
359+
stringBuilder.Append(string.Format("\"{0}\": {1}{2}", property.Key, property.Value, delimeter));
360+
iterator++;
361+
}
362+
stringBuilder.Append("}");
363+
364+
string stringToSend = stringBuilder.ToString();
365+
366+
req.Send = Encoding.UTF8.GetBytes(stringToSend);
367+
req.Headers["Content-Type"] = "application/json";
349368
req.Parameters["version"] = VersionDate;
350369
req.OnResponse = OnMessageResponse;
351370

Scripts/UnitTests/TestAssistantV2.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class TestAssistantV2 : UnitTest
3737
private fsSerializer _serializer = new fsSerializer();
3838

3939
private Assistant _service;
40-
private string _assistantVersionDate = "2018-09-17";
40+
private string _assistantVersionDate = "2018-09-20";
4141

4242
private string _assistantId;
4343
private string _sessionId;
@@ -77,7 +77,7 @@ public override IEnumerator RunTest()
7777
throw new WatsonException(r.FormattedMessages);
7878

7979
// Set credentials from imported credntials
80-
Credential credential = vcapCredentials.GetCredentialByname("assistantV2-sdk-staging")[0].Credentials;
80+
Credential credential = vcapCredentials.GetCredentialByname("assistant-sdk")[0].Credentials;
8181
_username = credential.Username.ToString();
8282
_password = credential.Password.ToString();
8383
_url = credential.Url.ToString();

0 commit comments

Comments
 (0)