package org.jenkinsci.plugins.github.webhook; import org.kohsuke.github.GHEvent; import org.kohsuke.stapler.AnnotationHandler; import org.kohsuke.stapler.InjectedParameter; import org.kohsuke.stapler.StaplerRequest; import org.slf4j.Logger; import javax.servlet.ServletException; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.RetentionPolicy.RUNTIME; import static org.apache.commons.lang3.StringUtils.upperCase; import static org.apache.commons.lang3.Validate.isTrue; import static org.slf4j.LoggerFactory.getLogger; /** * InjectedParameter annotation to use on WebMethod parameters. * Handles GitHub's X-GitHub-Event header. * * @author lanwen (Merkushev Kirill) * @see <a href=https://wiki.jenkins-ci.org/display/JENKINS/Web+Method>Web Method</a> */ @Retention(RUNTIME) @Target(PARAMETER) @Documented @InjectedParameter(GHEventHeader.PayloadHandler.class) public @interface GHEventHeader { class PayloadHandler extends AnnotationHandler<GHEventHeader> { /** * @see <a href=https://developer.github.com/webhooks/#delivery-headers>Developer manual</a> */ public static final String EVENT_HEADER = "X-GitHub-Event"; private static final Logger LOGGER = getLogger(PayloadHandler.class); /** * @param type should be combined with type of {@link GHEvent} * * @return parsed {@link GHEvent} or null on empty header or unknown value */ @Override public Object parse(StaplerRequest req, GHEventHeader a, Class type, String param) throws ServletException { isTrue(GHEvent.class.isAssignableFrom(type), "Parameter '%s' should has type %s, not %s", param, GHEvent.class.getName(), type.getName() ); String header = req.getHeader(EVENT_HEADER); LOGGER.debug("Header {} -> {}", EVENT_HEADER, header); if (header == null) { return null; } try { return GHEvent.valueOf(upperCase(header)); } catch (IllegalArgumentException e) { LOGGER.debug("Unknown event - {}", e.getMessage()); return null; } } } }