Ik ben bezig om een script te schrijven om de configuratie van een specifiek apparaat aan te passen.
Nu was dit gelukt in de quick and dirty manier, alleen bleek dit later niet lekker te werken op HTTPS.
Nu ben ik opnieuw begonnen, en het meteen in een class gegoten, maar ik krijg het nu helemaal niet meer voor elkaar, terwijl mijn Wireshark identiek is. Ik heb geen verklaring waarom het nu niet werkt.
In Wireshark ziet dit er zo uit:
Dit werkt niet, maar onderstaande Wireshark is een werkende upload via een andere tool (die helaas niet kan wat ik wil).
In mijn ogen geen verschil op `Expect: 100-continue` na, maar als ik deze header toevoeg heeft het geen effect.
De code die wel werkte op HTTP maar niet op HTTPS was:
De huidige volledige class is:
Weet iemand waar het fout gaat want ik zie het helaas niet meer...
Nu was dit gelukt in de quick and dirty manier, alleen bleek dit later niet lekker te werken op HTTPS.
Nu ben ik opnieuw begonnen, en het meteen in een class gegoten, maar ik krijg het nu helemaal niet meer voor elkaar, terwijl mijn Wireshark identiek is. Ik heb geen verklaring waarom het nu niet werkt.
C#:
1
2
3
4
5
6
7
8
9
10
11
| public async Task<string> UploadFile(byte[] fileData, string filename) { using var content = new MultipartFormDataContent(); var fileContent = new ByteArrayContent(fileData); fileContent.Headers.Add("Content-Disposition", $"form-data; name=\"uploadfile\"; filename=\"{filename}\""); fileContent.Headers.Add("Content-Type", "application/octet-stream"); content.Add(fileContent, "uploadfile", filename); using var response = await _httpClient.PostAsync("/cgi-bin/admin/system.cgi", content); return await response.Content.ReadAsStringAsync(); } |
In Wireshark ziet dit er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| OST /cgi-bin/admin/system.cgi HTTP/1.1 Host: 10.10.10.131 Cookie: id=bc923e7b-dccf-468f-9a18-ac43f6332ef3 Content-Type: multipart/form-data; boundary="f1423c9c-1cde-4569-b7ef-f946d4e98960" Content-Length: 10832 --f1423c9c-1cde-4569-b7ef-f946d4e98960 Content-Disposition: form-data; name="uploadfile"; filename="default.cfg" Content-Type: application/octet-stream .. Inhoud bestand ... --f1423c9c-1cde-4569-b7ef-f946d4e98960-- |
Dit werkt niet, maar onderstaande Wireshark is een werkende upload via een andere tool (die helaas niet kan wat ik wil).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| POST /cgi-bin/admin/system.cgi HTTP/1.1 Content-Type: multipart/form-data; boundary=--8dc317af4ecff6f Host: 10.10.10.131 Cookie: id=8cab3145-9843-44d3-a530-d54d623f1290 Content-Length: 11204 Expect: 100-continue ----8dc317af4ecff6f Content-Disposition: form-data; name="uploadfile"; filename="default.cfg" Content-Type: application/octet-stream .. Inhoud bestand ... ----8dc317af4ecff6f-- |
In mijn ogen geen verschil op `Expect: 100-continue` na, maar als ik deze header toevoeg heeft het geen effect.
De code die wel werkte op HTTP maar niet op HTTPS was:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| // TODO: Werkt met HTTP maar niet met HTTPS static void UploadBestand(string apiUrl, string bestandspad, string cookie, string backupContent) { try { // Maak een nieuwe HttpWebRequest HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiUrl); // Negeer alle SSL-fouten ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true; request.AllowAutoRedirect = false; request.Method = "POST"; request.Headers.Add("Cookie", "id=" + cookie); // Boundary creëren voor het scheiden van de bestandsgegevens string boundary = Guid.NewGuid().ToString("N"); request.ContentType = "multipart/form-data; boundary=" + boundary; // Begin de aanvraag schrijven using (Stream requestStream = request.GetRequestStream()) { // Boundary en Content-Disposition voor bestandsinformatie string header = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"uploadfile\"; filename=\"default.cfg\"\r\nContent-Type: application/octet-stream\r\n\r\n"; byte[] headerBytes = System.Text.Encoding.UTF8.GetBytes(header); requestStream.Write(headerBytes, 0, headerBytes.Length); // Multi-line string (backupContent) schrijven naar de aanvraag byte[] backupContentBytes = System.Text.Encoding.UTF8.GetBytes(backupContent); requestStream.Write(backupContentBytes, 0, backupContentBytes.Length); // Boundary toevoegen na de multi-line string byte[] boundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); requestStream.Write(boundaryBytes, 0, boundaryBytes.Length); } // Antwoord ontvangen using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { Console.WriteLine("Status Code: " + response.StatusCode); Console.WriteLine(response.Dump()); } } catch (Exception ex) { Console.WriteLine("Fout bij het uploaden van het bestand: " + ex.Message); } } |
De huidige volledige class is:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
| using Newtonsoft.Json; public class HttpDataFetcher { private readonly HttpClientHandler _handler; private readonly HttpClient _httpClient; public HttpDataFetcher(string hostname) { _handler = new HttpClientHandler() { AllowAutoRedirect = false, ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator }; _httpClient = new HttpClient(_handler); _httpClient.BaseAddress = new Uri(hostname); } public async Task<string> Login(string username, string password, string action, string page) { var loginData = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("username", username), new KeyValuePair<string, string>("password", password), new KeyValuePair<string, string>("action", action), new KeyValuePair<string, string>("page", page) }); var response = await _httpClient.PostAsync("/ajax", loginData); return await response.Content.ReadAsStringAsync(); } public async Task<DeviceInfo> GetDeviceInfo() { var response = await _httpClient.GetAsync("/api/device/info/"); if (response.IsSuccessStatusCode) { var jsonString = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject<DeviceInfo>(jsonString); } else { // TODO: Handel de fout af throw new HttpRequestException($"Error: {response.StatusCode}"); } } public async Task<string> MakeBackup() { var response = await _httpClient.GetAsync("/cgi-bin/admin/ajax?page=backup&action=export"); return await response.Content.ReadAsStringAsync(); } public async Task<string> UploadFile(byte[] fileData) { var multipartFormData = new MultipartFormDataContent(); var fileContent = new ByteArrayContent(fileData); multipartFormData.Add(fileContent, "uploadfile", "default.cfg"); var response = await _httpClient.PostAsync("/cgi-bin/admin/system.cgi", multipartFormData); return await response.Content.ReadAsStringAsync(); } public async Task<string> UploadFile(byte[] fileData, string filename) { using var content = new MultipartFormDataContent(); var fileContent = new ByteArrayContent(fileData); fileContent.Headers.Add("Content-Disposition", $"form-data; name=\"uploadfile\"; filename=\"{filename}\""); fileContent.Headers.Add("Content-Type", "application/octet-stream"); content.Add(fileContent, "uploadfile", filename); using var response = await _httpClient.PostAsync("/cgi-bin/admin/system.cgi", content); return await response.Content.ReadAsStringAsync(); } } |
Weet iemand waar het fout gaat want ik zie het helaas niet meer...
