@Override public String toString() { StringBuilder builder = new StringBuilder("HTTP/1.1 ").append(status); if (reason != null) builder.append(' ').append(reason); builder.append('\n'); for (String field : headers.keySet()) { for (String value : valuesOrEmpty(headers, field)) { builder.append(field).append(": ").append(value).append('\n'); } } if (body != null) builder.append('\n').append(body); return builder.toString(); }
@Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append(method).append(' ').append(url).append(" HTTP/1.1\n"); for (String field : headers.keySet()) { for (String value : valuesOrEmpty(headers, field)) { builder.append(field).append(": ").append(value).append('\n'); } } if (body != null) { builder.append('\n').append(charset != null ? new String(body, charset) : "Binary data"); } return builder.toString(); }
public String queryLine() { if (queries.isEmpty()) { return ""; } StringBuilder queryBuilder = new StringBuilder(); for (String field : queries.keySet()) { for (String value : valuesOrEmpty(queries, field)) { queryBuilder.append('&'); queryBuilder.append(field); if (value != null) { queryBuilder.append('='); if (!value.isEmpty()) { queryBuilder.append(value); } } } } queryBuilder.deleteCharAt(0); return queryBuilder.insert(0, '?').toString(); }
/** * Returns an immutable copy of the url decoded queries. * * @see Request#url() */ public Map<String, Collection<String>> queries() { Map<String, Collection<String>> decoded = new LinkedHashMap<String, Collection<String>>(); for (String field : queries.keySet()) { Collection<String> decodedValues = new ArrayList<String>(); for (String value : valuesOrEmpty(queries, field)) { if (value != null) { decodedValues.add(urlDecode(value)); } else { decodedValues.add(null); } } decoded.put(urlDecode(field), decodedValues); } return Collections.unmodifiableMap(decoded); }
for (String field : headers.keySet()) { Collection<String> resolvedValues = new ArrayList<String>(); for (String value : valuesOrEmpty(headers, field)) { String resolved = expand(value, unencoded); resolvedValues.add(resolved);
protected void logRequest(String configKey, Level logLevel, Request request) { log(configKey, "---> %s %s HTTP/1.1", request.method(), request.url()); if (logLevel.ordinal() >= Level.HEADERS.ordinal()) { for (String field : request.headers().keySet()) { for (String value : valuesOrEmpty(request.headers(), field)) { log(configKey, "%s: %s", field, value); } } int bodyLength = 0; if (request.body() != null) { bodyLength = request.body().length; if (logLevel.ordinal() >= Level.FULL.ordinal()) { String bodyText = request.charset() != null ? new String(request.body(), request.charset()) : null; log(configKey, ""); // CRLF log(configKey, "%s", bodyText != null ? bodyText : "Binary data"); } } log(configKey, "---> END HTTP (%s-byte body)", bodyLength); } }
protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime) throws IOException { String reason = response.reason() != null && logLevel.compareTo(Level.NONE) > 0 ? " " + response.reason() : ""; log(configKey, "<--- HTTP/1.1 %s%s (%sms)", response.status(), reason, elapsedTime); if (logLevel.ordinal() >= Level.HEADERS.ordinal()) { for (String field : response.headers().keySet()) { for (String value : valuesOrEmpty(response.headers(), field)) { log(configKey, "%s: %s", field, value); } } int bodyLength = 0; if (response.body() != null) { if (logLevel.ordinal() >= Level.FULL.ordinal()) { log(configKey, ""); // CRLF } byte[] bodyData = Util.toByteArray(response.body().asInputStream()); bodyLength = bodyData.length; if (logLevel.ordinal() >= Level.FULL.ordinal() && bodyLength > 0) { log(configKey, "%s", decodeOrDefault(bodyData, UTF_8, "Binary data")); } log(configKey, "<--- END HTTP (%s-byte body)", bodyLength); return Response.create(response.status(), response.reason(), response.headers(), bodyData); } else { log(configKey, "<--- END HTTP (%s-byte body)", bodyLength); } } return response; }