diff --git a/README.md b/README.md
index e95e4a4..a116a8e 100644
--- a/README.md
+++ b/README.md
@@ -211,6 +211,19 @@ Utilize these tools to validate your JSON schema
## More Examples
+### Add new response type parser
+RestAssured can already parse JSON and XML response bodies, however you are able to overwrite
+these with your own parsing functions or add new parsing functionality.
+```C#
+//Create a method to parse your input
+public static dynamic CsvToJson(string input)
+{
+ // Code to parse csv
+}
+//Then inside main method you add this parser
+RestAssured.AddParser("csv",CsvToJson);
+```
+
### Breaking up a call chain
```C#
//Create a new test suite
diff --git a/src/RA/HttpActionContext.cs b/src/RA/HttpActionContext.cs
index b774fc3..4b73869 100644
--- a/src/RA/HttpActionContext.cs
+++ b/src/RA/HttpActionContext.cs
@@ -165,7 +165,15 @@ private ExecutionContext SetHttpAction(string url, HttpActionType actionType)
public void SetUrl(string url)
{
- if (url.IsEmpty() && _setupContext.Host().IsEmpty())
+ if(!new System.Text.RegularExpressions.Regex(@":[0-9]{1,4}").IsMatch(url) && _setupContext.PortSpecified())
+ {
+ if (new System.Text.RegularExpressions.Regex(@"https?:\/\/").IsMatch(url))
+ url = url.Substring(0, url.IndexOf("/", 8)) + ":3005" + url.Substring(url.IndexOf("/", 8));
+ else
+ url = url.Substring(0, url.IndexOf("/")) + ":3005" + url.Substring(url.IndexOf("/"));
+ }
+
+ if (url.IsEmpty() && _setupContext.Host().IsEmpty())
throw new ArgumentException("url must be provided");
var uri = url.IsNotEmpty()
@@ -175,4 +183,4 @@ public void SetUrl(string url)
_url = uri.OriginalString;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/RA/ResponseContext.cs b/src/RA/ResponseContext.cs
old mode 100644
new mode 100755
index 183743b..0014032
--- a/src/RA/ResponseContext.cs
+++ b/src/RA/ResponseContext.cs
@@ -220,54 +220,83 @@ private void Initialize()
ParseLoad();
}
- private void Parse()
+ ///
+ /// Holds response parser functions
+ ///
+ private static Dictionary> parsers = new Dictionary>()
{
- var contentType = ContentType();
-
- if (contentType.Contains("json"))
- {
- if (!string.IsNullOrEmpty(_content))
+ { "json", delegate(string instr)
{
try
{
- _parsedContent = JObject.Parse(_content);
- return;
+ return JObject.Parse(instr);
}
catch
{
+ try
+ {
+ return JArray.Parse(instr);
+ }
+ catch(Exception e)
+ {
+ throw e;
+ }
}
-
+ }
+ },
+ { "xml", delegate(string instr)
+ {
try
{
- _parsedContent = JArray.Parse(_content);
- return;
+ return XDocument.Parse(instr);
}
- catch
+ catch(Exception e)
{
+ throw e;
}
}
- else
- {
- return;
- }
- }
- else if (contentType.Contains("xml"))
+ },
+ };
+
+ ///
+ /// Adds Parser to allow unsupporter response types to be parsed
+ ///
+ /// Content-Type to use provided function to parse
+ /// Function to parse type
+ internal static void AddParser(string type, Func func)
+ {
+ if (parsers.ContainsKey(type))
+ parsers[type] = func;
+ else
+ parsers.Add(type, func);
+ }
+
+ private void Parse()
+ {
+ if (string.IsNullOrEmpty(_content))
+ return;
+
+ var contentType = ContentType();
+
+ foreach (var type in parsers.Keys)
{
- if (!string.IsNullOrEmpty(_content))
+ if (contentType.Contains(type))
{
try
{
- _parsedContent = XDocument.Parse(_content);
+ _parsedContent = parsers[type](_content);
return;
}
catch
{
+ throw new Exception(string.Format("{0} parser failed to build json from data", type));
}
}
+ else
+ {
+ throw new Exception(string.Format("({0}) not supported", contentType));
+ }
}
-
- if (!string.IsNullOrEmpty(_content))
- throw new Exception(string.Format("({0}) not supported", contentType));
}
private void ParseLoad()
@@ -362,4 +391,4 @@ public ResponseContext WriteAssertions()
return this;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/RA/RestAssured.cs b/src/RA/RestAssured.cs
old mode 100644
new mode 100755
index 161407f..21c578d
--- a/src/RA/RestAssured.cs
+++ b/src/RA/RestAssured.cs
@@ -6,5 +6,13 @@ public SetupContext Given()
{
return new SetupContext();
}
+
+ ///
+ /// Adds Parser to allow unsupporter response types to be parsed
+ ///
+ /// Content-Type to use provided function to parse
+ /// Function to parse type
+ internal static void AddParser(string type, System.Func func)
+ => ResponseContext.AddParser(type, func);
}
}
diff --git a/src/RA/SetupContext.cs b/src/RA/SetupContext.cs
index 82783b5..9f10bed 100644
--- a/src/RA/SetupContext.cs
+++ b/src/RA/SetupContext.cs
@@ -91,7 +91,7 @@ public string Host()
return PortSpecified() ? $"{_host}:{_port}":_host;
}
- private bool PortSpecified()
+ internal bool PortSpecified()
{
return _port > 0 && _port != 88;
}