[ 
https://issues.apache.org/jira/browse/SQOOP-1795?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Qian Xu updated SQOOP-1795:
---------------------------
    Description: 
Sqoop client posts parameters as JSON to server. As it is not query string 
based pattern, {{HttpServletRequest}} is not able to return the JSON using 
{{getParameterValue(...)}}. The current solution is to call {{getReader()}} to 
get raw post data. There is a danger that if the method is NOT called at the 
first place. As reading position is no longer at the beginning. Consequentially 
you might get unexpected result without notice. 

SQOOP-1784 is a unfortunate case.
{code}
// 2 line unlucky code
String username = ctx.getUserName(); // The method will change reading position 
of reader internally
JSONObject postData = (JSONObject) 
JSONValue.parse(ctx.getRequest().getReader()); // No contents read

// 2 line lucky code
JSONObject postData = (JSONObject) 
JSONValue.parse(ctx.getRequest().getReader()); // Good
String username = ctx.getUserName(); // Good
{code}

In practice, it'd suggest to use query string base pattern, i.e. 
jsonObject=JSON. The server can call {{ctx.getParameterValue("jsonObject")}} to 
get the value without any problem. But we need to change the api.

Now it is perfectly clear:
1. For query string based pattern, caller should always use 
{{getParameterValue(...)}}.
2. For raw post data usage, the post data is parsed as the first parameter's 
key. So I'd suggest to add {{RequestContext.getFirstParameterName()}}. so that 
we can keep fingers away from {{getReader()}}. 

  was:
The situation of dealing with the post data is very tricky IMHO. 
1. {{getRequest().getReader()}} must be called at the first place. As reading 
position cannot be reset, you might get unexpected result without notice. 
SQOOP-1784 is a case of the situation.
2. Sqoop client sends post data as a JSON object rather than query string 
format. Usually it'd suggest to wrap the JSON object as value, and key can be 
named as "jsonObject". The server will call 
{{ctx.getParameterValue("jsonObject")}} to get the value.

I'd suggest to have a {{getRawPostData()}}, so that callers can put finger away 
from {{getReader()}}.


> Sqoop2: Retrieve Http post data in plausible manner
> ---------------------------------------------------
>
>                 Key: SQOOP-1795
>                 URL: https://issues.apache.org/jira/browse/SQOOP-1795
>             Project: Sqoop
>          Issue Type: Sub-task
>            Reporter: Qian Xu
>            Assignee: Qian Xu
>             Fix For: 1.99.5
>
>
> Sqoop client posts parameters as JSON to server. As it is not query string 
> based pattern, {{HttpServletRequest}} is not able to return the JSON using 
> {{getParameterValue(...)}}. The current solution is to call {{getReader()}} 
> to get raw post data. There is a danger that if the method is NOT called at 
> the first place. As reading position is no longer at the beginning. 
> Consequentially you might get unexpected result without notice. 
> SQOOP-1784 is a unfortunate case.
> {code}
> // 2 line unlucky code
> String username = ctx.getUserName(); // The method will change reading 
> position of reader internally
> JSONObject postData = (JSONObject) 
> JSONValue.parse(ctx.getRequest().getReader()); // No contents read
> // 2 line lucky code
> JSONObject postData = (JSONObject) 
> JSONValue.parse(ctx.getRequest().getReader()); // Good
> String username = ctx.getUserName(); // Good
> {code}
> In practice, it'd suggest to use query string base pattern, i.e. 
> jsonObject=JSON. The server can call {{ctx.getParameterValue("jsonObject")}} 
> to get the value without any problem. But we need to change the api.
> Now it is perfectly clear:
> 1. For query string based pattern, caller should always use 
> {{getParameterValue(...)}}.
> 2. For raw post data usage, the post data is parsed as the first parameter's 
> key. So I'd suggest to add {{RequestContext.getFirstParameterName()}}. so 
> that we can keep fingers away from {{getReader()}}. 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to