code: @Override
      public String invoke(Object connection, String request, int timeout, Map<String,String> headers)
      throws ConnectionException, AdapterException {
          HttpHelper httpHelper = null;
          try {
              // invoke service over http
              // allow users to override
              httpHelper = getHttpHelper(connection);
  
              int connectTimeout = getConnectTimeout();
              if (connectTimeout > 0)
                  httpHelper.setConnectTimeout(connectTimeout);
  
              int readTimeout = getReadTimeout();
              if (readTimeout > 0)
                  httpHelper.setReadTimeout(readTimeout);
  
              httpHelper.setHeaders(headers);
              String response =  httpHelper.post(request);
  
              if (response != null) {
                  int codeThreshold = DEFAULT_RETRY_HTTP_CODE;
                  String retryCodes = getAttributeValueSmart(RETRY_HTTP_CODES);
                  if (retryCodes != null) {
                      try {
                          codeThreshold = Integer.parseInt(retryCodes);
                      }
                      catch (NumberFormatException ex) {} // Use default in this case
                  }
  
                  Response httpResponse = super.getResponse(connection, response);
                  if (httpResponse.getStatusCode() >= codeThreshold)
                      throw new IOException("Server returned HTTP response code: " + httpResponse.getStatusCode());
              }
              return response;
          }
          catch (IOException ex) {
              if (httpHelper != null && httpHelper.getResponse() != null)
                  logResponse(new Response(httpHelper.getResponse()));
              this.logexception(ex.getMessage(), ex);
              throw new ConnectionException(-1, ex.getMessage(), ex);
          }
          catch (Exception ex) {
              this.logexception(ex.getMessage(), ex);
              throw new AdapterException(-1, ex.getMessage(), ex);
          }
          finally {
              if (httpHelper != null) {
                  if (getResponseHeaders() == null)
                      setResponseHeaders(new HashMap<String,String>());
                  getResponseHeaders().putAll(httpHelper.getHeaders());
              }
          }
      }
docs: Performs the work of invoking the Web service. The main reason to
  override this is to control whether error conditions are retryable by
  throwing either ConnectionException (retry) or AdapterException (no retry).
  
  @param connection
  the connection object created in openConnection()
  @param request
  the requestData populated in getRequestData()
  @return object representing the service response