// This method is executed in the background thread on our Survey object
 private String uploadSurveyData(String myXML) {
   // Set up communication with the server
   DefaultHttpClient client = new DefaultHttpClient();
   String result = null;
   //
   HttpPost httpPost;
   httpPost =
       new HttpPost(
           "http://YOUR DOMAIN HERE/survey-webApp/index.php/webUser_Controllers/android_controller/save_survey_xml");
   try {
     // Encode the xml, add header and set it to POST request
     StringEntity entity = new StringEntity(myXML, HTTP.UTF_8);
     // entity.setContentType("text/xml");
     httpPost.setEntity(entity);
     // Execute POST request and get response
     HttpResponse response = client.execute(httpPost);
     HttpEntity responseEntity = response.getEntity();
     // System.out.print(EntityUtils.toString(responseEntity));
     // Set up XML parsing objects
     SAXParserFactory spf = SAXParserFactory.newInstance();
     SAXParser sp = spf.newSAXParser();
     XMLReader xr = sp.getXMLReader();
     // Set up an instance of our class to parse the status response
     HttpResponseHandler myResponseHandler = new HttpResponseHandler();
     xr.setContentHandler(myResponseHandler);
     xr.parse(retrieveInputStream(responseEntity));
     // check myResponseHandler for response
     result = myResponseHandler.getStatus();
   } catch (Exception e) {
     result = "Exception - " + e.getMessage();
   }
   return result;
 }
示例#2
0
  /**
   * Responsible for handling an error response, including unmarshalling the error response into the
   * most specific exception type possible, and throwing the exception.
   *
   * @param request The request that generated the error response being handled.
   * @param errorResponseHandler The response handler responsible for unmarshalling the error
   *     response.
   * @param method The HTTP method containing the actual response content.
   * @throws IOException If any problems are encountering reading the error response.
   */
  private AmazonServiceException handleErrorResponse(
      Request<?> request,
      HttpResponseHandler<AmazonServiceException> errorResponseHandler,
      HttpRequestBase method,
      org.apache.http.HttpResponse apacheHttpResponse)
      throws IOException {

    int status = apacheHttpResponse.getStatusLine().getStatusCode();
    HttpResponse response = createResponse(method, request, apacheHttpResponse);
    if (errorResponseHandler.needsConnectionLeftOpen()
        && method instanceof HttpEntityEnclosingRequestBase) {
      HttpEntityEnclosingRequestBase entityEnclosingRequest =
          (HttpEntityEnclosingRequestBase) method;
      response.setContent(new HttpMethodReleaseInputStream(entityEnclosingRequest));
    }

    AmazonServiceException exception = null;
    try {
      exception = errorResponseHandler.handle(response);
      requestLog.debug("Received error response: " + exception.toString());
    } catch (Exception e) {
      // If the errorResponseHandler doesn't work, then check for error
      // responses that don't have any content
      if (status == 413) {
        exception = new AmazonServiceException("Request entity too large");
        exception.setServiceName(request.getServiceName());
        exception.setStatusCode(413);
        exception.setErrorType(ErrorType.Client);
        exception.setErrorCode("Request entity too large");
      } else if (status == 503
          && "Service Unavailable"
              .equalsIgnoreCase(apacheHttpResponse.getStatusLine().getReasonPhrase())) {
        exception = new AmazonServiceException("Service unavailable");
        exception.setServiceName(request.getServiceName());
        exception.setStatusCode(503);
        exception.setErrorType(ErrorType.Service);
        exception.setErrorCode("Service unavailable");
      } else if (e instanceof IOException) {
        throw (IOException) e;
      } else {
        String errorMessage =
            "Unable to unmarshall error response ("
                + e.getMessage()
                + "). Response Code: "
                + status
                + ", Response Text: "
                + apacheHttpResponse.getStatusLine().getReasonPhrase();
        throw new AmazonClientException(errorMessage, e);
      }
    }

    exception.setStatusCode(status);
    exception.setServiceName(request.getServiceName());
    exception.fillInStackTrace();
    return exception;
  }
  /**
   * Internal method to execute the HTTP method given.
   *
   * @see AmazonHttpClient#execute(Request, HttpResponseHandler, HttpResponseHandler)
   * @see AmazonHttpClient#execute(Request, HttpResponseHandler, HttpResponseHandler,
   *     ExecutionContext)
   */
  private <T extends Object> T executeHelper(
      Request<?> request,
      HttpResponseHandler<AmazonWebServiceResponse<T>> responseHandler,
      HttpResponseHandler<AmazonServiceException> errorResponseHandler,
      ExecutionContext executionContext)
      throws AmazonClientException, AmazonServiceException {

    /*
     * Depending on which response handler we end up choosing to handle the
     * HTTP response, it might require us to leave the underlying HTTP
     * connection open, depending on whether or not it reads the complete
     * HTTP response stream from the HTTP connection, or if delays reading
     * any of the content until after a response is returned to the caller.
     */
    boolean leaveHttpConnectionOpen = false;

    // When we release connections, the connection manager leaves them
    // open so they can be reused.  We want to close out any idle
    // connections so that they don't sit around in CLOSE_WAIT.
    httpClient.getConnectionManager().closeIdleConnections(30, TimeUnit.SECONDS);

    if (requestLog.isDebugEnabled()) {
      requestLog.debug("Sending Request: " + request.toString());
    }

    // Apply whatever request options we know how to handle, such as user-agent.
    applyRequestData(request);

    int retryCount = 0;
    URI redirectedURI = null;
    HttpEntity entity = null;
    AmazonServiceException exception = null;

    // Make a copy of the original request params and headers so that we can
    // permute it in this loop and start over with the original every time.
    Map<String, String> originalParameters = new HashMap<String, String>();
    originalParameters.putAll(request.getParameters());
    Map<String, String> originalHeaders = new HashMap<String, String>();
    originalHeaders.putAll(request.getHeaders());

    while (true) {
      if (retryCount > 0) {
        request.setParameters(originalParameters);
        request.setHeaders(originalHeaders);
      }

      // Sign the request if a signer was provided
      if (executionContext.getSigner() != null && executionContext.getCredentials() != null) {
        executionContext.getSigner().sign(request, executionContext.getCredentials());
      }

      HttpRequestBase httpRequest =
          httpRequestFactory.createHttpRequest(request, config, entity, executionContext);

      if (httpRequest instanceof HttpEntityEnclosingRequest) {
        entity = ((HttpEntityEnclosingRequest) httpRequest).getEntity();
      }

      if (redirectedURI != null) {
        httpRequest.setURI(redirectedURI);
      }

      org.apache.http.HttpResponse response = null;
      try {
        if (retryCount > 0) {
          pauseExponentially(retryCount, exception, executionContext.getCustomBackoffStrategy());
          if (entity != null) {
            InputStream content = entity.getContent();
            if (content.markSupported()) {
              content.reset();
            }
          }
        }

        exception = null;
        retryCount++;

        response = httpClient.execute(httpRequest);
        if (isRequestSuccessful(response)) {
          /*
           * If we get back any 2xx status code, then we know we should
           * treat the service call as successful.
           */
          leaveHttpConnectionOpen = responseHandler.needsConnectionLeftOpen();
          return handleResponse(request, responseHandler, httpRequest, response, executionContext);
        } else if (isTemporaryRedirect(response)) {
          /*
           * S3 sends 307 Temporary Redirects if you try to delete an
           * EU bucket from the US endpoint. If we get a 307, we'll
           * point the HTTP method to the redirected location, and let
           * the next retry deliver the request to the right location.
           */
          Header[] locationHeaders = response.getHeaders("location");
          String redirectedLocation = locationHeaders[0].getValue();
          log.debug("Redirecting to: " + redirectedLocation);
          redirectedURI = URI.create(redirectedLocation);
          httpRequest.setURI(redirectedURI);
        } else {
          leaveHttpConnectionOpen = errorResponseHandler.needsConnectionLeftOpen();
          exception = handleErrorResponse(request, errorResponseHandler, httpRequest, response);

          if (!shouldRetry(httpRequest, exception, retryCount)) {
            throw exception;
          }
        }
      } catch (IOException ioe) {
        log.warn("Unable to execute HTTP request: " + ioe.getMessage());

        if (!shouldRetry(httpRequest, ioe, retryCount)) {
          throw new AmazonClientException(
              "Unable to execute HTTP request: " + ioe.getMessage(), ioe);
        }
      } finally {
        /*
         * Some response handlers need to manually manage the HTTP
         * connection and will take care of releasing the connection on
         * their own, but if this response handler doesn't need the
         * connection left open, we go ahead and release the it to free
         * up resources.
         */
        if (!leaveHttpConnectionOpen) {
          try {
            response.getEntity().getContent().close();
          } catch (Throwable t) {
          }
        }
      }
    }
  }
