I'm writing a library in C# to help me develop a Windows application. The library uses the Ubuntu One API. I am able to authenticate and can even make requests to get the Quota (access to Account Admin API) and Volumes (so I know I have access to the Files API at least) Here's what I have as my Upload code:
public static void UploadFile(string filename, string filepath)
{
FileStream file = File.OpenRead(filepath);
byte[] bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
RestClient client = UbuntuOneClients.FilesClient();
RestRequest request = UbuntuOneRequests.BaseRequest(Method.PUT);
request.Resource = "/content/~/Ubuntu One/" + filename;
request.AddHeader("Content-Length", bytes.Length.ToString());
request.AddParameter("body", bytes, ParameterType.RequestBody);
client.ExecuteAsync(request, webResponse => UploadComplete(webResponse));
}
Every time I send the request I get an "Unauthorized" response from the server.
For now the "/content/~/Ubuntu One/" is hardcoded, but I checked and it is the location of my root volume. Is there anything that I'm missing?
UbuntuOneClients.FilesClient() starts the url with "https://files.one.ubuntu.com"
UbuntuOneRequests.BaseRequest(Method.{}) is the same requests that I use to send my Quota and Volumes requests, basically just provides all of the parameters needed to authenticate.
EDIT:: Here's the BaseRequest() method:
public static RestRequest BaseRequest(Method method)
{
RestRequest request = new RestRequest(method);
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
request.AddParameter("realm", "");
request.AddParameter("oauth_version", "1.0");
request.AddParameter("oauth_nonce", Guid.NewGuid().ToString());
request.AddParameter("oauth_timestamp", DateTime.Now.ToString());
request.AddParameter("oauth_consumer_key", UbuntuOneRefreshInfo.UbuntuOneInfo.ConsumerKey);
request.AddParameter("oauth_token", UbuntuOneRefreshInfo.UbuntuOneInfo.Token);
request.AddParameter("oauth_signature_method", "PLAINTEXT");
request.AddParameter("oauth_signature", UbuntuOneRefreshInfo.UbuntuOneInfo.Signature);
//request.AddParameter("method", method.ToString());
return request;
}
and the FilesClient() method:
public static RestClient FilesClient()
{
return (new RestClient("https://files.one.ubuntu.com"));
}