private static Vary determineVariation(Headers responseHeaders, HTTPRequest request) { Headers requestHeaders = request.getAllHeaders(); Optional<String> varyHeader = responseHeaders.getFirstHeaderValue(VARY); Map<String, String> resolvedVaryHeaders = new HashMap<String, String>(); if (varyHeader.isPresent()) { String varyValue = varyHeader.get(); if (varyValue.equals("*")) { return Vary.ALL; } String[] varies = varyValue.split(","); for (String vary : varies) { Optional<String> value = requestHeaders.getFirstHeaderValue(vary); value.ifPresent(s -> resolvedVaryHeaders.put(vary, s)); } } if (request.getChallenge().isPresent() && Boolean.getBoolean("Vary.authorization")) { resolvedVaryHeaders.put(HeaderConstants.AUTHORIZATION, request.getChallenge().get().getIdentifier()); } return new Vary(resolvedVaryHeaders); }
/** * Analyses the headers in the given request to figure out if this {@link Vary variation} matches. * * @param request the request to analyse * @return {@code true} if the request matches the variance. {@code false} if not. */ //todo: cleanup this public boolean matches(final HTTPRequest request) { if (varyHeaders.containsKey("ALL")) return false; Headers headers = request.getAllHeaders(); for (Map.Entry<String, String> varyEntry : varyHeaders.entrySet()) { if (request.getChallenge().isPresent() && varyEntry.getKey().equals(HeaderConstants.AUTHORIZATION)) { if (!request.getChallenge().get().getIdentifier().equals(varyEntry.getValue())) { return false; } } else { List<Header> requestHeaderValue = headers.getHeaders(varyEntry.getKey()); boolean valid = requestHeaderValue.isEmpty() ? varyEntry.getValue() == null : headers.getFirstHeader(varyEntry.getKey()).get().getValue().equals(varyEntry.getValue()); if (!valid) { return false; } } } List<Preference> preferences = new ArrayList<>(); preferences.addAll(headers.getAccept()); preferences.addAll(headers.getAcceptCharset()); preferences.addAll(headers.getAcceptLanguage()); return !(varyHeaders.isEmpty() && !preferences.isEmpty()); }
private void doRequest(HTTPRequest request, HttpURLConnection connection) throws IOException { configureConnection(connection); connection.setRequestMethod(request.getMethod().getMethod()); Headers requestHeaders = request.getAllHeaders(); connection.addRequestProperty(HeaderConstants.USER_AGENT, getConfiguration().getUserAgent()); for (Header header : requestHeaders) { connection.addRequestProperty(header.getName(), header.getValue()); } connection.connect(); writeRequest(request, connection); }
public void write(PrintStream stream, HTTPRequest request) { writeRequestLine(stream, request); Headers all = request.getAllHeaders(); all = all.add(HeaderUtils.toHttpDate("Date", LocalDateTime.now())); all = all.add("Connection", "close"); writeHeaders(stream, all); if (request.hasPayload()) { writeBody(stream, request.getPayload()); } stream.print("\r\n"); stream.flush(); }