HTTP Socket verhlt sich merkwrdigt

Mal wieder ich :frowning:

ich hab ein Problem mit HTTPSocket, dieser macht nicht was man von ihm erwartet.
Mein Code:

  Dim DS_Url_Login As String = "http://" + txt_url.Text + ":" + txt_port.text + "/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=login&account=" + txt_user.text + "&passwd=" + txt_pw.text + "&session=DownloadStation&format=sid"
  
  msgbox DS_Url_Login
  
  if lb_links.ListCount < 1 then
    
    msgbox "Es sind keine Links vorhanden."
    
  else
    
    Dim http As New HTTPSocket
    Dim result As String = http.get(DS_Url_Login,15)
    result = DefineEncoding(result, Encodings.UTF8)
    Dim jResult As New JSONItem(result)
    msgbox (result)
    
    Dim v As Variant
    v = jResult.Lookup("success", "not found")
    
    If v = "not found" Then
      MsgBox ("Die Diskstation antwortet nicht, eventuell ist die Adresse falsch?")
    Else
      If v = False Then
        MsgBox ("Der Login ist fehlgeschlagen, es wurden falsche Login-Informationen benutzt.")
      End If
      
      If v = True Then
        
        Dim DataItem As JSONItem = jResult.Value("data")
        Dim SiD As String = DataItem.Value("sid")
        
        Dim i as Integer
        msgbox ("SID: " + SiD)
        Dim DS_Link_URL as String = "http://" + txt_url.Text + ":" + txt_port.text + "/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method=create&uri=" + lb_links.Cell(1,0) + "&_sid=" + SiD
        MsgBox (DS_Link_URL)
        
        Dim httpDS As New HTTPSocket
        
        Dim add_result As String = httpDS.get(DS_Link_URL,0)
        add_result = DefineEncoding(result, Encodings.UTF8)
        msgbox add_result
               
      End If
      
    End If
    
  end if
  

So das Problem ist das der zweite HTTPSocket mit DS_Link_URL nicht funktioniert, bzw. er wartet ewig und macht nichts…wenn ich die generierte URL aus der MSG Box kopiere und in den Browser werfe…geht es innerhalb 1-2 Sekunden.

Mach ich da was falsch mit dem Socket?

Ist so eine Socke(t) nicht ansynchron? Schau Dir mal das hier an: http://documentation.xojo.com/index.php/HTTPSocket .

Nun der ist gerade synchron, das Programm wartet auch auf das Ergebnis, aber wie gesagt es tut sich nichts…das Programm bleibt einfach stehen, obwohl dieser aufruf der URL innerhalb von 1-2 Sekunden eine Antwort im Browser hervorruft und der erste Socket (http) antwortet auch recht fix, der zweite (httpDS) bleibt eben hängen und tut nichts…obwohl Link (DS_Link_URL) aus der Msgbox kopiert im Browser super funktioniert…eben deswegen kann ich mir keinen reim auf das verhalten machen…

Mmm ich hab gerade nicht die M√∂glichkeit Deinen Code zu testen, sehe aber dass Du immer MsgBoxen zum Anzeigen von Variablen verwendest. Das w√ľrde ich gerade bei Sockets, Threads oder generell bei irgendwelchen synchronen/assynchronen Verbindungen nicht tun. Verwende daf√ľr besser DebugLog:

http://documentation.xojo.com/index.php/System.DebugLog

Danke f√ľr den Tipp, habe ich gleich mal probiert, das ist auch viel angenehmer da man die Ergebnisse danach nocht hat :), werden die im Build sp√§ter entfernt?

Die URL die generiert wird ist z.B. diese:

http://192.168.192.61:7878/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method=create&uri=http://www.sys-worx.net/download/dlc1.zip &_sid=abNROXWF220hk1420LRN000595

Paste ich die in den Browser, bekomme ich folgendes:

{"success":true}

Warum der HTTPSocket hier nicht reagieren will und unendlich wartet…verstehe ich nicht :frowning:

Okay wenn wir schonmal dabei sind‚Ķ probiere Deinen Link mit dem nachfolgenden Codesnippet und schau nach, was der Server Dir liefert. Wenn hier schon nichts kommt, dann pr√ľfe den Server oder besser Deine lokale Firewall. Schalte diese probeweise mal aus und schau nochmal.

Nächster Punkt: Encode Deine URLs! Ein Leerzeichen oder Sonderzeichen und schon gibt’s falsche Ergebniss geben.

dim so as new HTTPSocket dim r as string r = so.Get(EncodeURLComponent("http://www.google.de"),3) system.DebugLog r

Hm also mit deinem Encode erhlt man keine Antwort von Google. Ohne geht es…

Zum Thema Firewall und Server, es wird im LAN gearbeitet :wink: und es ist ein NAS, da gibt es leider nichts zu berprfen. Das Problem liegt entweder am Code oder Xojo bugt. Die URL, die Xojo erzeugt, funtioniert ja im Browser, auch bekommt der erste HTTPSocket ein Ergebnis.

4:21:34 PM
synoSync Launched
4:21:38 PM
DSUrlLogin: http://192.168.192.61:7878/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=login&account=Sascha&passwd=somePW&session=DownloadStation&format=sid

