public AzureMethod(Azure azure) throws CloudException {
    provider = azure;
    ProviderContext ctx = provider.getContext();

    if (ctx == null) {
      throw new AzureConfigException("No context was provided for this request");
    }
    endpoint = ctx.getEndpoint();
    if (endpoint == null) {
      throw new AzureConfigException("No endpoint was provided for this request");
    }
    if (!endpoint.endsWith("/")) {
      endpoint = endpoint + "/";
    }

    this.strategy = provider.getContext().getRequestTrackingStrategy();
  }
  public @Nonnull int getOperationStatus(String requestID)
      throws CloudException, InternalException {
    ProviderContext ctx = provider.getContext();
    Document doc = getAsXML(ctx.getAccountNumber(), "/operations/" + requestID);

    if (doc == null) {
      return -2;
    }

    NodeList entries = doc.getElementsByTagName("Operation");
    Node entry = entries.item(0);

    NodeList s = entry.getChildNodes();

    String status = "";
    String httpCode = "";

    for (int i = 0; i < s.getLength(); i++) {
      Node attribute = s.item(i);
      if (attribute.getNodeType() == Node.TEXT_NODE) {
        continue;
      }
      if (attribute.getNodeName().equalsIgnoreCase("status") && attribute.hasChildNodes()) {
        status = attribute.getFirstChild().getNodeValue().trim();
        continue;
      }
      if (status.length() > 0 && !status.equalsIgnoreCase("inProgress")) {
        if (attribute.getNodeName().equalsIgnoreCase("httpstatuscode")
            && attribute.hasChildNodes()) {
          httpCode = attribute.getFirstChild().getNodeValue().trim();
        }
      }
    }

    if (status.equalsIgnoreCase("succeeded")) {
      return HttpServletResponse.SC_OK;
    } else if (status.equalsIgnoreCase("failed")) {
      String errMsg = checkError(s, httpCode);
      throw new CloudException(errMsg);
    }
    return -1;
  }
  protected @Nonnull HttpClient getClient() throws CloudException, InternalException {
    ProviderContext ctx = provider.getContext();

    if (ctx == null) {
      throw new AzureConfigException("No context was defined for this request");
    }
    String endpoint = ctx.getEndpoint();

    if (endpoint == null) {
      throw new AzureConfigException("No cloud endpoint was defined");
    }
    boolean ssl = endpoint.startsWith("https");
    int targetPort;

    try {
      URI uri = new URI(endpoint);

      targetPort = uri.getPort();
      if (targetPort < 1) {
        targetPort = (ssl ? 443 : 80);
      }
    } catch (URISyntaxException e) {
      throw new AzureConfigException(e);
    }
    HttpParams params = new BasicHttpParams();
    SchemeRegistry registry = new SchemeRegistry();

    try {
      registry.register(
          new Scheme(
              ssl ? "https" : "http",
              targetPort,
              new AzureSSLSocketFactory(new AzureX509(provider))));
    } catch (KeyManagementException e) {
      e.printStackTrace();
      throw new InternalException(e);
    } catch (UnrecoverableKeyException e) {
      e.printStackTrace();
      throw new InternalException(e);
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
      throw new InternalException(e);
    } catch (KeyStoreException e) {
      e.printStackTrace();
      throw new InternalException(e);
    }

    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
    HttpProtocolParams.setUserAgent(params, "Dasein Cloud");
    params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
    params.setParameter(CoreConnectionPNames.SO_TIMEOUT, 300000);

    HttpProxyConfig httpProxyConfig = getHttpProxyConfigData();
    if (httpProxyConfig != null) {
      params.setParameter(
          ConnRoutePNames.DEFAULT_PROXY,
          new HttpHost(httpProxyConfig.getHost(), httpProxyConfig.getPort()));
      registry.register(new Scheme("http", httpProxyConfig.getPort(), new PlainSocketFactory()));
    }

    ClientConnectionManager ccm = new ThreadSafeClientConnManager(registry);

    return new DefaultHttpClient(ccm, params);
  }