shackpank / marsha

Ruby Marshal serializer/deserializer for JS
10 stars 2 forks source link

Error: String not terminated with encoding symbol #2

Open zhongfox opened 9 years ago

zhongfox commented 9 years ago

Can you please look at this one? Im using 0.1.0, thanks! ruby:

2.1.1 :016 >   a = 'BAh7DEkiD3Nlc3Npb25faWQGOgZFRkkiJTI0MGIwNjNiNmU2MWFlOTI5YTUzNTM5NjlhZGE5NWYzBjsAVEkiB2N1BjsARkkiKjY2MTg2ODIsdDEzNjE1NzcwMjVhYjE4YiwsMTU5MDAzMDA4MjkGOwBUSSIPc2lnbmluX3dheQY7AEZpAEkiEV9zaWduX2luX3dheQY7AEZpAEkiDGNhcHRjaGEGOwBGIhkwNGE5YjBhZDc1NDZjZjY1YWQyZEkiEF9jc3JmX3Rva2VuBjsARkkiMTlsczFONGFhQjFxaUdpeHpScUVSYk8vR2NDbFBzUG9WU2Jkd2FaNHlCekU9BjsARkkiGXdhcmRlbi51c2VyLnVzZXIua2V5BjsAVFsISSIJVXNlcgY7AEZbBmkDOv5kSSIZWmd0aU5Fa0docXp5VVd6clVBdlQGOwBU'
 => "BAh7DEkiD3Nlc3Npb25faWQGOgZFRkkiJTI0MGIwNjNiNmU2MWFlOTI5YTUzNTM5NjlhZGE5NWYzBjsAVEkiB2N1BjsARkkiKjY2MTg2ODIsdDEzNjE1NzcwMjVhYjE4YiwsMTU5MDAzMDA4MjkGOwBUSSIPc2lnbmluX3dheQY7AEZpAEkiEV9zaWduX2luX3dheQY7AEZpAEkiDGNhcHRjaGEGOwBGIhkwNGE5YjBhZDc1NDZjZjY1YWQyZEkiEF9jc3JmX3Rva2VuBjsARkkiMTlsczFONGFhQjFxaUdpeHpScUVSYk8vR2NDbFBzUG9WU2Jkd2FaNHlCekU9BjsARkkiGXdhcmRlbi51c2VyLnVzZXIua2V5BjsAVFsISSIJVXNlcgY7AEZbBmkDOv5kSSIZWmd0aU5Fa0docXp5VVd6clVBdlQGOwBU"
2.1.1 :017 > Marshal.load(Base64.decode64(a))
 => {"session_id"=>"240b063b6e61ae929a5353969ada95f3", "cu"=>"6618682,t1361577025ab18b,,15900300829", "signin_way"=>0, "_sign_in_way"=>0, "captcha"=>"04a9b0ad7546cf65ad2d", "_csrf_token"=>"9ls1N4aaB1qiGixzRqERbO/GcClPsPoVSbdwaZ4yBzE=", "warden.user.user.key"=>["User", [6618682], "ZgtiNEkGhqzyUWzrUAvT"]}

node:

