Forum Discussion

mmcbride's avatar
mmcbride
Newbie
15 years ago

necessary data rewind wasn't possible

I cannot seem to figure out this problem. I am using AsyncPostFromString to login to a form that only allows posting via username and password. From the traces it appears to work, but I really need the HTML that is returned after a login. GetString always returns the rewind isn't possible error, which I have read on the boards is due to cookies. Since I have the headers for the login I go ahead and construct another http request and just use getString but it always hangs at that point. I'm stumped. If I could get the tcpdump on the roku to collect the full packets it would help, and it would help even more if I understood what the rewind isn't possible message really meant. This code could be totally wrong as I'm still trying to learn. Any help is appreciated.

    http = CreateObject("roUrlTransfer")
port = CreateObject("roMessagePort")
headers = CreateObject("roAssociativeArray")

http.SetPort(port)
http.SetUrl("http://myurl/login")

resp = http.AsyncPostFromString("name=user&password=pass") 'Seems to work but full tcp would help
message = wait(0,http.GetPort())
headers=message.GetResponseHeaders()
for each mes in headers
print mes
next

httptwo = CreateObject("roUrlTransfer")
porttwo = CreateObject("roMessagePort")

httptwo.SetHeaders(headers)
httptwo.SetPort(porttwo)
httptwo.SetUrl("http://myurl/data")

resp=httptwo.GetToString()
messagetwo = wait(0,httptwo.GetPort()) 'Hangs here
print resp

