We fixed some of this with Jetty 9.1.x.

There is now a 
ServletUpgradeRequest<http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/websocket/servlet/ServletUpgradeRequest.html>that
is based on HttpServletRequest.
Its directly referenced in
WebSocketCreator.createWebSocket(ServletUpgradeRequest
req, ServletUpgradeResponse
resp)<http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/websocket/servlet/WebSocketCreator.html#createWebSocket(org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest,
org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse)>;

However, its not accessible from within the
Session.getUpgradeRequest()<http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/websocket/api/Session.html#getUpgradeRequest()>
.
Know that UpgradeRequest is the exposed API, unwrapping and digging into
the jetty specifics is not a long term, future-proof approach.

You could do something like this (notice that this only uses java classes +
websocket api classes + junit)

package jetty.websocket;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jetty.websocket.api.util.QuoteUtil;
import org.junit.Test;

public class AcceptLanguagesTest
{
    public static class QualityValue implements Comparable<QualityValue>
    {
        public String value;
        public double quality;

        public QualityValue(String value, double quality)
        {
            this.value = value;
            this.quality = quality;
        }

        @Override
        public int compareTo(QualityValue o)
        {
            return (int)((o.quality * 100) - (this.quality * 100));
        }

        @Override
        public String toString()
        {
            return String.format("%s [quality=%.1f]",value,quality);
        }
    }

    @Test
    public void testAcceptLanguages()
    {
        String acceptLangs = "tr-tr,tr;q=0.8,en-us;q=0.5,en;q=0.3";
        System.out.printf("--] %s%n", acceptLangs);
        List<QualityValue> values = parseQualityValues(acceptLangs);
        for (QualityValue value : values)
        {
            System.out.println(value);
        }
    }

    @Test
    public void testAcceptLanguagesOdd()
    {
        String acceptLangs = "tr-tr,tr;q=0.2,en-us;q=0.9,en;q=0.3";
        System.out.printf("--] %s%n", acceptLangs);
        List<QualityValue> values = parseQualityValues(acceptLangs);
        for (QualityValue value : values)
        {
            System.out.println(value);
        }
    }

    private List<QualityValue> parseQualityValues(String raw)
    {
        List<QualityValue> ret = new ArrayList<>();
        Iterator<String> parts = QuoteUtil.splitAt(raw,",");
        while (parts.hasNext())
        {
            String part = parts.next();
            String value = null;
            double quality = 1.0;
            Iterator<String> qs = QuoteUtil.splitAt(part,";");
            while (qs.hasNext())
            {
                String q = qs.next();
                if (q.startsWith("q"))
                {
                    int idx = q.indexOf('=');
                    if (idx > 0)
                    {
                        quality = Double.parseDouble(q.substring(idx + 1));
                    }
                }
                else
                {
                    value = q;
                }
            }
            if (value == null)
            {
                value = part;
            }
            ret.add(new QualityValue(value,quality));
        }
        Collections.sort(ret);
        return ret;
    }
}

Output from this testcase ...

--] tr-tr,tr;q=0.8,en-us;q=0.5,en;q=0.3
tr-tr [quality=1.0]
tr [quality=0.8]
en-us [quality=0.5]
en [quality=0.3]
--] tr-tr,tr;q=0.2,en-us;q=0.9,en;q=0.3
tr-tr [quality=1.0]
en-us [quality=0.9]
en [quality=0.3]
tr [quality=0.2]


Now, that being said, exposing either a ..

      List<String> UpgradeRequest.getHeaderValues(String name)
or   List<WeightedValue> UpgradeRequest.getWeightedHeaderValues(String name)
or   List<String> UpgradeRequest.getUserLocales()
or   List<WeightedValue> QuoteUtil.parseWeightedValues(String headervalue)

sounds like a reasonable feature / enhancement request.


--
Joakim Erdfelt <[email protected]>
webtide.com <http://www.webtide.com/> - intalio.com/jetty
Expert advice, services and support from from the Jetty & CometD experts
eclipse.org/jetty - cometd.org


On Sat, Dec 28, 2013 at 12:57 PM, Nils Kilden-Pedersen <[email protected]>wrote:

> I wanted to reuse the methods for extracting weighted header values. More
> specifically, I'm trying to get the user locale(s) from the UpgradeRequest
> on websocket creation.
>
>
> On Sat, Dec 28, 2013 at 3:22 PM, Joakim Erdfelt <[email protected]>wrote:
>
>> the org.eclipse.jetty.http.HttpHeader is not exposed by Jetty's
>> WebSocketServlet, what are you trying to do?
>>
>> --
>> Joakim Erdfelt <[email protected]>
>> webtide.com <http://www.webtide.com/> - intalio.com/jetty
>> Expert advice, services and support from from the Jetty & CometD experts
>> eclipse.org/jetty - cometd.org
>>
>>
>> On Sat, Dec 28, 2013 at 5:20 AM, Nils Kilden-Pedersen 
>> <[email protected]>wrote:
>>
>>> Using 9.0.6, I’m referencing HttpHeader in my web socket servlet, but
>>> apparently the http classes are not accessible to the servlet.
>>>
>>> java.lang.ClassNotFoundException: org.eclipse.jetty.http.HttpHeader
>>>
>>> How do I fix this?
>>>
>>> _______________________________________________
>>> jetty-users mailing list
>>> [email protected]
>>> https://dev.eclipse.org/mailman/listinfo/jetty-users
>>>
>>>
>>
>> _______________________________________________
>> jetty-users mailing list
>> [email protected]
>> https://dev.eclipse.org/mailman/listinfo/jetty-users
>>
>>
>
> _______________________________________________
> jetty-users mailing list
> [email protected]
> https://dev.eclipse.org/mailman/listinfo/jetty-users
>
>
_______________________________________________
jetty-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/jetty-users

Reply via email to