> a = 'BAh7DEkiD3Nlc3Npb25faWQGOgZFRkkiJTI0MGIwNjNiNmU2MWFlOTI5YTUzNTM5NjlhZGE5NWYzBjsAVEkiB2N1BjsARkkiKjY2MTg2ODIsdDEzNjE1NzcwMjVhYjE4YiwsMTU5MDAzMDA4MjkGOwBUSSIPc2lnbmluX3dheQY7AEZpAEkiEV9zaWduX2luX3dheQY7AEZpAEkiDGNhcHRjaGEGOwBGIhkwNGE5YjBhZDc1NDZjZjY1YWQyZEkiEF9jc3JmX3Rva2VuBjsARkkiMTlsczFONGFhQjFxaUdpeHpScUVSYk8vR2NDbFBzUG9WU2Jkd2FaNHlCekU9BjsARkkiGXdhcmRlbi51c2VyLnVzZXIua2V5BjsAVFsISSIJVXNlcgY7AEZbBmkDOv5kSSIZWmd0aU5Fa0docXp5VVd6clVBdlQGOwBU'
'BAh7DEkiD3Nlc3Npb25faWQGOgZFRkkiJTI0MGIwNjNiNmU2MWFlOTI5YTUzNTM5NjlhZGE5NWYzBjsAVEkiB2N1BjsARkkiKjY2MTg2ODIsdDEzNjE1NzcwMjVhYjE4YiwsMTU5MDAzMDA4MjkGOwBUSSIPc2lnbmluX3dheQY7AEZpAEkiEV9zaWduX2luX3dheQY7AEZpAEkiDGNhcHRjaGEGOwBGIhkwNGE5YjBhZDc1NDZjZjY1YWQyZEkiEF9jc3JmX3Rva2VuBjsARkkiMTlsczFONGFhQjFxaUdpeHpScUVSYk8vR2NDbFBzUG9WU2Jkd2FaNHlCekU9BjsARkkiGXdhcmRlbi51c2VyLnVzZXIua2V5BjsAVFsISSIJVXNlcgY7AEZbBmkDOv5kSSIZWmd0aU5Fa0docXp5VVd6clVBdlQGOwBU'
> marsha.load(a, 'base64')
Error: String not terminated with encoding symbol (expected 3a or 3b, got 4e), not sure what to do
    at _parseString (/Users/zhonghua/code/work/zhe800_node/node_modules/marsha/index.js:42:15)
    at _identifyNextToken (/Users/zhonghua/code/work/zhe800_node/node_modules/marsha/index.js:81:16)
    at _identifyNextToken (/Users/zhonghua/code/work/zhe800_node/node_modules/marsha/index.js:105:21)
    at _parse (/Users/zhonghua/code/work/zhe800_node/node_modules/marsha/index.js:117:10)
    at Object.module.exports.load (/Users/zhonghua/code/work/zhe800_node/node_modules/marsha/index.js:222:12)
    at repl:1:9
    at REPLServer.self.eval (repl.js:112:21)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:117:20)
    at Interface._onLine (readline.js:202:10)
shackpank commented 9 years ago

Hi @zhongfox thanks for example!

I suspect one of these strings on the ruby side is not ASCII/UTF-8; despite everything in your example containing only ASCII characters the metadata is marshaled, and the approach to parsing differs for the less common cases.

I'll take a look at this over the next few days, but I have limited knowledge of handling conversions between encodings other than the two above on the JS side, and am wary it is a deep rabbit hole. My fallback is that an option (off by default) is made available to treat strings with unrecognised encodings as UTF-8.

vellotis commented 8 years ago

I am facing the exact issue. Error: String not terminated with encoding symbol (expected 3a or 3b, got 69), not sure what to do My base64 is: BAh7CUkiGXdhcmRlbi51c2VyLnVzZXIua2V5BjoGRVRbB1sGaQZJIiIkMmEkMTAkRjEyMlRyL1pJZFhGaWFHV0Y2eUF1dQY7AFRJIhd0ZXJtaW5hbF9yZXR1cm5fdG8GOwBGIg4vdGVybWluYWxJIh13YXJkZW4udXNlci50ZXJtaW5hbC5rZXkGOwBUWwdbBmkB90kiIiQyYSQxMCRDME5jVXd4MEFyOVpBV3hWUi5haWdPBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMVQzcWpXRFAwOHNqTlVva05kQTRTQ0diK3JFYUJ0b0ZsZEI1R1pLcFpQQXc9BjsARg== that ruby deserializes to

{
  "warden.user.user.key"=>[[1], "$2a$10$F122Tr/ZIdXFiaGWF6yAuu"],
  "terminal_return_to"=>"/terminal",
  "warden.user.terminal.key"=>[[247], "$2a$10$C0NcUwx0Ar9ZAWxVR.aigO"],
  "_csrf_token"=>"T3qjWDP08sjNUokNdA4SCGb+rEaBtoFldB5GZKpZPAw="
}

I have no knowledge of ruby marshaling logics. I have once tried to find a spec for that but unsuccesfully. @shackpank do you have any references?

I will try to dig deeper int it.

vellotis commented 8 years ago

https://github.com/instore/node-marshal/ seems to handle it correctly.