Thanks, Girish for clearly explaining my concern and everyone for your
inputs.

I have created the ticket ( OFBIZ-10539
<https://issues.apache.org/jira/browse/OFBIZ-10539>). Soon, I will be
providing the solution patch for review.

On Sun, Aug 26, 2018 at 3:36 PM Michael Brohl <michael.br...@ecomify.de>
wrote:

> OFBiz handles multiple request parameters with the same name well if you
> use POST requests.
>
> For GET requests, there seem to be no standard for multiple parameters
> with the same name, see [1]. I thinks it would be good to investigate
> further and see if we can fix this.
>
> I don't see a problem with REST here, the data will most probably
> transferred in some kind of JSON structure.
>
> [1]
>
> https://stackoverflow.com/questions/24059773/correct-way-to-pass-multiple-values-for-same-parameter-name-in-get-request#24728298
>
> Regards,
>
> Michael
>
>
> Am 26.08.18 um 07:09 schrieb Taher Alkhateeb:
> > Hmmm, based on Girish's feedback I think perhaps the next step should be
> to
> > open a JIRA and further investigate. Thinking about it some more, maybe
> > this would have an impact on the REST API project we're working on.
> >
> > On Sun, Aug 26, 2018, 7:57 AM Girish Vasmatkar <
> > girish.vasmat...@hotwaxsystems.com> wrote:
> >
> >> Hi Ritesh
> >>
> >> It does look like an issue to me.
> >>
> >> I believe (correct me if I am wrong) it is not so much about whether
> GET is
> >> appropriate here, it is more about that the framework is unable to
> handle
> >> multiple request parameters with same name, which is a common case when
> we
> >> talk about multiple check boxes on a form representing a single entity.
> The
> >> fact that GET is doing it's job correctly when the user is logged in
> (means
> >> when you change the method from POST to GET and the user is already
> logged
> >> in) and not so much when the user is logged out and the request is made
> via
> >> bookmark, shows that the code is not working properly.
> >>
> >> Then, there is also an issue with URL encoding and decoding that becomes
> >> apparent with executing your scenario. Whether it is correct to change
> the
> >> form method is arguable, but the code should be able to handle it. If a
> >> form were to be designed with GET method and the only elements present
> on
> >> the form are two check boxes and a text field and if you were to select
> >> both check boxes and have value with spaces in the text box, this
> scenario
> >> would still fail.
> >>
> >> I think the simplest approach would have been to just store query string
> >> (request.getQueryString()) in the session attribute instead of Map (but
> I
> >> think it was well pondered upon to use Map) and then just redirecting to
> >> the saved URL once the user loges in. I did it on my local workstation
> and
> >> it just worked perfectly. May be one reason why a map was used instead
> of
> >> storing query string was to handle unencoded requests coming from
> browsers
> >> such as IE. I may be wrong so please correct me if anyone has an idea
> >> around this piece of code as to why Map was used instead of storing the
> >> query string in session to be used later on.
> >>
> >> If you can do something to fix the existing code, that would be better
> >> approach, IMO.
> >>
> >> May be it is not a major issue but certainly worthy of having a
> dedicated
> >> JIRA for. Everybody, please chime in and provide your thoughts.
> >>
> >> Thanks and Best regards,
> >> Girish Vasmatkar
> >> HotWax Systems
> >>
> >> On Sat, Aug 25, 2018 at 8:03 PM Taher Alkhateeb <
> >> slidingfilame...@gmail.com>
> >> wrote:
> >>
> >>> Okay, I understand this issue. I don't think it is possible to
> >>> abstract away a complex search screen with http GET method for
> >>> bookmarks. The performFind service is quite complex and it is
> >>> difficult to replicate the requirements using GET. GET is not designed
> >>> to handle multiple languages, spaces, and other peculiarities that are
> >>> needed for such a screen to work.
> >>>
> >>> There are multiple solutions that I can see here. One of them is
> >>> simply to create a new entity, let's call it SearchFilter, that saves
> >>> search parameters, which can be applied later on. Either way, you need
> >>> to customize, your problem is not OFBiz, your problem is http GET
> >>> limitations.
> >>> On Fri, Aug 24, 2018 at 12:35 PM Ritesh Kumar
> >>> <ritesh.ku...@hotwaxsystems.com> wrote:
> >>>> Using the POST method does not append form data to the URL, i.e, the
> >>>> parameters will not be visible in the URL.
> >>>> For example, take a Find Screen (say, FindWorkEffort) which send data
> >>>> through a form with POST method. Apply some filters (say, status). No
> >>>> applied filters appear in the URL.  Bookmark this page. Next time when
> >> I
> >>>> open this bookmark, those applied filters will not be there as this
> >> page
> >>> is
> >>>> being rendered using data from the URL and since the applied filters
> >> were
> >>>> not there in the bookmarked URL, this page is rendered without the
> >>> applied
> >>>> filters. That is why I used GET form method so that I am able to get
> >> the
> >>>> page with applied filters when I open a bookmarked page.
> >>>>
> >>>> The bug here is (supposing the GET method is used)
> >>>> 1. On opening the bookmark, the page is rendered with double encoding
> >> (if
> >>>> the value had a space character initially, the space character was
> >>> already
> >>>> encoded into '+' in the URL and when this bookmark is opened, this '+'
> >> is
> >>>> again encoded).
> >>>> 2. Suppose the bookmarked URL had multiple values from the same filter
> >>>> (say, Cancelled and Declined status), it renders with just one of the
> >>>> statutes applied. It is because the request handler prepares a Map of
> >>>> parameters from the query string and as is the property of Map to
> >> replace
> >>>> the old value if a new value is being added with the same key (in this
> >>>> example, first Cancelled status is put in this Map and then Declined),
> >>> only
> >>>> Declined status is put in this Map.
> >>>>
> >>>> Hope, this clears the confusion. I will be happy to provide more
> >>>> information if needed.
> >>>>
> >>>> On Fri, Aug 24, 2018 at 1:46 PM Taher Alkhateeb <
> >>> slidingfilame...@gmail.com>
> >>>> wrote:
> >>>>
> >>>>> Not enough information. What happens exactly? What is the bug? What
> >> do
> >>> you
> >>>>> mean by it does not let us do that?
> >>>>>
> >>>>> On Fri, Aug 24, 2018, 11:09 AM Ritesh Kumar <
> >>>>> ritesh.ku...@hotwaxsystems.com>
> >>>>> wrote:
> >>>>>
> >>>>>> Hello Taher,
> >>>>>>
> >>>>>> Changing form method to GET is just to make the query parameters
> >>> visible
> >>>>> in
> >>>>>> the URL so that a user is able to bookmark or share it. Using the
> >>> POST
> >>>>>> method does not let us do that.
> >>>>>>
> >>>>>> On Fri, Aug 24, 2018 at 11:54 AM Taher Alkhateeb <
> >>>>>> slidingfilame...@gmail.com>
> >>>>>> wrote:
> >>>>>>
> >>>>>>> Why did you change the method to GET?
> >>>>>>>
> >>>>>>> On Fri, Aug 24, 2018, 9:20 AM Ritesh Kumar <
> >>>>>> ritesh.ku...@hotwaxsystems.com
> >>>>>>> wrote:
> >>>>>>>
> >>>>>>>> Just to put my point more clearly, let me add the steps to
> >>> generate
> >>>>> the
> >>>>>>>> above-mentioned case. Please refer demo-trunk
> >>>>>>>> <https://demo-trunk.ofbiz.apache.org/webtools/control/main>.
> >>>>>>>>
> >>>>>>>> 1. Open this link, FindWorkEffort
> >>>>>>>> <
> >> https://demo-trunk.ofbiz.apache.org/workeffort/control/FindWorkEffort
> >>>>>>> .
> >>>>>>>> Find Work Effort screen will be rendered.
> >>>>>>>> 2. Inspect and change the form method to "GET".
> >>>>>>>> 3. Apply any of the two statuses (say, Cancelled and Declined).
> >>> Click
> >>>>>> on
> >>>>>>>> Find.
> >>>>>>>> 4. Records will be fetched according to the applied filters.
> >>>>>>>> 5. Check the URL. Cancelled and Declined statuses must be there
> >>> in
> >>>>> the
> >>>>>>> URL.
> >>>>>>>> 6. Bookmark this page and log out.
> >>>>>>>> 7. Now, open the bookmark.
> >>>>>>>> 8. The login page will be rendered. Check the URL here. It will
> >>> be
> >>>>> the
> >>>>>>> same
> >>>>>>>> as it was when the page was being bookmarked.
> >>>>>>>> 9. Type in the credentials and log in.
> >>>>>>>> 10. The result may be different. Check the URL. One of the
> >>> statuses
> >>>>> is
> >>>>>>>> gone.
> >>>>>>>>
> >>>>>>>> Due to business requirement, I need to show query parameters in
> >>> the
> >>>>> URL
> >>>>>>> so
> >>>>>>>> that the user is able to bookmark the page. And, we normally
> >>> pass Id
> >>>>> in
> >>>>>>> the
> >>>>>>>> parameters, but, due to some reason, I may have to pass values
> >>> with
> >>>>>> space
> >>>>>>>> characters.
> >>>>>>>>
> >>>>>>>> I hope, this demo puts forth my concern.
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> On Thu, Aug 23, 2018 at 6:27 PM Ritesh Kumar <
> >>>>>>>> ritesh.ku...@hotwaxsystems.com>
> >>>>>>>> wrote:
> >>>>>>>>
> >>>>>>>>> Hello All,
> >>>>>>>>>
> >>>>>>>>> I faced an issue while trying to open a bookmarked page with
> >>> OFBiz.
> >>>>>>>>> Suppose, the URL of this bookmarked page contains a parameter
> >>> with
> >>>>>>>>> multiple values and the value may have space character. The
> >>> query
> >>>>>>> string
> >>>>>>>> in
> >>>>>>>>> the URL looks somewhat like this
> >>>>>>>>>
> >>>>>>>>>
> >>
> "?categoryHierarchy=3%2FCompany+Catalog%2FBrowse+Root%2FCloths%2FMen%2F"&statusId=approved&statusId=created".
> >>>>>>>>> The "%2F" and "+" are encoded value of  "/", a separator and
> >>> space
> >>>>>>>>> character respectively. The status id parameter appears twice
> >>> and
> >>>>> the
> >>>>>>>>> category hierarchy value has space character.
> >>>>>>>>>
> >>>>>>>>> The user is logged out at this instance and this bookmarked
> >>> page is
> >>>>>>>>> opened. Since the user is not logged in, the login page is
> >>>>> rendered.
> >>>>>> I
> >>>>>>>> feed
> >>>>>>>>> in the credentials and the intended URL is hit. Here, I do
> >> not
> >>> get
> >>>>>> the
> >>>>>>>>> required result.
> >>>>>>>>>
> >>>>>>>>> When I check the URL, the parameter with multiple values just
> >>> has
> >>>>> the
> >>>>>>>> last
> >>>>>>>>> value of the list and "+" is encoded into "%2B". The URL now
> >> is
> >>>>>>>>>
> >>
> "?categoryHierarchy=3%2FCompany%2BCatalog%2FBrowse%2BRoot%2FCloths%2FMen%2F"&statusId==created."
> >>>>>>>>> I did some digging and found out that
> >> LoginWorker.checkLogin()
> >>>>> comes
> >>>>>>> into
> >>>>>>>>> action and what it does is that it creates a new session
> >> object
> >>>>>>> (because
> >>>>>>>>> the previous session becomes invalid) and in the session
> >>> object, it
> >>>>>>> puts
> >>>>>>>>> the previous URL parameters. This previous URL parameters are
> >>>>> fetched
> >>>>>>>> using
> >>>>>>>>> UtilHttp.getUrlOnlyParameterMap(request) which internally
> >> calls
> >>>>>>>>> getQueryStringOnlyParameterMap(). This method returns a map
> >> by
> >>>>>> breaking
> >>>>>>>> the
> >>>>>>>>> query string into key and value pair. A map can not have
> >>> duplicate
> >>>>>> keys
> >>>>>>>> (in
> >>>>>>>>> this case removes the approved status) and the value is not
> >>> decoded
> >>>>>>>> before
> >>>>>>>>> putting it into the map ('+' is not decoded). This map is
> >> then
> >>> used
> >>>>>> to
> >>>>>>>>> create an encoded ('+' is encoded into '%2B' ) redirect
> >> target
> >>> and
> >>>>>> then
> >>>>>>>>> callRedirect() is called on this new redirect target, ending
> >> up
> >>>>> with
> >>>>>>>>> unintended URL (inside RequestHandler.doRequest()).
> >>>>>>>>>
> >>>>>>>>> I could resolve this issue by decoding the already encoded
> >>> value
> >>>>>> before
> >>>>>>>>> putting it into the Map and if the key is already present in
> >>> the
> >>>>> Map,
> >>>>>>> it
> >>>>>>>>> must create a list of the values.
> >>>>>>>>>
> >>>>>>>>> Am I missing something or is this really a bug and needs to
> >> be
> >>>>>>> addressed
> >>>>>>>>> OOTB?
> >>>>>>>>> If this is a bug, is proposed solution the right one?
> >>>>>>>>>
> >>>>>>>>> --
> >>>>>>>>> Best,
> >>>>>>>>> Ritesh Kumar
> >>>>>>>>>
> >>>>>>>>>
>
>
>

Reply via email to