diff --git a/SoundCloud.NET/SoundCloudApi.cs b/SoundCloud.NET/SoundCloudApi.cs
index 27d8d87..82a5a6a 100644
--- a/SoundCloud.NET/SoundCloudApi.cs
+++ b/SoundCloud.NET/SoundCloudApi.cs
@@ -20,6 +20,7 @@ You should have received a copy of the GNU General Public License
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
+using System.Linq;
using System.Net;
namespace SoundCloud.NET
@@ -95,7 +96,7 @@ internal class SoundCloudApi : SoundCloudClient
{ ApiCommand.Playlist, new Uri("https://api.soundcloud.com/playlists/{0}.json") },
//Resolver
- { ApiCommand.Resolve, new Uri("https://api.soundcloud.com/resolve.json?url={0}") },
+ { ApiCommand.Resolve, new Uri("https://api.soundcloud.com/resolve?url={0}") },
};
#endregion Private Properties
@@ -113,10 +114,7 @@ internal class SoundCloudApi : SoundCloudClient
/// Parameters format of an api command uri.
public static T ApiAction(ApiCommand command, params object[] parameters)
{
- var uri =
- ApiDictionary[command]
- .With(parameters);
-
+ var uri = ApiDictionary[command].With(parameters);
return ApiAction(uri);
}
@@ -130,12 +128,8 @@ public static T ApiAction(ApiCommand command, params object[] parameters)
/// Parameters format of an api command uri.
public static T ApiAction(ApiCommand command, HttpMethod method, params object[] parameters)
{
- var uri =
- ApiDictionary[command]
- .With(parameters);
-
+ var uri = ApiDictionary[command].With(parameters);
bool requireAuthentication = command != ApiCommand.UserCredentialsFlow;
-
return ApiAction(uri, method, requireAuthentication);
}
@@ -147,11 +141,7 @@ public static T ApiAction(ApiCommand command, HttpMethod method, params objec
/// Dictionnary of parameters to be passed in the api action uri.
public static T ApiAction(ApiCommand command, Dictionary extraParameters)
{
- var uri =
- ApiDictionary[command]
- .UriAppendingParameters(extraParameters);
-
-
+ var uri = ApiDictionary[command].UriAppendingParameters(extraParameters);
return ApiAction(uri);
}
@@ -166,11 +156,7 @@ public static T ApiAction(ApiCommand command, Dictionary extr
///
public static T ApiAction(ApiCommand command, HttpMethod method, Dictionary extraParameters, params object[] parameters)
{
- var uri =
- ApiDictionary[command]
- .UriAppendingParameters(extraParameters)
- .With(parameters);
-
+ var uri = ApiDictionary[command].UriAppendingParameters(extraParameters).With(parameters);
return ApiAction(uri, method);
}
@@ -199,12 +185,15 @@ public static T ApiAction(Uri uri, HttpMethod method = HttpMethod.Get, bool r
api = uri.UriWithAuthorizedUri(SoundCloudAccessToken.AccessToken);
}
- var request = WebRequest.Create(api);
+ var request = (HttpWebRequest)WebRequest.Create(api);
+
+ request.AllowAutoRedirect = false;
request.Method = method.ToString().ToUpperInvariant();
// Force returned type to JSON
request.ContentType = "application/json";
+ request.ContentLength = 0;
//add gzip enabled header
if (EnableGZip) request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
@@ -216,9 +205,25 @@ public static T ApiAction(Uri uri, HttpMethod method = HttpMethod.Get, bool r
{
//OnApiActionExecuting Event
OnApiActionExecuting(EventArgs.Empty);
-
response = (HttpWebResponse)request.GetResponse();
+ //header check for redirects
+ if (response.Headers != null && response.Headers.AllKeys.Contains("Location"))
+ {
+ //got a location url 302
+ var loc = response.Headers["Location"];
+ if (!string.IsNullOrEmpty(loc))
+ {
+ if (!string.IsNullOrEmpty(loc.Trim()))
+ {
+ uri = new Uri(loc);
+ return ApiAction(uri, method, requireAuthentication);
+ }
+ }
+ }
+
+
+
if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Created)
{
var stream = response.GetResponseStream();
@@ -269,4 +274,4 @@ public static T ApiAction(Uri uri, HttpMethod method = HttpMethod.Get, bool r
#endregion Shared Methods
}
-}
\ No newline at end of file
+}
diff --git a/SoundCloud.NET/SoundCloudException.cs b/SoundCloud.NET/SoundCloudException.cs
index d771e0e..ffbbf3e 100644
--- a/SoundCloud.NET/SoundCloudException.cs
+++ b/SoundCloud.NET/SoundCloudException.cs
@@ -23,6 +23,7 @@ namespace SoundCloud.NET
///
/// Handles SoundCloud api exceptions.
///
+ [Serializable]
public class SoundCloudException : Exception
{
///
diff --git a/SoundCloud.NET/Track.cs b/SoundCloud.NET/Track.cs
index 7145683..b095caf 100644
--- a/SoundCloud.NET/Track.cs
+++ b/SoundCloud.NET/Track.cs
@@ -202,6 +202,16 @@ public static Track GetTrack(int id)
return SoundCloudApi.ApiAction