linkedin / flashback

mock the internet
BSD 2-Clause "Simplified" License
578 stars 54 forks source link

Unexpected character ('s' (code 115)): was expecting double-quote to start field name #10

Closed Aarskin closed 7 years ago

Aarskin commented 7 years ago

I am attempting to set up Flashback for the first time and ensure the Hello World steps outlined in the README work on my machine.

Unfortunately, the straightforward way of doing this doesn't seem to function correctly. I can clone the repo and start the server no problem. When I attempt to make the action=startFlashback request via Curl, I get the follow exception (making the same request via Postman returns 200 OK)

{
"exceptionClass":"com.linkedin.restli.server.RestLiServiceException",
"message":"com.fasterxml.jackson.core.JsonParseException: **Unexpected character ('s' (code 115)): 
  was expecting double-quote to start field name**\n at [Source: com.linkedin.data.ByteString$ByteArrayVectorInputStream@60edff67; line: 2, column: 4]",
  "stackTrace":"com.linkedin.restli.server.RestLiServiceException [HTTP Status:500]: 
    com.fasterxml.jackson.core.JsonParseException: **Unexpected character ('s' (code 115)): was expecting double-quote to start field name**\n 
    at [Source: com.linkedin.data.ByteString$ByteArrayVectorInputStream@60edff67; line: 2, column: 4]\r\n\t
    at com.linkedin.restli.internal.server.filter.RestLiResponseFilterContextFactory.fromThrowable(RestLiResponseFilterContextFactory.java:109)\r\n\t
    at com.linkedin.restli.internal.server.RestLiCallback.onError(RestLiCallback.java:104)\r\n\t
    at com.linkedin.restli.server.RestLiServer.handleResourceRequest(RestLiServer.java:344)\r\n\t
    at com.linkedin.restli.server.RestLiServer.doHandleRequest(RestLiServer.java:227)\r\n\t
    at com.linkedin.restli.server.BaseRestServer.handleRequest(BaseRestServer.java:61)\r\n\t
    at com.linkedin.restli.server.DelegatingTransportDispatcher.handleRestRequest(DelegatingTransportDispatcher.java:61)\r\n\t
    at com.linkedin.r2.filter.transport.DispatcherRequestFilter.onRestRequest(DispatcherRequestFilter.java:68)\r\n\t
    at com.linkedin.r2.filter.FilterChainIterator$FilterChainRestIterator.doOnRequest(FilterChainIterator.java:131)\r\n\t
    at com.linkedin.r2.filter.FilterChainIterator$FilterChainRestIterator.doOnRequest(FilterChainIterator.java:117)\r\n\t
    at com.linkedin.r2.filter.FilterChainIterator.onRequest(FilterChainIterator.java:57)\r\n\t
    at com.linkedin.r2.filter.transport.ServerQueryTunnelFilter.onRestRequest(ServerQueryTunnelFilter.java:58)\r\n\t
    at com.linkedin.r2.filter.FilterChainIterator$FilterChainRestIterator.doOnRequest(FilterChainIterator.java:131)\r\n\t
    at com.linkedin.r2.filter.FilterChainIterator$FilterChainRestIterator.doOnRequest(FilterChainIterator.java:117)\r\n\t
    at com.linkedin.r2.filter.FilterChainIterator.onRequest(FilterChainIterator.java:57)\r\n\t
    at com.linkedin.r2.filter.message.rest.RestFilter.onRestRequest(RestFilter.java:50)\r\n\t
    at com.linkedin.r2.filter.FilterChainIterator$FilterChainRestIterator.doOnRequest(FilterChainIterator.java:131)\r\n\t
    at com.linkedin.r2.filter.FilterChainIterator$FilterChainRestIterator.doOnRequest(FilterChainIterator.java:117)\r\n\t
    at com.linkedin.r2.filter.FilterChainIterator.onRequest(FilterChainIterator.java:57)\r\n\t
    at com.linkedin.r2.filter.FilterChainImpl.onRestRequest(FilterChainImpl.java:86)\r\n\t
    at com.linkedin.r2.filter.transport.FilterChainDispatcher.handleRestRequest(FilterChainDispatcher.java:70)\r\n\t
    at com.linkedin.r2.transport.http.server.HttpDispatcher.handleRequest(HttpDispatcher.java:95)\r\n\t
    at com.linkedin.r2.transport.http.server.HttpDispatcher.handleRequest(HttpDispatcher.java:70)\r\n\t
    at com.linkedin.r2.transport.http.server.HttpNettyServer$RestHandler.channelRead0(HttpNettyServer.java:173)\r\n\t
    at com.linkedin.r2.transport.http.server.HttpNettyServer$RestHandler.channelRead0(HttpNettyServer.java:136)\r\n\t
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)\r\n\t
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:339)\r\n\t
    at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:32)\r\n\t
    at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:329)\r\n\t
    at io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:36)\r\n\t
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)\r\n\t
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)\r\n\t
    at java.lang.Thread.run(Thread.java:745)\r\n

Caused by: com.linkedin.restli.internal.server.RestLiInternalException: 
    com.fasterxml.jackson.core.JsonParseException: **Unexpected character ('s' (code 115)): was expecting double-quote to start field name**\n 
    at [Source: com.linkedin.data.ByteString$ByteArrayVectorInputStream@60edff67; line: 2, column: 4]\r\n\t
    at com.linkedin.restli.internal.server.util.DataMapUtils.readMap(DataMapUtils.java:103)\r\n\t
    at com.linkedin.restli.internal.server.methods.arguments.ActionArgumentBuilder.extractRequestData(ActionArgumentBuilder.java:67)\r\n\t
    at com.linkedin.restli.internal.server.RestLiMethodInvoker.invoke(RestLiMethodInvoker.java:189)\r\n\t
    at com.linkedin.restli.server.RestLiServer.handleResourceRequest(RestLiServer.java:337)\r\n\t
