Archived

This topic is now archived and is closed to further replies.

xfallenangelx

add-file difficulty

Recommended Posts

Hi There,

i'm using the code below to post a file to the uTorrent WebUI. I get back an error of "The torrent is not valid bencoding". I know the original torrent file is OK (opens in uTorrent when added), and using another page that accepts file uploads (eg. PHP page) and writing the post contents to a file from the PHP page yields the exact same result as the original file, so i do not believe its an uploading problem.

I'm setting the torrent_file parameter as the filename of the file, and uploading the torrent content as file data. Is this what uTorrent API is expecting, or have I misunderstood the parameter?


w = WebRequest.Create("http://" & My.Settings.TorrentServer & ":" & My.Settings.TorrentServerPort & "/gui/?action=add-file&token=" & token)
w.Credentials = credentials
w.CookieContainer = New CookieContainer()
w.CookieContainer.Add(cookies)
Dim uf() As UploadFile
uf = New UploadFile() {New UploadFile(filename)}
Dim params As New Specialized.NameValueCollection()
params.Add("torrent_file", filename)
Using r As HttpWebResponse = HttpUploadHelper.Upload(w, uf, params)
Console.WriteLine(New StreamReader(r.GetResponseStream()).ReadToEnd())
End Using

Share this post


Link to post
Share on other sites

There could be a problem in your UploadFile or HttpUploadHelper classes. Is the data you post a properly crafted multipart/form-data message?

Share this post


Link to post
Share on other sites

This is a chunk of C# that works against uTorrent 3.1.2:


/// <param name="fileName">The name of the torrent file</param>
/// <param name="fileData">The torrent data to send</param>
/// <param name="fileDataBytes">The number of bytes in fileData</param>
public void AddByFile(string fileName, byte[] fileData, int fileDataBytes)
{
// Build targetUri
// Retrieve credentials from cache
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");

HttpWebRequest postFileRequest = (HttpWebRequest)HttpWebRequest.Create(targetUri);
postFileRequest.ContentType = "multipart/form-data; boundary=" + boundary;
postFileRequest.Method = "POST";
postFileRequest.KeepAlive = true;
postFileRequest.Credentials = utorrentCredentials;
postFileRequest.Headers.Add("Cookie", CookieManagerMessageInspector.SharedCookie); // a GUID
postFileRequest.PreAuthenticate = true;
postFileRequest.ServicePoint.Expect100Continue = false;

Stream dataToSend = postFileRequest.GetRequestStream();

byte[] boundarybytes = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
dataToSend.Write(boundarybytes, 0, boundarybytes.Length);

byte[] headerbytes = Encoding.ASCII.GetBytes(string.Format("Content-Disposition: form-data; name=\"torrent_file\"; filename=\"{0}\"\r\nContent-Type: application/x-bittorrent\r\n\r\n", fileName));
dataToSend.Write(headerbytes, 0, headerbytes.Length);

dataToSend.Write(fileData, 0, fileDataBytes);

byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
dataToSend.Write(trailer, 0, trailer.Length);

try
{
HttpWebResponse response = (HttpWebResponse)postFileRequest.GetResponse();
response.Close();
}
}

There's plenty of online converters to VB around, if you need them. I spent a while in Fiddler comparing the WebUI output to my own, but got there eventually.

Share this post


Link to post
Share on other sites

Good to hear! I figured it'd be easier just to give you the whole function rather than step through bit by bit what could be going wrong, but I'm glad you weren't lazy with the copy-paste button!

Share this post


Link to post
Share on other sites

Hi I tried this code. It doesnt seem to work. It just hangs. I don't know what utorrentCredentials & what CookieManagerMessageInspectector.SharedCookie to put in ?

Private Sub Test

Dim filename As String, fileData As Byte(), fileDataBytes As Integer

webUiUrl = "http://192.168.1.3:2345/gui/"

webUiLogin = "myusername"

webUiPassword = "mypassword"

filename = "G:\Misc\1.torrent"

Dim fr As FileStream = New FileStream(filename, FileMode.Open, FileAccess.Read)

Dim br As BinaryReader = New BinaryReader(fr)

fileDataBytes = New FileInfo(filename).Length

fileData = br.ReadBytes(fileDataBytes)

Dim boundary As String = "---------------------------" & DateTime.Now.Ticks.ToString("x")

Dim postFileRequest As HttpWebRequest = DirectCast(HttpWebRequest.Create(webUiUrl), HttpWebRequest)

postFileRequest.ContentType = "multipart/form-data; boundary=" & boundary

postFileRequest.Method = "POST"

postFileRequest.KeepAlive = True

'postFileRequest.Credentials = utorrentCredentials

'postFileRequest.Headers.Add("Cookie", CookieManagerMessageInspector.SharedCookie)

' a GUID

postFileRequest.PreAuthenticate = True

postFileRequest.ServicePoint.Expect100Continue = False

Dim dataToSend As Stream = postFileRequest.GetRequestStream()

Dim boundarybytes As Byte() = Encoding.ASCII.GetBytes("--" & boundary & vbCr & vbLf)

dataToSend.Write(boundarybytes, 0, boundarybytes.Length)

Dim headerbytes As Byte() = Encoding.ASCII.GetBytes(String.Format("Content-Disposition: form-data; name=""torrent_file""; filename=""{0}""" & vbCr & vbLf & "Content-Type: application/x-bittorrent" & vbCr & vbLf & vbCr & vbLf, fileName))

dataToSend.Write(headerbytes, 0, headerbytes.Length)

dataToSend.Write(fileData, 0, fileDataBytes)

Dim trailer As Byte() = Encoding.ASCII.GetBytes(vbCr & vbLf & "--" & boundary & "--" & vbCr & vbLf)

dataToSend.Write(trailer, 0, trailer.Length)

Try

Dim response As HttpWebResponse = DirectCast(postFileRequest.GetResponse(), HttpWebResponse)

response.Close()

Catch ex As WebException

Debug.Print(ex.Message)

Debug.Print(ex.Status)

End Try

End Sub

Share this post


Link to post
Share on other sites