Beispiel #1
0
  @Override
  public Request prepareRequest(final Context context, final RequestDetails details) {

    final com.squareup.okhttp.Request.Builder builder = new com.squareup.okhttp.Request.Builder();

    final List<PostField> postFields = details.getPostFields();

    if (postFields != null) {
      builder.post(
          RequestBody.create(
              MediaType.parse("application/x-www-form-urlencoded"),
              PostField.encodeList(postFields)));

    } else {
      builder.get();
    }

    builder.url(details.getUrl().toString());
    builder.cacheControl(CacheControl.FORCE_NETWORK);

    final AtomicReference<Call> callRef = new AtomicReference<>();

    return new Request() {

      public void executeInThisThread(final Listener listener) {

        final Call call = mClient.newCall(builder.build());
        callRef.set(call);

        try {

          final Response response;

          try {
            response = call.execute();
          } catch (IOException e) {
            listener.onError(CacheRequest.REQUEST_FAILURE_CONNECTION, e, null);
            return;
          }

          final int status = response.code();

          if (status == 200 || status == 202) {

            final ResponseBody body = response.body();
            final InputStream bodyStream;
            final Long bodyBytes;

            if (body != null) {
              bodyStream = body.byteStream();
              bodyBytes = body.contentLength();

            } else {
              // TODO error
              bodyStream = null;
              bodyBytes = null;
            }

            final String contentType = response.header("Content-Type");

            listener.onSuccess(contentType, bodyBytes, bodyStream);

          } else {
            listener.onError(CacheRequest.REQUEST_FAILURE_REQUEST, null, status);
          }

        } catch (Throwable t) {
          listener.onError(CacheRequest.REQUEST_FAILURE_CONNECTION, t, null);
        }
      }

      @Override
      public void cancel() {
        final Call call = callRef.getAndSet(null);
        if (call != null) {
          call.cancel();
        }
      }

      @Override
      public void addHeader(final String name, final String value) {
        builder.addHeader(name, value);
      }
    };
  }