8 Replies

  • GetToString() is synchronous and doesn't return until the transfer is complete, so there's no need to Wait() for an event after calling it. Your code is hanging because httptwo is not raising any events.
  • Thanks, that was definitely a problem. Now I guess my problem is the post or the headers. The post continues to return the rewind message and the second url redirects back to the login page since it doesn't think it is logged in. Does the AsyncPost syntax look correct for a simple post form? Is there a way to increase the packet capture size of tcpdump on the roku or should I dig and try and find an old hub?
  • Chances are, the login via your first roUrlTransfer object is returning a cookie header for the authenticated session, but you're not sending that back in with your httptwo object, so it's appearing as a completely different, unauthenticated session to the server.
  • There is no way to increase the length of a captured packet in the Roku's tcpdump utility.

    You would generally send the cookie via the second request via a cookie as theEndless points out.

    Here's an example:


    request = createObject("roUrlTransfer")
    port = CreateObject("roMessagePort")
    request.setPort(port)

    timeout% = 1000 * 5

    resArray = CreateObject("roArray", 5, false)
    request.setUrl(loginUrl)
    if (request.AsyncGetToString())
    event = wait(timeout%, request.GetPort())
    if type(event) = "roUrlEvent"
    resArray.push(event.GetString())
    resArray.push(event.GetResponseHeadersArray())
    elseif event = invalid
    print "AsyncPostFromString timeout"
    request.AsyncCancel()
    else
    print "AsyncPostFromString unknown event"; event
    endif
    endif

    cookiesArray = CreateObject("roArray", 2, True)
    for each elem in resArray[1]
    for each obj in elem
    if obj = "Set-Cookie" Then
    cookiesArray.push(elem[obj])
    end if
    end for
    end for

    request2 = createObject("roUrlTransfer")
    request2.setPort(port)
    request2.seturl(userDataUrl)

    for each cookie in cookiesArray
    request2.AddHeader("Cookie", cookie)
    end for

    userData = request2.GetToString()




    --Kevin
  • So after looking at a lot of traces I think I have figured out what is going on.

    1. Post to URL A with login credentials. (It is odd because the url I post to from the form action is the same url as the HTML for the login page)
    2. Server responds with a 302 redirect and a set-cookie in the header of response

    I need the cookie from the 302 redirect, but when I look at what is returned I just see the cookies and data from the login page itself. Is that possible to get on the roku?

    The below works and shows the 302 redirect with the Set-Cookie in the header and then loads the proper data page.
    wget --post-data "name=me%40me.com&password=mypassword" http://my.com/login


    If I intentionally send the wrong credentials I get the following headers (GetString was at the top and just returned the full html, I cut it out to save space here):

    Cache-Control
    Cache-Control
    Connection
    Content-Language
    Content-Length
    Content-Type
    Date
    Expires
    Pragma
    Server
    Set-Cookie
    JSESSIONID=495C08A304A500954774853F187668A7; Path=/
    Set-Cookie
    NSC_tvqfsqbtt-bqq2.sfbm.dpn=ffffffffaf16e4f145525d5f4f58455e445a4a4229a0;expires=Sat, 09-Jul-2011 01:41:56 GMT;path=/


    But if I send the correct credentials to the login page I get the following headers (notice no Set-Cookies and GetString doesn't have any data):

    GetString:
    Cache-Control
    Cache-Control
    Date
    Expires
    Pragma
    Server


    Using wget if I send the correct credentials I get the following headers:

    HTTP/1.1 302 Moved Temporarily
    Date: Sat, 09 Jul 2011 01:09:25 GMT
    Server: Apache-Coyote/1.1
    Pragma: no-cache
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Cache-Control: no-cache
    Cache-Control: no-store
    Location: http://me.com/login
    Content-Language: en-US
    Content-Length: 0
    Set-Cookie: JSESSIONID=C65945E3DCDC50F8C03F4B8F93232052; Path=/
    Set-Cookie: sp_user=0a19790307e34bdfsddfasdfdsfasdfb67f51cfade4df306c8c7ca11a9095de88b3997d76ac5875cbf0a49e68dd7c74bd5fef3208b538df6cc214a95514e89d828e6cf7867f03e1fe32acc00ab481fa643d59541cc209c4a87e661a8be9af2616f6e460757f3172deae7f611a84f3a2bdd15e1bac8fcb0cf27ef; Domain=.me.com; Expires=Fri, 7 Oct 2011 01:09:26 GMT; Path=/;
    Set-Cookie: NSC_tvqfsqbtt-bqq2.sfbm.dpn=ffffadffaf16e48045525d5f4f5845fgddfg445a4a4229a0;expires=Sat, 09-Jul-2011 01:24:26 GMT;path=/
    Connection: close
    Content-Type: text/plain; charset=UTF-8


    Once again, any help is appreciated.
  • Okay, once last piece of information. Here are the headers a reported by a good curl session


    < HTTP/1.1 302 Moved Temporarily
    < Date: Sat, 09 Jul 2011 02:40:48 GMT
    < Server: Apache-Coyote/1.1
    < Pragma: no-cache
    < Expires: Thu, 01 Jan 1970 00:00:00 GMT
    < Cache-Control: no-cache
    < Cache-Control: no-store
    < Location: http://me.com/data
    < Content-Language: en-US
    < Content-Length: 0
    < Set-Cookie: JSESSIONID=7388302826082408D7CE2D53B1273C76; Path=/
    < Set-Cookie: sp_user=0a19790307e34bd43d8583e0c7db67f51cfade4df306c8casdfdsf9095de88b3997d76ac5875cbf0a49e68dd7c74bd5fef3208b538df6cc214a95514e89d828e6cf7867f03e1fe32acc00ab481fa643d59541cc209c4a87e661a8be9af2616f6e460757f3172deae7f611a84f3a2b3715e1bac8fcb0cf27ef; Domain=.me.com; Expires=Fri, 7 Oct 2011 02:40:49 GMT; Path=/;
    < Set-Cookie: NSC_tvqfsqbtt-bqq2.sfbm.dpn=ffffffffaf16e49f45525dddddd58455e445a4a4229a0;expires=Sat, 09-Jul-2011 02:55:49 GMT;path=/
    < Connection: close
    < Content-Type: text/plain; charset=UTF-8
    <


    It appears with the roku I can see all the headers until it hits the Location: header. At that point I guess roku goes ahead and does the redirect and the later headers are not able to be read. I need to read those. Is this a bug or is there a way to get it working?

    I can confirm with a lan trace that the AsyncPost is actually working and the returning packet has the proper cookies saying I'm logged in. So the question is why can I not see the headers through code?
  • Wireshark image of packet from Roku. (may have to open in a new window to see the full image)
  • I found a temporary work around so I could finish my app, which is now done, but I doubt the content provider will let me publish it with the work around. Any help on how to read the headers that appear below the Location header in the 302 redirect response?