All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.muserver.rest.JaxRsHttpHeadersAdapter Maven / Gradle / Ivy

The newest version!
package io.muserver.rest;

import io.muserver.HeaderNames;
import io.muserver.Headers;
import jakarta.ws.rs.BadRequestException;
import jakarta.ws.rs.core.Cookie;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.MultivaluedMap;

import java.util.*;

import static java.util.stream.Collectors.toList;

class JaxRsHttpHeadersAdapter implements HttpHeaders {
    private static final List WILDCARD_LOCALES = Collections.singletonList(new Locale("*"));
    private static final List WILDCARD_MEDIA_TYPES = Collections.singletonList(MediaType.WILDCARD_TYPE);
    private final Headers muHeaders;
    private final List muCookies;
    private MultivaluedMap copy;

    JaxRsHttpHeadersAdapter(Headers headers, List cookies) {
        muHeaders = headers;
        muCookies = cookies;
    }


    @Override
    public List getRequestHeader(String name) {
        return getMutableRequestHeaders().get(name);
    }

    @Override
    public String getHeaderString(String name) {
        List vals = getRequestHeader(name);
        if (vals == null) {
            return null;
        }
        return String.join(",", vals);
    }

    @Override
    public MultivaluedMap getRequestHeaders() {
        return ReadOnlyMultivaluedMap.readOnly(getMutableRequestHeaders());
    }

    MultivaluedMap getMutableRequestHeaders() {
        if (copy == null) {
            MultivaluedMap c = new LowercasedMultivaluedHashMap<>();
            for (Map.Entry entry : muHeaders) {
                c.add(entry.getKey(), entry.getValue());
            }
            copy = c;
        }
        return copy;
    }

    @Override
    public List getAcceptableMediaTypes() {
        List mediaTypes = MediaTypeDeterminer.parseAcceptHeaders(muHeaders.getAll(HeaderNames.ACCEPT));
        if (mediaTypes.isEmpty()) {
            return WILDCARD_MEDIA_TYPES;
        }
        return mediaTypes.stream().sorted(MediaTypeDeterminer::compareQValues).collect(toList());
    }

    @Override
    public List getAcceptableLanguages() {
        try {
            return getLocalesFromHeader(HeaderNames.ACCEPT_LANGUAGE, WILDCARD_LOCALES);
        } catch (IllegalArgumentException e) {
            throw new BadRequestException("Invalid accept-language header");
        }
    }

    private List getLocalesFromHeader(CharSequence headerName, List defaultLocales) {
        List all = muHeaders.getAll(headerName);
        if (all.isEmpty()) {
            return defaultLocales;
        }
        return Locale.LanguageRange.parse(String.join(",", all)).stream()
            .map(lr -> {
                String[] range = lr.getRange().split("-");
                switch (range.length) {
                    case 3:
                        return new Locale(range[0], range[1], range[2]);
                    case 2:
                        return new Locale(range[0], range[1]);
                    case 1:
                        return new Locale(range[0]);
                }
                return null;
            })
            .filter(Objects::nonNull)
            .collect(toList());
    }

    @Override
    public MediaType getMediaType() {
        String type = muHeaders.get(HeaderNames.CONTENT_TYPE);
        return type == null ? null : MediaType.valueOf(type);
    }

    @Override
    public Locale getLanguage() {
        List localesFromHeader = getLocalesFromHeader(HeaderNames.CONTENT_LANGUAGE, null);
        return localesFromHeader == null || localesFromHeader.isEmpty() ? null : localesFromHeader.get(0);
    }

    @Override
    public Map getCookies() {
        Map all = new HashMap<>();
        for (io.muserver.Cookie cookie : muCookies) {
            all.put(cookie.name(), new Cookie(cookie.name(), cookie.value()));
        }
        return all;
    }

    @Override
    public Date getDate() {
        long timeMillis = muHeaders.getTimeMillis(HeaderNames.DATE, -1);
        return timeMillis < 0 ? null : new Date(timeMillis);
    }

    @Override
    public int getLength() {
        return muHeaders.getInt(HeaderNames.CONTENT_LENGTH, -1);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy