code: def from_http(cls, headers: Mapping[str, str], body: bytes,
                    *, secret: Optional[str] = None) -> "Event":
          
          if "x-hub-signature" in headers:
                  if secret is None:
                      raise ValidationFailure("secret not provided")
                  validate_event(body, signature=headers["x-hub-signature"],
                                 secret=secret)
          elif secret is not None:
              raise ValidationFailure("signature is missing")
  
          try:
              data = _decode_body(headers["content-type"], body, strict=True)
          except (KeyError, ValueError) as exc:
              raise BadRequest(http.HTTPStatus(415),
                               "expected a content-type of "
                               "'application/json' or "
                               "'application/x-www-form-urlencoded'") from exc
          return cls(data, event=headers["x-github-event"],
                     delivery_id=headers["x-github-delivery"])
docs: Construct an event from HTTP headers and JSON body data.
  
          The mapping providing the headers is expected to support lowercase keys.
  
          Since this method assumes the body of the HTTP request is JSON, a check
          is performed for a content-type of "application/json" (GitHub does
          support other content-types). If the content-type does not match,
          BadRequest is raised.
  
          If the appropriate headers are provided for event validation, then it
          will be performed unconditionally. Any failure in validation
          (including not providing a secret) will lead to ValidationFailure being
          raised.