[ 
https://issues.apache.org/jira/browse/SQOOP-1795?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14224852#comment-14224852
 ] 

Veena Basavaraj commented on SQOOP-1795:
----------------------------------------

[~stanleyxu2005], your proposal on not using getReader() is fine, but we need 
to throw an exception or some information when someone uses it.

How do you intend to accomplish that.?

 Since Request context is the wrapper that is holding  both request and 
response! ( which is another bad thing), There should have been Response 
context).
{code}
  private final HttpServletRequest request;
  private final HttpServletResponse response;
{code}

it is hard to enforce it. Instead if we did inheritance, we can override 
getReader in our code and throw an exception with the right message ( 
Unsupported) or even better delegate to use the getPostData that we will add.

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().

We can actually call it getPostData()m instead of getFirstParameterName


> 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, if the method is NOT called at the 
> first place. You do not know, whether the reading position is at the 
> beginning. 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