xfallenangelx Posted March 22, 2012 Report Share Posted March 22, 2012 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 Link to comment Share on other sites More sharing options...
klor Posted March 22, 2012 Report Share Posted March 22, 2012 There could be a problem in your UploadFile or HttpUploadHelper classes. Is the data you post a properly crafted multipart/form-data message? Link to comment Share on other sites More sharing options...
xfallenangelx Posted March 22, 2012 Author Report Share Posted March 22, 2012 Thanks for the reply. The classes are 3rd party, and are correct, as is the message produced. As previously stated, other handlers are able to get, parse, and reconstruct the data correctly. Link to comment Share on other sites More sharing options...
klor Posted March 22, 2012 Report Share Posted March 22, 2012 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. Link to comment Share on other sites More sharing options...
xfallenangelx Posted March 23, 2012 Author Report Share Posted March 23, 2012 Thanks klor, i'll give it a go and see what happens Link to comment Share on other sites More sharing options...
xfallenangelx Posted March 23, 2012 Author Report Share Posted March 23, 2012 Thanks for the code, i didn't end up using the entire snippet, just blibs and blobs, and have finally got it working thats for the direction Link to comment Share on other sites More sharing options...
klor Posted March 23, 2012 Report Share Posted March 23, 2012 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! Link to comment Share on other sites More sharing options...
nsdan2k Posted March 9, 2013 Report Share Posted March 9, 2013 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 TryEnd Sub Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.