Exemple #1
0
  /**
   * Get方法传送消息
   *
   * @param url 连接的URL
   * @param queryString 请求参数串
   * @return 服务器返回的信息
   * @throws Exception
   */
  public String httpGet(String url, String queryString) throws Exception {

    String responseData = null;
    if (queryString != null && !queryString.equals("")) {
      url += "?" + queryString;
    }
    RequestBuilder requestBuilder = RequestBuilder.get().setUri(url);
    log.info("QHttpClient httpGet [1] url = " + url);
    RequestConfig requestConfig =
        RequestConfig.custom()
            .setSocketTimeout(new Integer(CONNECTION_TIMEOUT))
            .setCookieSpec(CookieSpecs.IGNORE_COOKIES)
            .build();
    requestBuilder.setConfig(requestConfig);
    HttpResponse response;
    HttpGet httpGet = (HttpGet) requestBuilder.build();
    response = httpClient.execute(httpGet);
    try {
      log.info("QHttpClient httpGet [2] StatusLine : " + response.getStatusLine());
      responseData = EntityUtils.toString(response.getEntity());
      log.info("QHttpClient httpGet [3] Response = " + responseData);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      httpGet.abort();
    }
    return responseData;
  }
 public RequestBuilder listTemplates() {
   RequestBuilder requestBuilder = RequestBuilder.get();
   addCommonHeaders(requestBuilder);
   requestBuilder.setUri(
       String.format(
           VMTEMPLATES_RESOURCES,
           this.provider.getContext().getEndpoint(),
           this.provider.getContext().getAccountNumber()));
   return requestBuilder;
 }
 public RequestBuilder listVirtualDisks() {
   RequestBuilder requestBuilder = RequestBuilder.get();
   addCommonHeaders(requestBuilder);
   requestBuilder.setUri(
       String.format(
           VHD_RESOURCES,
           this.provider.getContext().getEndpoint(),
           this.provider.getContext().getAccountNumber()));
   return requestBuilder;
 }
  @Override
  public void logout() {
    final HttpUriRequest logoutGet = RequestBuilder.get().setUri(NYT_LOGOUT_URL).build();

    try (final CloseableHttpResponse getResponse = this.getHttpClient().execute(logoutGet)) {

      // successful NYT logout should give 200 status
      final int responseStatus = getResponse.getStatusLine().getStatusCode();
      if (responseStatus != 200) {
        final String errorMessage =
            String.format("did not detect expected 200, got %d instead", responseStatus);
        throw new LogoutException(errorMessage);
      }

      // successful NYT logout should delete a few cookies like this:
      // Set-Cookie: NYT-S=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/;
      // domain=.nytimes.com

      final Header[] cookies = getResponse.getHeaders("Set-Cookie");

      if (cookies.length < 1) {
        throw new LogoutException("no cookie deletions detected, logout might have failed");
      }

      final Stream<Header> cookieStream = Arrays.stream(cookies);
      final Predicate<Header> deletedCheck = c -> c.getValue().contains("deleted");
      if (!cookieStream.allMatch(deletedCheck)) {
        final List<Header> unexpectedCookies =
            cookieStream.filter(deletedCheck).collect(Collectors.toList());
        LOG.error("unexpected cookies={}", unexpectedCookies);
        throw new LogoutException("unexpected cookie(s) set, loguout might have failed");
      }

      LOG.info("successfully logged out of nyt");
    } catch (IOException | LogoutException e) {
      LOG.error("error while logging out of nyt, e={}", e);
    }
  }
  @Override
  public boolean authenticate() {
    if (!super.authenticate()) {
      LOG.error(
          String.format(
              "blank username or password detected, no %s xword will be downloaded",
              this.getType()));
      return false;
    }

    final HttpUriRequest loginGet = RequestBuilder.get().setUri(NYT_LOGIN_URL).build();

    final String loginPage;
    try (final CloseableHttpResponse getResponse = this.getHttpClient().execute(loginGet)) {
      loginPage = EntityUtils.toString(getResponse.getEntity());
    } catch (final IOException e) {
      LOG.error("error while navigating to NYT login page", e);
      return false;
    }

    final String token;
    final String expires;

    try {
      final TagNode node = this.getCleaner().clean(loginPage);

      final Object[] foundNodes = node.evaluateXPath("//input[@name='token']");
      if (foundNodes.length != 1) {
        this.throwLoginException(
            "unexpected login page, found %d hidden token input elements, expected 1",
            foundNodes.length);
      }
      final TagNode hiddenTokenInput = (TagNode) foundNodes[0];
      token = hiddenTokenInput.getAttributeByName("value");
      LOG.debug("found hidden input token {}", token);

      final Object[] foundExpiresNodes = node.evaluateXPath("//input[@name='expires']");
      if (foundExpiresNodes.length != 1) {
        this.throwLoginException(
            "unexpected login page, found %d hidden token expiration input elements, expected 1",
            foundNodes.length);
      }
      final TagNode hiddenTokenExpiresInput = (TagNode) foundExpiresNodes[0];
      expires = hiddenTokenExpiresInput.getAttributeByName("value");
      LOG.debug("found hidden input token expiration {}", expires);
    } catch (LoginException | XPatherException e) {
      LOG.error("error while pulling login tokens from NYT login page", e);
      return false;
    }

    // @formatter:off
    final HttpUriRequest loginPost =
        RequestBuilder.post()
            .setUri("https://myaccount.nytimes.com/auth/login")
            .addParameter("is_continue", Boolean.FALSE.toString())
            .addParameter("token", token)
            .addParameter("expires", expires)
            .addParameter("userid", this.getLoginInfo().getUsername())
            .addParameter("password", this.getLoginInfo().getPassword())
            .addParameter("remember", Boolean.TRUE.toString())
            .build();
    // @formatter:on

    try (CloseableHttpResponse postResponse = this.getHttpClient().execute(loginPost)) {

      // successful NYT login should give 302 status
      final int responseStatus = postResponse.getStatusLine().getStatusCode();
      if (responseStatus != 302) {
        final String errorMessage =
            String.format("did not detect expected 302 redirect, got %d instead", responseStatus);
        throw new LoginException(errorMessage);
      }

      // successful NYT login redirects to the NYT homepage
      final Header location = postResponse.getFirstHeader("Location");
      // have seen this redirect both with and without the final portion
      final Pattern expectedRedirectLocation =
          Pattern.compile("http://www.nytimes.com(\\?login=email)*");
      final String actualRedirectLocation = location.getValue();
      final Matcher matcher = expectedRedirectLocation.matcher(actualRedirectLocation);
      if (!matcher.matches()) {
        final String errorMessage =
            String.format(
                "redirect to unexpected URL, expected %s, found Location=%s instead",
                expectedRedirectLocation, actualRedirectLocation);
        throw new LoginException(errorMessage);
      }

      // successful NYT login should set a few cookies
      final Header[] cookies = postResponse.getHeaders("Set-Cookie");
      if (cookies.length < 1) {
        throw new LoginException("no post login cookies set, login likely failed");
      }

    } catch (final IOException | LoginException e) {
      LOG.error("error while logging in, e={}", e.getMessage());
      return false;
    }

    LOG.info("successfully logged in to nyt");
    return true;
  }
  /**
   * 设置请求参数<br>
   * 如果想提交一段字符串<br>
   * 那么需要将header中的content-type设置成非application/x-www-form-urlencoded;<br>
   * 将字符串放到postdata中参数名postdata
   *
   * @param method
   * @param postdata
   * @param headers
   * @return
   */
  protected RequestBuilder selectRequestMethod(
      String method, Map<String, String> postdata, Map<String, String> headers) {
    if (method == null || method.equalsIgnoreCase("get")) {
      return RequestBuilder.get();
    } else if (method.equalsIgnoreCase("post")) {
      RequestBuilder requestBuilder = RequestBuilder.post();
      if (postdata != null) {

        String contenttype = "application/x-www-form-urlencoded; charset=UTF-8";
        if (headers != null && headers.size() > 0) {
          for (String ksy : headers.keySet()) {
            if ("Content-Type".equalsIgnoreCase(ksy)) {
              contenttype = headers.get(ksy).toLowerCase().trim();
              break;
            }
          }
        }
        String charset = ""; // 提交数据的传输编码
        if (contenttype.contains("charset")) {
          // 如果在请求的编码中,存在网页编码,那么提取改编码
          String ncharset =
              contenttype.substring(contenttype.lastIndexOf("=") + 1, contenttype.length());
          // 如果提取到的编码合法那么使用该编码
          if (checkCharset(ncharset)) {
            charset = ncharset;
          }
        }

        // 如果编码为空或不存在,在提交数据中提取编码
        if (null == charset || "".equals(charset)) {
          charset = postdata.get("charset"); // 提交数据的传输编码
        }
        if (null == charset || "".equals(charset)) {
          charset = "UTF-8"; // 提交数据的传输编码
        }

        if ("".equals(contenttype) || contenttype.toLowerCase().contains("x-www-form-urlencoded")) {
          List<NameValuePair> formParams = new ArrayList<NameValuePair>();
          for (String str : postdata.keySet()) {
            NameValuePair n = new BasicNameValuePair(str, postdata.get(str));
            formParams.add(n);
          }

          HttpEntity entity = null;
          try {

            entity = new UrlEncodedFormEntity(formParams, charset);
          } catch (UnsupportedEncodingException e) {
            log.error(e.getMessage(), e);
          }
          requestBuilder.setEntity(entity);
        } else {

          log.info("post Content-Type : [ " + contenttype + " ] , pay attention to it .");
          String pstdata = postdata.get("postdata"); // 提交的数据
          if ("".equals(pstdata) || pstdata == null) {
            pstdata = postdata.get(""); // 提交的数据
          }
          if (pstdata == null) {
            pstdata = "";
          }
          StringEntity entity = new StringEntity(pstdata, charset); // 解决中文乱码问题
          entity.setContentEncoding(charset);
          entity.setContentType(contenttype);
          entity.setChunked(true);
          requestBuilder.setEntity(entity);
        }
      } else {
        log.warn("The Method Is Post,But No Post Data .");
      }
      return requestBuilder;
    } else if (method.equalsIgnoreCase("head")) {
      return RequestBuilder.head();
    } else if (method.equalsIgnoreCase("put")) {
      return RequestBuilder.put();
    } else if (method.equalsIgnoreCase("delete")) {
      return RequestBuilder.delete();
    } else if (method.equalsIgnoreCase("trace")) {
      return RequestBuilder.trace();
    }
    throw new IllegalArgumentException("Illegal HTTP Method " + method);
  }
 @Override
 public Page download(Request request, Task task) {
   Site site = null;
   if (task != null) {
     site = task.getSite();
   }
   Set<Integer> acceptStatCode;
   String charset = null;
   Map<String, String> headers = null;
   if (site != null) {
     acceptStatCode = site.getAcceptStatCode();
     charset = site.getCharset();
     headers = site.getHeaders();
   } else {
     acceptStatCode = Sets.newHashSet(200);
   }
   logger.info("downloading page " + request.getUrl());
   RequestBuilder requestBuilder = RequestBuilder.get().setUri(request.getUrl());
   if (headers != null) {
     for (Map.Entry<String, String> headerEntry : headers.entrySet()) {
       requestBuilder.addHeader(headerEntry.getKey(), headerEntry.getValue());
     }
   }
   RequestConfig.Builder requestConfigBuilder =
       RequestConfig.custom()
           .setConnectionRequestTimeout(site.getTimeOut())
           .setSocketTimeout(site.getTimeOut())
           .setConnectTimeout(site.getTimeOut())
           .setCookieSpec(CookieSpecs.BEST_MATCH);
   if (site != null && site.getHttpProxy() != null) {
     requestConfigBuilder.setProxy(site.getHttpProxy());
   }
   requestBuilder.setConfig(requestConfigBuilder.build());
   CloseableHttpResponse httpResponse = null;
   try {
     httpResponse = getHttpClient(site).execute(requestBuilder.build());
     int statusCode = httpResponse.getStatusLine().getStatusCode();
     if (acceptStatCode.contains(statusCode)) {
       // charset
       if (charset == null) {
         String value = httpResponse.getEntity().getContentType().getValue();
         charset = UrlUtils.getCharset(value);
       }
       return handleResponse(request, charset, httpResponse, task);
     } else {
       logger.warn("code error " + statusCode + "\t" + request.getUrl());
       return null;
     }
   } catch (IOException e) {
     logger.warn("download page " + request.getUrl() + " error", e);
     if (site.getCycleRetryTimes() > 0) {
       return addToCycleRetry(request, site);
     }
     return null;
   } finally {
     try {
       if (httpResponse != null) {
         // ensure the connection is released back to pool
         EntityUtils.consume(httpResponse.getEntity());
       }
     } catch (IOException e) {
       logger.warn("close response fail", e);
     }
   }
 }