LoadTools.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package com.acdp.transceivr;
  2. import okhttp3.*;
  3. import okio.BufferedSink;
  4. import org.slf4j.LoggerFactory;
  5. import java.io.ByteArrayInputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. public class LoadTools {
  9. public static final MediaType MEDIA_TYPE_BINARY
  10. = MediaType.parse("application/octet-stream");
  11. public static final MediaType MEDIA_TYPE_JSON
  12. = MediaType.get("application/json; charset=utf-8");
  13. private final static org.slf4j.Logger logger = LoggerFactory.getLogger(LoadTools.class);
  14. private static void finishTransfer(Transfer t) {
  15. t.finishedAT=System.currentTimeMillis();
  16. t.finished=true;
  17. }
  18. private static void download(Transfer t, ProgressListener progressListener) throws IOException {
  19. Request request = new Request.Builder()
  20. .url(t.from)
  21. .build();
  22. OkHttpClient client = new OkHttpClient.Builder()
  23. .addNetworkInterceptor(chain -> {
  24. Response originalResponse = chain.proceed(chain.request());
  25. return originalResponse.newBuilder()
  26. .body(new ProgressResponseBody(originalResponse.body(), progressListener))
  27. .build();
  28. })
  29. .build();
  30. var call = client.newCall(request);
  31. t.call = call;
  32. call.enqueue(new Callback() {
  33. @Override
  34. public void onFailure(Call call, IOException e) {
  35. finishTransfer(t);
  36. t.uploadError = e.toString();
  37. }
  38. @Override
  39. public void onResponse(Call call, Response response) throws IOException {
  40. t.downloadCode = response.code();
  41. if (!response.isSuccessful()) {
  42. finishTransfer(t);
  43. return;
  44. }
  45. try {
  46. upload(t, response.body().byteStream());
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. });
  52. }
  53. private static void upload(Transfer t, InputStream is) throws IOException {
  54. RequestBody requestBody = new RequestBody() {
  55. @Override
  56. public MediaType contentType() {
  57. return MediaType.get(t.toMime);
  58. }
  59. @Override
  60. public void writeTo(BufferedSink sink) throws IOException {
  61. is.transferTo(sink.outputStream());
  62. }
  63. };
  64. OkHttpClient client = new OkHttpClient();
  65. var requestBuilder = new Request.Builder().url(t.to);
  66. if(t.toMethod.equals("PUT"))
  67. requestBuilder.put(requestBody);
  68. else
  69. requestBuilder.post(requestBody);
  70. requestBuilder.header("Content-Type", t.toMime);
  71. var request=requestBuilder.build();
  72. client.newCall(request).enqueue(
  73. new Callback() {
  74. @Override
  75. public void onFailure(Call call, IOException e) {
  76. t.uploadError = e.toString();
  77. finishTransfer(t);
  78. }
  79. @Override
  80. public void onResponse(Call call, Response response) throws IOException {
  81. if (!response.isSuccessful()) {
  82. t.uploadError = response.toString();
  83. finishTransfer(t);
  84. }
  85. t.uploadCode = response.code();
  86. t.uploadResponseBody = response.body().string();
  87. t.uploadDone = true;
  88. if (t.cpeeCallback != null) {
  89. try {
  90. OkHttpClient client = new OkHttpClient();
  91. Request request = new Request.Builder()
  92. .url(t.cpeeCallback + "/")
  93. .put(RequestBody.create(MEDIA_TYPE_JSON, "[{}]"))
  94. .build();
  95. logger.info("putting to {}", t.cpeeCallback);
  96. Response res = client.newCall(request).execute();
  97. logger.info("result {}", res.toString());
  98. t.cpeeCallbackResult = res.body().string();
  99. t.cpeeCallbackCode = res.code();
  100. t.cpeeCallbackMessage = res.message();
  101. } catch (Exception e) {
  102. logger.warn("cpee callback failed", e);
  103. t.cpeeCallbackError = e.getMessage();
  104. finishTransfer(t);
  105. }
  106. }
  107. else {
  108. finishTransfer(t);
  109. }
  110. }
  111. }
  112. );
  113. }
  114. public static void startTransfer(Transfer t) throws IOException {
  115. final ProgressListener progressListener = new ProgressListener() {
  116. boolean firstUpdate = true;
  117. @Override
  118. public void update(long bytesRead, long contentLength, boolean done) {
  119. if (done) {
  120. t.downloadDone = true;
  121. } else {
  122. if (firstUpdate) {
  123. firstUpdate = false;
  124. if (contentLength == -1) {
  125. t.contentLength = -1;
  126. } else {
  127. t.contentLength = contentLength;
  128. }
  129. }
  130. t.bytesRead = bytesRead;
  131. t.currentTS = System.currentTimeMillis();
  132. }
  133. }
  134. };
  135. if(t.body!=null)
  136. upload(t, new ByteArrayInputStream(t.body.getBytes()));
  137. else {
  138. download(t, progressListener);
  139. }
  140. }
  141. }