示例#4
0
  /**
   * Internal method to execute the HTTP method given.
   *
   * @see AmazonHttpClient#execute(Request, HttpResponseHandler, HttpResponseHandler)
   * @see AmazonHttpClient#execute(Request, HttpResponseHandler, HttpResponseHandler,
   *     ExecutionContext)
   */
  private <T> Response<T> executeHelper(
      Request<?> request,
      HttpResponseHandler<AmazonWebServiceResponse<T>> responseHandler,
      HttpResponseHandler<AmazonServiceException> errorResponseHandler,
      ExecutionContext executionContext)
      throws AmazonClientException, AmazonServiceException {
    /*
     * Depending on which response handler we end up choosing to handle the
     * HTTP response, it might require us to leave the underlying HTTP
     * connection open, depending on whether or not it reads the complete
     * HTTP response stream from the HTTP connection, or if delays reading
     * any of the content until after a response is returned to the caller.
     */
    boolean leaveHttpConnectionOpen = false;
    AWSRequestMetrics awsRequestMetrics = executionContext.getAwsRequestMetrics();
    /* add the service endpoint to the logs. You can infer service name from service endpoint */
    awsRequestMetrics.addProperty(Field.ServiceName, request.getServiceName());
    awsRequestMetrics.addProperty(Field.ServiceEndpoint, request.getEndpoint());
    // Apply whatever request options we know how to handle, such as user-agent.
    setUserAgent(request);
    int requestCount = 0;
    URI redirectedURI = null;
    HttpEntity entity = null;
    AmazonClientException retriedException = null;

    // Make a copy of the original request params and headers so that we can
    // permute it in this loop and start over with the original every time.
    Map<String, String> originalParameters = new LinkedHashMap<String, String>();
    originalParameters.putAll(request.getParameters());
    Map<String, String> originalHeaders = new HashMap<String, String>();
    originalHeaders.putAll(request.getHeaders());
    final AWSCredentials credentials = executionContext.getCredentials();
    Signer signer = null;

    while (true) {
      ++requestCount;
      awsRequestMetrics.setCounter(Field.RequestCount, requestCount);
      if (requestCount > 1) { // retry
        request.setParameters(originalParameters);
        request.setHeaders(originalHeaders);
      }
      HttpRequestBase httpRequest = null;
      org.apache.http.HttpResponse apacheResponse = null;

      try {
        // Sign the request if a signer was provided
        if (signer == null) signer = executionContext.getSignerByURI(request.getEndpoint());
        if (signer != null && credentials != null) {
          awsRequestMetrics.startEvent(Field.RequestSigningTime);
          try {
            signer.sign(request, credentials);
          } finally {
            awsRequestMetrics.endEvent(Field.RequestSigningTime);
          }
        }

        if (requestLog.isDebugEnabled()) {
          requestLog.debug("Sending Request: " + request.toString());
        }

        httpRequest = httpRequestFactory.createHttpRequest(request, config, executionContext);

        if (httpRequest instanceof HttpEntityEnclosingRequest) {
          entity = ((HttpEntityEnclosingRequest) httpRequest).getEntity();
        }

        if (redirectedURI != null) {
          httpRequest.setURI(redirectedURI);
        }

        if (requestCount > 1) { // retry
          awsRequestMetrics.startEvent(Field.RetryPauseTime);
          try {
            pauseBeforeNextRetry(
                request.getOriginalRequest(),
                retriedException,
                requestCount,
                config.getRetryPolicy());
          } finally {
            awsRequestMetrics.endEvent(Field.RetryPauseTime);
          }
        }

        if (entity != null) {
          InputStream content = entity.getContent();
          if (requestCount > 1) { // retry
            if (content.markSupported()) {
              content.reset();
              content.mark(-1);
            }
          } else {
            if (content.markSupported()) {
              content.mark(-1);
            }
          }
        }

        captureConnectionPoolMetrics(httpClient.getConnectionManager(), awsRequestMetrics);
        HttpContext httpContext = new BasicHttpContext();
        httpContext.setAttribute(AWSRequestMetrics.class.getSimpleName(), awsRequestMetrics);
        retriedException = null;
        awsRequestMetrics.startEvent(Field.HttpRequestTime);
        try {
          apacheResponse = httpClient.execute(httpRequest, httpContext);
        } finally {
          awsRequestMetrics.endEvent(Field.HttpRequestTime);
        }

        if (isRequestSuccessful(apacheResponse)) {
          awsRequestMetrics.addProperty(
              Field.StatusCode, apacheResponse.getStatusLine().getStatusCode());
          /*
           * If we get back any 2xx status code, then we know we should
           * treat the service call as successful.
           */
          leaveHttpConnectionOpen = responseHandler.needsConnectionLeftOpen();
          HttpResponse httpResponse = createResponse(httpRequest, request, apacheResponse);
          T response =
              handleResponse(
                  request,
                  responseHandler,
                  httpRequest,
                  httpResponse,
                  apacheResponse,
                  executionContext);
          return new Response<T>(response, httpResponse);
        } else if (isTemporaryRedirect(apacheResponse)) {
          /*
           * S3 sends 307 Temporary Redirects if you try to delete an
           * EU bucket from the US endpoint. If we get a 307, we'll
           * point the HTTP method to the redirected location, and let
           * the next retry deliver the request to the right location.
           */
          Header[] locationHeaders = apacheResponse.getHeaders("location");
          String redirectedLocation = locationHeaders[0].getValue();
          log.debug("Redirecting to: " + redirectedLocation);
          redirectedURI = URI.create(redirectedLocation);
          httpRequest.setURI(redirectedURI);
          awsRequestMetrics.addProperty(
              Field.StatusCode, apacheResponse.getStatusLine().getStatusCode());
          awsRequestMetrics.addProperty(Field.RedirectLocation, redirectedLocation);
          awsRequestMetrics.addProperty(Field.AWSRequestID, null);

        } else {
          leaveHttpConnectionOpen = errorResponseHandler.needsConnectionLeftOpen();
          AmazonServiceException ase =
              handleErrorResponse(request, errorResponseHandler, httpRequest, apacheResponse);
          awsRequestMetrics.addProperty(Field.AWSRequestID, ase.getRequestId());
          awsRequestMetrics.addProperty(Field.AWSErrorCode, ase.getErrorCode());
          awsRequestMetrics.addProperty(Field.StatusCode, ase.getStatusCode());

          if (!shouldRetry(
              request.getOriginalRequest(),
              httpRequest,
              ase,
              requestCount,
              config.getRetryPolicy())) {
            throw ase;
          }

          // Cache the retryable exception
          retriedException = ase;
          /*
           * Checking for clock skew error again because we don't want to set the
           * global time offset for every service exception.
           */
          if (RetryUtils.isClockSkewError(ase)) {
            int timeOffset = parseClockSkewOffset(apacheResponse, ase);
            SDKGlobalConfiguration.setGlobalTimeOffset(timeOffset);
          }
          resetRequestAfterError(request, ase);
        }
      } catch (IOException ioe) {
        if (log.isInfoEnabled()) {
          log.info("Unable to execute HTTP request: " + ioe.getMessage(), ioe);
        }
        awsRequestMetrics.incrementCounter(Field.Exception);
        awsRequestMetrics.addProperty(Field.Exception, ioe);
        awsRequestMetrics.addProperty(Field.AWSRequestID, null);

        AmazonClientException ace =
            new AmazonClientException("Unable to execute HTTP request: " + ioe.getMessage(), ioe);
        if (!shouldRetry(
            request.getOriginalRequest(),
            httpRequest,
            ace,
            requestCount,
            config.getRetryPolicy())) {
          throw ace;
        }

        // Cache the retryable exception
        retriedException = ace;
        resetRequestAfterError(request, ioe);
      } catch (RuntimeException e) {
        throw handleUnexpectedFailure(e, awsRequestMetrics);
      } catch (Error e) {
        throw handleUnexpectedFailure(e, awsRequestMetrics);
      } finally {
        /*
         * Some response handlers need to manually manage the HTTP
         * connection and will take care of releasing the connection on
         * their own, but if this response handler doesn't need the
         * connection left open, we go ahead and release the it to free
         * up resources.
         */
        if (!leaveHttpConnectionOpen) {
          try {
            if (apacheResponse != null
                && apacheResponse.getEntity() != null
                && apacheResponse.getEntity().getContent() != null) {
              apacheResponse.getEntity().getContent().close();
            }
          } catch (IOException e) {
            log.warn("Cannot close the response content.", e);
          }
        }
      }
    } /* end while (true) */
  }
