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

Veena Basavaraj edited comment on SQOOP-1795 at 11/25/14 5:23 PM:
------------------------------------------------------------------

[~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 naming, should be renamed to something that 
reflect both are split up to only encapsulate one thing. For a reason the 
HttpServletRequest and HttpServletResponse and not one class that holds the 
both.There should have been Response context).
{code}
  private final HttpServletRequest request;
  private final HttpServletResponse response;
{code}

it may hard to enforce it, but try adding a getReader method to this and throw 
an exception, since there is no easy way to access the HttpServletRequest 
inside the handlers. The ``SqoopProtocolServlet`` still can do it

Alternatively 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

Third,

Also I have seen many cases using this pattern..the API is not solid 
anyways,,,so I am + 1 for changing this to your proposal.

{quote}
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.
{quote}


was (Author: vybs):
[~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

Third,

Also I have seen many cases using this pattern..the API is not solid 
anyways,,,so I am + 1 for changing this to your proposal.

{quote}
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.
{quote}

> 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