LoadTools.java 5.5 KB

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