示例#5
0
  @Override
  public void run() {
    try {

      String BOUNDARY = "----WebKitFormBoundaryT1HoybnYeFOGFlBR";

      StringBuilder sb = new StringBuilder();
      for (String key : map.keySet()) {
        sb.append("--" + BOUNDARY + "\r\n");
        sb.append("Content-Disposition: form-data; name=\"" + key + "\"" + "\r\n");
        sb.append("\r\n");
        sb.append(map.get(key) + "\r\n");
      }

      File file = new File(filePath);
      String newFileName = file.getName();

      /** 上传文件的头 */
      sb.append("--" + BOUNDARY + "\r\n");
      sb.append(
          "Content-Disposition: form-data; name=\""
              + fileType
              + "\"; filename=\""
              + newFileName
              + "\""
              + "\r\n");
      sb.append("Content-Type: image/jpeg" + "\r\n");
      sb.append("\r\n");

      byte[] headerInfo = sb.toString().getBytes("UTF-8");
      byte[] endInfo = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("UTF-8");
      LogUtil.d(TAG, sb.toString());

      URL realUrl = new URL(url);
      HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
      conn.setRequestMethod("POST");
      conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
      conn.setRequestProperty(
          "Content-Length", String.valueOf(headerInfo.length + file.length() + endInfo.length));

      conn.setDoOutput(true);

      OutputStream out = conn.getOutputStream();
      InputStream in = new FileInputStream(file);
      out.write(headerInfo);

      byte[] buf = new byte[1024];
      int len;
      while ((len = in.read(buf)) != -1) out.write(buf, 0, len);

      out.write(endInfo);
      in.close();
      out.close();

      if (conn.getResponseCode() == 200) {
        /** 接收服务器的响应 */
        InputStream is = conn.getInputStream();
        int length;
        StringBuffer b = new StringBuffer();
        while ((length = is.read()) != -1) {
          b.append((char) length);
        }

        String response = new String(b.toString().getBytes(), "UTF-8");
        httpResponseHandler.response(response, tClass);

      } else {
        LogUtil.e(TAG, "Response Code : " + conn.getResponseCode());
      }
    } catch (Exception e) {
      LogUtil.e("UpLoadFileRunable", "Upload file exception " + e);
      e.printStackTrace();
    }
  }