docs: def make_request(self, data, is_json=True):
          """
          Makes a HTTP request to GCM servers with the constructed payload
  
          :param data: return value from construct_payload method
          :raises GCMMalformedJsonException: if malformed JSON request found
          :raises GCMAuthenticationException: if there was a problem with authentication, invalid api key
          :raises GCMConnectionException: if GCM is screwed
          """
  
          # Default Content-Type is
          # application/x-www-form-urlencoded;charset=UTF-8
          if is_json:
              self.headers['Content-Type'] = 'application/json'
  
          if not is_json:
              data = urlencode_utf8(data)
  
          response = requests.post(
              self.url, data=data, headers=self.headers,
              proxies=self.proxy
          )
          # Successful response
          if response.status_code == 200:
              if is_json:
                  response = response.json()
              else:
                  response = response.content
              return response
  
          # Failures
          if response.status_code == 400:
              raise GCMMalformedJsonException(
                  "The request could not be parsed as JSON")
          elif response.status_code == 401:
              raise GCMAuthenticationException(
                  "There was an error authenticating the sender account")
          elif response.status_code == 503:
              raise GCMUnavailableException("GCM service is unavailable")
          else:
              error = "GCM service error: %d" % response.status_code
              raise GCMUnavailableException(error)