Result: {"data":{"sid":"RNpgG1UrhzXJQ1420LRN000595"},"success":true}

SID: RNpgG1UrhzXJQ1420LRN000595

DSUrlAdd: http://192.168.192.61:7878/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method=create&uri=http://www.sys-worx.net/download/dlc1.zip
&_sid=RNpgG1UrhzXJQ1420LRN000595

4:21:54 PM
addresult:

4:22:02 PM
synoSync Ended

Hier mal der Output aus dem Debug-Log, wie man sieht Antwortet der erste HTTPSocket mit dem Result, einem JSON, dem ich die SID entnehme und daraus den anderen Link (DSUrlAdd) baue. Dieser ist so auch richtig, wenn ich den in den Browser kopiere, geht er. Wenn der HTTPSocket keinen TimeOut hat, hngt das Programm auch bis in alle ewigkeit…

So langsam habe ich das Gefhl das mit dem HTTPSocket etwas nicht stimmt :frowning:

rufst du das da oben wirklich mit timeout = 0 auf? Hast du da mal 15 oder so probiert?

Auerdem wenn du ein HTTPSocket als Control im Fenster nimmst oder eine eigene Klasse, kannst du im PageReceived event viel mehr Informationen bekommen, zum Beispiel wenn was schief geht.
Oder Umleitung bzw. Login falsch.

Sorry mein Fehler das mit dem EncodeURL. Dann lasses weg. Aber der Socket funktioniert, dann vermute ich eher, das Deine NAS eher eine Session erwartet oder etwas anderes. Ich w√ľrde den HTTP Post auswerten. Auch was Christian soeben gepostet hat macht sinn: Erh√∂he den Timeout!

Nein sonst w√ľrde die URL mit der SID im Browser nicht funtkionieren und ein Success JSON schicken :slight_smile:

[quote=156416:@Christian Schmitz]rufst du das da oben wirklich mit timeout = 0 auf? Hast du da mal 15 oder so probiert?

Außerdem wenn du ein HTTPSocket als Control im Fenster nimmst oder eine eigene Klasse, kannst du im PageReceived event viel mehr Informationen bekommen, zum Beispiel wenn was schief geht.
Oder Umleitung bzw. Login falsch.[/quote]

Hab auch schon 15 Probiert, hat nichts gen√ľtzt, eigene Klasse? Wenn irgendwas falsch w√§r h√§tte ich einen entsprechenden JSON Output :frowning:

mach ein neues Socket Objekt auf und versuche es mit der SID abzurufen. Ich kenne Deine NAS nicht und das lässt sich folglich auch schlecht nach vollziehen. Ich kann Dich in so fern aber beruhigen, dass ich keinerlei Probleme mit dem Socket hier habe…

So das Problem liegt am String, Xojo macht irgendwie etwas komisches…testcode:

  Dim cell as string = lb_links.Cell(1,0)
  
  Dim DSUrlAdd as String ="http://" + txt_url.Text + ":" + txt_port.text + "/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method=create&uri=" + cell + "&_sid=Hkjr3SHbtMlRg1420LRN000595"
  
  Dim DSUrlAdd2 as string = "http://192.168.192.61:7878/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method=create&uri=http://www.sys-worx.net/download/dlc1.zip&_sid=Hkjr3SHbtMlRg1420LRN000595"
  
  System.DebugLog ("DSUrlAdd: " + DSUrlAdd)
  System.DebugLog ("DSUrlAdd2: " + DSUrlAdd2)
  
  Dim addlink As new HTTPSocket
  Dim addresult As String = addlink.get(DSUrlAdd2,15)
  addresult = DefineEncoding(addresult, Encodings.UTF8)
  
  System.DebugLog ("addresult: " + addresult)
  

Benutze ich DSUrlAdd geht es nicht, verwende ich allerdings DSUrlAdd2 geht es.

Die man sieht macht Xojo mit dem String DSUrlAdd irgendwle einen Zeilelumbruch, der nicht da sein d√ľrfte, w√§hrend der DSUrlAdd2 korrekt dargestellt wird‚Ķmit DSUrlAdd2 antwortet das NAS innerhalb 1-2 Sekunden‚Ķ

Scheint also an Xojo zu liegen, die zusammensetzung des Strings oben ist ja korrekt…?

Hat cell wirklich den ‚Äúhttp://www.sys-worx.net/download/dlc1.zip‚ÄĚ? M√∂glicherweise hat es einen Zeilenumbruch am Ende des Strings.

Du bist der Held des Abends :slight_smile: ‚Ķ ich Depp hab die Liste so gef√ľllt:

[code] Dim u As Integer = linksArray.Count-1
For i As Integer = 0 To u

  lb_links.AddRow(linksArray.Value(i) + EndOfLine)
  
Next[/code]

Das EndofLine ist das Problem‚Ķohhhjee :smiley: manchmal sieht man den Wald vor lauter B√§umen nicht xD, komischerweise will er ohne das + EndOfLine nicht, aber mit + ‚Äú‚ÄĚ geht es

jaja nicht immer vorschnell alles auf Xojo schieben… :wink:

Ja mein Fehler ^^ bin halt verwöhnt die Visual-Studio, da kann einem so etwas gar nicht passieren ;), das EndOfLine kam da durch das es vorher eine Textbox war.