... 29 more\r\n

Caused by: com.fasterxml.jackson.core.JsonParseException: **Unexpected character ('s' (code 115)): was expecting double-quote to start field name**\n 
    at [Source: com.linkedin.data.ByteString$ByteArrayVectorInputStream@60edff67; line: 2, column: 4]\r\n\t
    at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1487)\r\n\t
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:518)\r\n\t
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:447)\r\n\t
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleOddName(UTF8StreamJsonParser.java:1919)\r\n\t
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._parseName(UTF8StreamJsonParser.java:1617)\r\n\t
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:700)\r\n\t
    at com.linkedin.data.codec.JacksonDataCodec$Parser.parseDataMap(JacksonDataCodec.java:811)\r\n\t
    at com.linkedin.data.codec.JacksonDataCodec$Parser.parse(JacksonDataCodec.java:658)\r\n\t
    at com.linkedin.data.codec.JacksonDataCodec.readMap(JacksonDataCodec.java:287)\r\n\t
    at com.linkedin.restli.internal.common.DataMapConverter.bytesToDataMap(DataMapConverter.java:105)\r\n\t
    at com.linkedin.restli.internal.server.util.DataMapUtils.readMapWithExceptions(DataMapUtils.java:117)\r\n\t
at com.linkedin.restli.internal.server.util.DataMapUtils.readMap(DataMapUtils.java:99)\r\n\t
... 32 more\r\n","status":500}

Here are the formats of the command that I attempted:

curl.exe "http://localhost:1234/admin?action=startFlashback" --data '{"sceneMode": "record","sceneName": "test1","matchRule": "matchEntireRequest","scenePath": "/tmp","proxyHost": "localhost","proxyPo rt": "5555"}'

curl.exe "http://localhost:1234/admin?action=startFlashback" --data "{""sceneMode"": ""record"",""sceneName"": ""test1"",""matchRule"": ""matchEntireRequest"",""scenePath"": ""/tmp"",""proxyHost"": "" localhost"",""proxyPort"": ""5555""}"

curl.exe "http://localhost:1234/admin?action=startFlashback" --data "{sceneMode: record,sceneName: test1,matchRule: matchEntireRequest,scenePath: /tmp,proxyHost: localhost,proxyPort: 5555}"

curl.exe "http://localhost:1234/admin?action=startFlashback" --data "{"sceneMode": "record","sceneName": "test1","matchRule": "matchEntireRequest","scenePath": "/tmp","proxyHost": " localhost","proxyPort": "5555"}"

curl.exe "http://localhost:1234/admin?action=startFlashback" --data '{"sceneMode": "record","sceneName": "test1","matchRule": "matchEntireRequest","scenePath": "/tmp","proxyHost": " localhost","proxyPort": "5555"}'

Note the differences in usage of quotation marks.

I figure this is a powershell formatting issue, but I've used the escape character with no difference - any thoughts?

Probably relevant version information:

Aarskin commented 7 years ago

This was the format that ultimately worked.

curl.exe --% "http://localhost:1234/admin?action=startFlashback" --data "{ \"sceneMode\": \"record\", \"sceneName\": \"test1\", \"matchRule\": \"matchEntireRequest\", \"scenePath\": \"/tmp\", \"proxyHost\": \"localhost\", \"proxyPort\": \"5555\"}"

stutibhavsar commented 6 years ago

@Aarskin I tried my code with the format you shared. But somehow, I am still getting the same error. Following are my lines of code I have tried:

  1. curl -u username:password -H "Content-Type: application/json" -X POST -d "{\"key\":\"abc\", \"name\":\"xyz\"}" "http://hosturl/app/rest/userGroups/"

  2. curl -u username:password -H "Content-Type: application/json" -X POST -d "{""key"":""xyz"",""name"":""abc""}" "http://hosturl/app/rest/userGroups/"

  3. curl -u username:password -H "Content-Type: application/json" -X POST -d "{""key"":""xyz"",""name"":""abc""}" http://hosturl/app/rest/userGroups/

  4. curl -u username:password -H "Content-Type: application/json" -X POST -d "{\"key\":\"abc\", \"name\":\"xyz\"}" http://hosturl/app/rest/userGroups/

  5. curl -u username:password -H 'Content-Type: application/json' -X POST -d '{"\"key":"abc","name":"xyz"\"}' http://hosturl/app/rest/userGroups/

  6. curl -u username:password -H 'Content-Type: application/json' -X POST -d '{"key":"abc","name":"xyz"}' http://hosturl/app/rest/userGroups/

Can you please help me with the correct syntax?

Thanks!

madhurayala commented 5 years ago

I got it working this way...curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic MzUzYjMwaaaM0NDU3NGY1NjUwNDU2ODdlNTM0ZTdkNmE6Mjg2OTI0Njk3ZTYxNWE2NzJhNjQ2YTQ5MzU0NTY0NmM=" -d "{\"user\":{\"emailAddress\":\"test1122@abc.com\"},\" password\":\"abc123\"}" "http://localhost\":8080/oauth2-provider/v1.0/users"