package org.apereo.cas.util.http; import java.io.Serializable; import java.net.URL; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apereo.cas.util.EncodingUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; /** * Abstraction for a message that is sent to an http endpoint. * @author Misagh Moayyed * @since 4.1.0 */ public class HttpMessage implements Serializable { private static final long serialVersionUID = 2015460875654586133L; private static final Logger LOGGER = LoggerFactory.getLogger(HttpMessage.class); /** The default asynchronous callbacks enabled. */ private static final boolean DEFAULT_ASYNCHRONOUS_CALLBACKS_ENABLED = true; private final URL url; private final String message; private int responseCode; /** * Whether this message should be sent in an asynchronous fashion. * Default is true. **/ private final boolean asynchronous; /** * The content type for this message once submitted. * Default is {@link MediaType#APPLICATION_FORM_URLENCODED}. **/ private String contentType = MediaType.APPLICATION_FORM_URLENCODED_VALUE; /** * Prepare the sender with a given url and the message to send. * * @param url the url to which the message will be sent. * @param message the message itself. */ public HttpMessage(final URL url, final String message) { this(url, message, DEFAULT_ASYNCHRONOUS_CALLBACKS_ENABLED); } /** * Prepare the sender with a given url and the message to send. * * @param url the url to which the message will be sent. * @param message the message itself. * @param async whether the message should be sent asynchronously. */ public HttpMessage(final URL url, final String message, final boolean async) { this.url = url; this.message = message; this.asynchronous = async; } public boolean isAsynchronous() { return this.asynchronous; } public URL getUrl() { return this.url; } public String getMessage() { return this.formatOutputMessageInternal(this.message); } public String getContentType() { return this.contentType; } public void setContentType(final String type) { this.contentType = type; } public int getResponseCode() { return this.responseCode; } /** * Encodes the message in UTF-8 format in preparation to send. * @param message Message to format and encode * @return The encoded message. */ protected String formatOutputMessageInternal(final String message) { try { return EncodingUtils.urlEncode(message); } catch (final RuntimeException e) { LOGGER.warn(e.getMessage(), e); } return message; } @Override public String toString() { return new ToStringBuilder(this) .append("url", this.url) .append("message", this.message) .append("asynchronous", this.asynchronous) .append("contentType", this.contentType) .append("responseCode", this.responseCode) .toString(); } public void setResponseCode(final int responseCode) { this.responseCode = responseCode; } }