From 6a1a85502f22c2a3666b18e2b57ba91fe42e04b8 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 1 Jul 2025 08:29:18 +0000 Subject: [PATCH 1/3] Migrate signature generation from SHA-1 to SHA-256 and simplify URL construction Co-authored-by: dm --- .gradle/8.7/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/8.7/checksums/md5-checksums.bin | Bin 0 -> 20847 bytes .gradle/8.7/checksums/sha1-checksums.bin | Bin 0 -> 22817 bytes .../8.7/dependencies-accessors/gc.properties | 0 .../8.7/executionHistory/executionHistory.bin | Bin 0 -> 50769 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/8.7/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/8.7/fileHashes/fileHashes.bin | Bin 0 -> 21197 bytes .gradle/8.7/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../8.7/fileHashes/resourceHashesCache.bin | Bin 0 -> 19415 bytes .gradle/8.7/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 19037 bytes .gradle/vcs-1/gc.properties | 0 bug_analysis_report.md | 148 +++++++++++++ build/reports/tests/test/css/base-style.css | 179 ++++++++++++++++ build/reports/tests/test/css/style.css | 84 ++++++++ build/reports/tests/test/index.html | 193 +++++++++++++++++ build/reports/tests/test/js/report.js | 194 ++++++++++++++++++ .../test/packages/com.corezoid.sdk.test.html | 103 ++++++++++ .../tests/test/packages/default-package.html | 143 +++++++++++++ build/resources/main/logback.xml | 11 + .../TEST-CorezoidMessageIntegrationTest.xml | 9 + .../test/TEST-CorezoidMessageTest.xml | 10 + .../test/TEST-HttpManagerTest.xml | 8 + .../test/TEST-RequestOperationTest.xml | 10 + .../test/TEST-ResponseOperationTest.xml | 9 + .../TEST-com.corezoid.sdk.test.UtiisTest.xml | 51 +++++ build/test-results/test/binary/output.bin | 34 +++ build/test-results/test/binary/output.bin.idx | Bin 0 -> 366 bytes build/test-results/test/binary/results.bin | Bin 0 -> 2075 bytes .../stash-dir/HttpManager.class.uniqueId0 | Bin 0 -> 6078 bytes .../compileJava/previous-compilation-data.bin | Bin 0 -> 29439 bytes .../stash-dir/UtiisTest.class.uniqueId0 | Bin 0 -> 10180 bytes .../previous-compilation-data.bin | Bin 0 -> 23946 bytes .../corezoid/sdk/entity/CorezoidMessage.java | 32 +-- .../com/corezoid/sdk/utils/HttpManager.java | 1 - .../java/com/corezoid/sdk/test/UtiisTest.java | 4 +- 39 files changed, 1201 insertions(+), 24 deletions(-) create mode 100644 .gradle/8.7/checksums/checksums.lock create mode 100644 .gradle/8.7/checksums/md5-checksums.bin create mode 100644 .gradle/8.7/checksums/sha1-checksums.bin create mode 100644 .gradle/8.7/dependencies-accessors/gc.properties create mode 100644 .gradle/8.7/executionHistory/executionHistory.bin create mode 100644 .gradle/8.7/executionHistory/executionHistory.lock create mode 100644 .gradle/8.7/fileChanges/last-build.bin create mode 100644 .gradle/8.7/fileHashes/fileHashes.bin create mode 100644 .gradle/8.7/fileHashes/fileHashes.lock create mode 100644 .gradle/8.7/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/8.7/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 bug_analysis_report.md create mode 100644 build/reports/tests/test/css/base-style.css create mode 100644 build/reports/tests/test/css/style.css create mode 100644 build/reports/tests/test/index.html create mode 100644 build/reports/tests/test/js/report.js create mode 100644 build/reports/tests/test/packages/com.corezoid.sdk.test.html create mode 100644 build/reports/tests/test/packages/default-package.html create mode 100644 build/resources/main/logback.xml create mode 100644 build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml create mode 100644 build/test-results/test/TEST-CorezoidMessageTest.xml create mode 100644 build/test-results/test/TEST-HttpManagerTest.xml create mode 100644 build/test-results/test/TEST-RequestOperationTest.xml create mode 100644 build/test-results/test/TEST-ResponseOperationTest.xml create mode 100644 build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml create mode 100644 build/test-results/test/binary/output.bin create mode 100644 build/test-results/test/binary/output.bin.idx create mode 100644 build/test-results/test/binary/results.bin create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/HttpManager.class.uniqueId0 create mode 100644 build/tmp/compileJava/previous-compilation-data.bin create mode 100644 build/tmp/compileTestJava/compileTransaction/stash-dir/UtiisTest.class.uniqueId0 create mode 100644 build/tmp/compileTestJava/previous-compilation-data.bin diff --git a/.gradle/8.7/checksums/checksums.lock b/.gradle/8.7/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..2e0c5e917dc0ca8df7051129a256182f55864c67 GIT binary patch literal 17 UcmZQxA^zBXb;S~S1_)>Y05MSnR{#J2 literal 0 HcmV?d00001 diff --git a/.gradle/8.7/checksums/md5-checksums.bin b/.gradle/8.7/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..18c99dbb3cbf94d64364590355a3e332a2f8d503 GIT binary patch literal 20847 zcmeI4YdBPC0Dz~GVvI|Zdp0UsEz(l7Op)sh#-$K>DqAU)h+5Zbi7mpmxkpPfY-_Q# z(YjBBh>hBc-B6^o=weqcp*?55@3T*H?63W|&v%~3nCJDq=R4;;7eCBlPNOMEzlRI$ zpGEecxA+|{fD7OPxBxDI3*Z8{04{(F-~zY+E`ST*0=NJ!fD7OPxBxDI3;bUSI1@V} z4t7RCYcBalDv(Cgl_1`%{<3dCBxBN-0e)@oXc+OV*hmm#gh80^G)Ph6jqg)7a@Q2e{n;;x~LY28NYA+6B2Y;x#gd zwx8*}-2ymgE#fy-{1q)#ACv&@a1`-7B5FowCOqE4^^_vs`m)@In&c+Od-!iyr=y^R9l|w zFkDX>;zI)*u5Zd_4&XMUh`+z>UqX+MA$;f5nVr)bTEHYMW-z^!?Ri$#Kg z7vNlb#OW^QBv;^JHNBGmzBiy>~Rv@>Yf%J?zhT$LFf9WvNaUkkU>ArEoO2A}OdCySPW@zw!| zb94f8$CH!cb!Q)nxJ{2ox~z}JUby}~#JR!q>9WI`4*}=QL)^K1q;&9_>PEnA-^}p3 zrUlc^n(+LwHbvYmeO2==?f4`x-k}5WeG>6Bf64qwz-?9|j=s}qBEjHi_!Sqx1#kge z02jaoZ~)pu<;N{m#VPdTu(;6$>M!9+MJX+gSZJ6riHr?}(8 z{m@@WHO3r%P^_>&!m|sFU=;rRxfn2b@H66iN>syAr%KcH6hkM{qR-#-RYn7xV>8$) z#Sp6TCwt9x?N|5fYj3c#O3PzKpkV=wFUY4fgj(_M@%w^#2M-rd{$}Rn)J3!*j|cAs zFzDn19zuqsN=di3H>+P?CrJK}OXLv~96@+I*rHV9kEA6NhhHw+|6KZL2v_&g7tr_; z%poU3HBtr)m?>2WysHbE+a>jWCq7p$m?P@n4Rie}_vafFe4oYk-pU&NIu9DLz)&We z3GGLlx`9YcYHCn<&F-k6h$%B@oc?!%8!z2&;oDoP9wcYisXWbw#&Te2lTUdF%~50L z%0H;!9DZs}Oz#+Hj}A28*>3tV)oA)ue4O)1VR%(r#1hXl`~+a|hQJ(7e^QOGjA`r8 zhOU4|EwAD&m_M?hF#rsC@)-)Dt!m8Pu=D4QUN3iKx$dmikGTc6>IYyj9#D-${mC_Z z4Ai_ACF^G;cc|7wgAWX4Vk?E`5dEh8qF-T7d;e&NQ*_kxT4*!@L#&%>sD^hQbaRk# zb)2$`dBGecZWn@MUIz^I%T&Wp>(Fk4!;4;x1uo6aG#}T1MmwCNifVK{8!_6N|0L~= zuEJs7^onE9AorM9Ue7Ye`JR`KudmaW<_8~tm?h~k0*xEMU=i27@SfjPYt-<(a(1c7 z5s$#or>>8oF$E0SX{zCEG{j#w?iHLB*{B`Ca9aqBJmTsl7iBHtMd%3LskI#Ga^LXl zDnpk66Dj^hI0t-=X6<>Z5foanvO2V0?>FA#O?tyj1TdJ<1Jk#ppcBZ)1NkHa_g(jDW zy}XqilHZ!nm=n9TOTAz?lD*ItOET?XHO{HdRlT zAGM9KDMNMP+0K~dcoZs^g`0BE@p2>DvaHqRh$~63RmdO<2pvK7;^2ep6KV`qn#ULS zc{STYqY-QseU{$_2A^_ASF+BVbsjsX(~xbn5*oh%Lq?uDho5DnxqFNJ3l0fxj$s`1g5l=Wlpi}$Zs)N@ti!Y_u3@jht4dm^)doa1l#0I7)p literal 0 HcmV?d00001 diff --git a/.gradle/8.7/checksums/sha1-checksums.bin b/.gradle/8.7/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..38770b6ee14bc3208b457ac6b8a7db1899a44ca2 GIT binary patch literal 22817 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 literal 0 HcmV?d00001 diff --git a/.gradle/8.7/executionHistory/executionHistory.lock b/.gradle/8.7/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..6914ae95e52632cda74fa786bb195687d0e35cf0 GIT binary patch literal 17 TcmZQ};|LFTu02)F00DvkBNPJ` literal 0 HcmV?d00001 diff --git a/.gradle/8.7/fileChanges/last-build.bin b/.gradle/8.7/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/8.7/fileHashes/fileHashes.bin b/.gradle/8.7/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..e4d030740abb87f88c2879bc6ebc704cfb942214 GIT binary patch literal 21197 zcmeI3cT`i!9>*`$BoKk$Dv01NvKEetAUnz2am~H{@&0`0otbl(c3E%{90yqJj z08RiW@c)v)5-<@KoD9cETJ%PFGeMXtf;Y3{6>|(V7RIE&f4go&zaOOK2euT~sI7zC zc^cveBD)RD65i!N&XYm>V4|f=yR6E@H;+Ym1pQPAFa_LMv1ZnlUQre~Sjb*&|T`*3SP z{G@GN>grBIaS8YuqQuT`nPB!}VFEy1!&TdHh_&Zz(Ez_1xb#4{}#0#P5bLIULbqZUgyZ zSH#=(rWg1`^msxpC_?;xN-Yr?7J3Ai1(+PJP!-g?;?+%h4?^)!q|e@gT9cvXCwYs&iQ9|lAr$tIX@8b z*PeNL@6>xbAYVKQ@u9l-$=;7Q7Lw!NedfI@O^)(Du*vby5PyGL#>0MwLpjMS5SIzo zzwLj@Qvq`4SBT3xRqyxLo+=Ny>uJR0-%hj|v>ZMLxgZ*G1#6XKEZucGA$Jc&Tr_fht#>}_ItzeZuy97?K?2K>!l`nzc^VVZcuo+cX^k+D|tTZh#Tf< zM+IEEcMI~xI}x9DbNr1!`JN2OU6vqjTK>bpYo+`hkh{wvZeDhO_mIMH8#!Jdaf_g+ z9W$jYNzOMx+>Y5+7w&R!KO8SmMcm=r?Cu|Bl`0_TXME

|zbWU(P|!8%3N~#hOEW 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 XkF4cy%EC&2ckp5+Z)Z=u>OP(U70GT6 literal 0 HcmV?d00001 diff --git a/.gradle/8.7/gc.properties b/.gradle/8.7/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..0866a6430ef24cb73586a670d0f1a7c2dbf84657 GIT binary patch literal 17 UcmZRcW92ewLc~XV1_-bN050`kl2Iep z?4orsF{AgWq#`nQA)ygTMHWGH(WogT5fzjb6n55m9wl}o!fxbu;GF&Wp8t8q`RsBI zK@jy5bO=+2acYSb1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Of`pjLj7xys9k zt5uoB{8m9&TP!b@9CJ-vcu-JuMY-)v@&5NNMR z{Wa!In(zynbB6mhOT@7=?v$v9x%bYCdu;9%L7KCjdr}=L-?8pTKlSh22Yx;ebagk| zX-?sd_et=#9> zD?6g%XDjXR=dRs%&$q>L+^ckHC3mr9*O5Qx;|FL?J@-{Ti~QdEubxqV%H34bGvZOj zOw_MV_TAzk-$|WK>D9i;ezfR==E(^M?Kg2>zr5n?t?11L+TY6E`uK2J+P~+E(xn>i z_N9q*TfXiN&9QQCh_qd*y&KchoCx6FAWrv&k4em{46^n;#zaP + + + + +Test results - Test Summary + + + + + +

+

Test Summary

+
+ + + + + +
+
+ + + + + + + +
+
+
27
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.594s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Packages

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageTestsFailuresIgnoredDurationSuccess rate
+default-package +16000.581s100%
+com.corezoid.sdk.test +11000.013s100%
+
+
+

Classes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+CorezoidMessageIntegrationTest +3000.032s100%
+CorezoidMessageTest +4000.004s100%
+HttpManagerTest +2000.541s100%
+RequestOperationTest +4000.003s100%
+ResponseOperationTest +3000.001s100%
+com.corezoid.sdk.test.UtiisTest +11000.013s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/js/report.js b/build/reports/tests/test/js/report.js new file mode 100644 index 0000000..83bab4a --- /dev/null +++ b/build/reports/tests/test/js/report.js @@ -0,0 +1,194 @@ +(function (window, document) { + "use strict"; + + var tabs = {}; + + function changeElementClass(element, classValue) { + if (element.getAttribute("className")) { + element.setAttribute("className", classValue); + } else { + element.setAttribute("class", classValue); + } + } + + function getClassAttribute(element) { + if (element.getAttribute("className")) { + return element.getAttribute("className"); + } else { + return element.getAttribute("class"); + } + } + + function addClass(element, classValue) { + changeElementClass(element, getClassAttribute(element) + " " + classValue); + } + + function removeClass(element, classValue) { + changeElementClass(element, getClassAttribute(element).replace(classValue, "")); + } + + function initTabs() { + var container = document.getElementById("tabs"); + + tabs.tabs = findTabs(container); + tabs.titles = findTitles(tabs.tabs); + tabs.headers = findHeaders(container); + tabs.select = select; + tabs.deselectAll = deselectAll; + tabs.select(0); + + return true; + } + + function getCheckBox() { + return document.getElementById("line-wrapping-toggle"); + } + + function getLabelForCheckBox() { + return document.getElementById("label-for-line-wrapping-toggle"); + } + + function findCodeBlocks() { + var spans = document.getElementById("tabs").getElementsByTagName("span"); + var codeBlocks = []; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].className.indexOf("code") >= 0) { + codeBlocks.push(spans[i]); + } + } + return codeBlocks; + } + + function forAllCodeBlocks(operation) { + var codeBlocks = findCodeBlocks(); + + for (var i = 0; i < codeBlocks.length; ++i) { + operation(codeBlocks[i], "wrapped"); + } + } + + function toggleLineWrapping() { + var checkBox = getCheckBox(); + + if (checkBox.checked) { + forAllCodeBlocks(addClass); + } else { + forAllCodeBlocks(removeClass); + } + } + + function initControls() { + if (findCodeBlocks().length > 0) { + var checkBox = getCheckBox(); + var label = getLabelForCheckBox(); + + checkBox.onclick = toggleLineWrapping; + checkBox.checked = false; + + removeClass(label, "hidden"); + } + } + + function switchTab() { + var id = this.id.substr(1); + + for (var i = 0; i < tabs.tabs.length; i++) { + if (tabs.tabs[i].id === id) { + tabs.select(i); + break; + } + } + + return false; + } + + function select(i) { + this.deselectAll(); + + changeElementClass(this.tabs[i], "tab selected"); + changeElementClass(this.headers[i], "selected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + var h2 = document.createElement("H2"); + + h2.appendChild(document.createTextNode(this.titles[i])); + this.headers[i].appendChild(h2); + } + + function deselectAll() { + for (var i = 0; i < this.tabs.length; i++) { + changeElementClass(this.tabs[i], "tab deselected"); + changeElementClass(this.headers[i], "deselected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + var a = document.createElement("A"); + + a.setAttribute("id", "ltab" + i); + a.setAttribute("href", "#tab" + i); + a.onclick = switchTab; + a.appendChild(document.createTextNode(this.titles[i])); + + this.headers[i].appendChild(a); + } + } + + function findTabs(container) { + return findChildElements(container, "DIV", "tab"); + } + + function findHeaders(container) { + var owner = findChildElements(container, "UL", "tabLinks"); + return findChildElements(owner[0], "LI", null); + } + + function findTitles(tabs) { + var titles = []; + + for (var i = 0; i < tabs.length; i++) { + var tab = tabs[i]; + var header = findChildElements(tab, "H2", null)[0]; + + header.parentNode.removeChild(header); + + if (header.innerText) { + titles.push(header.innerText); + } else { + titles.push(header.textContent); + } + } + + return titles; + } + + function findChildElements(container, name, targetClass) { + var elements = []; + var children = container.childNodes; + + for (var i = 0; i < children.length; i++) { + var child = children.item(i); + + if (child.nodeType === 1 && child.nodeName === name) { + if (targetClass && child.className.indexOf(targetClass) < 0) { + continue; + } + + elements.push(child); + } + } + + return elements; + } + + // Entry point. + + window.onload = function() { + initTabs(); + initControls(); + }; +} (window, window.document)); \ No newline at end of file diff --git a/build/reports/tests/test/packages/com.corezoid.sdk.test.html b/build/reports/tests/test/packages/com.corezoid.sdk.test.html new file mode 100644 index 0000000..2d0e168 --- /dev/null +++ b/build/reports/tests/test/packages/com.corezoid.sdk.test.html @@ -0,0 +1,103 @@ + + + + + +Test results - Package com.corezoid.sdk.test + + + + + +
+

Package com.corezoid.sdk.test

+ +
+ + + + + +
+
+ + + + + + + +
+
+
11
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.013s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+UtiisTest +11000.013s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/packages/default-package.html b/build/reports/tests/test/packages/default-package.html new file mode 100644 index 0000000..2a1d859 --- /dev/null +++ b/build/reports/tests/test/packages/default-package.html @@ -0,0 +1,143 @@ + + + + + +Test results - Default package + + + + + +
+

Default package

+ +
+ + + + + +
+
+ + + + + + + +
+
+
16
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.581s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+CorezoidMessageIntegrationTest +3000.032s100%
+CorezoidMessageTest +4000.004s100%
+HttpManagerTest +2000.541s100%
+RequestOperationTest +4000.003s100%
+ResponseOperationTest +3000.001s100%
+
+
+ +
+ + diff --git a/build/resources/main/logback.xml b/build/resources/main/logback.xml new file mode 100644 index 0000000..609c775 --- /dev/null +++ b/build/resources/main/logback.xml @@ -0,0 +1,11 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + diff --git a/build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml b/build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml new file mode 100644 index 0000000..8b089c4 --- /dev/null +++ b/build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/build/test-results/test/TEST-CorezoidMessageTest.xml b/build/test-results/test/TEST-CorezoidMessageTest.xml new file mode 100644 index 0000000..9344089 --- /dev/null +++ b/build/test-results/test/TEST-CorezoidMessageTest.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/build/test-results/test/TEST-HttpManagerTest.xml b/build/test-results/test/TEST-HttpManagerTest.xml new file mode 100644 index 0000000..bca920d --- /dev/null +++ b/build/test-results/test/TEST-HttpManagerTest.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/build/test-results/test/TEST-RequestOperationTest.xml b/build/test-results/test/TEST-RequestOperationTest.xml new file mode 100644 index 0000000..aa5385e --- /dev/null +++ b/build/test-results/test/TEST-RequestOperationTest.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/build/test-results/test/TEST-ResponseOperationTest.xml b/build/test-results/test/TEST-ResponseOperationTest.xml new file mode 100644 index 0000000..2f2b715 --- /dev/null +++ b/build/test-results/test/TEST-ResponseOperationTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml b/build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml new file mode 100644 index 0000000..186ef8a --- /dev/null +++ b/build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + >testRequestOperationShouldThrowException : ref and taskId is null +>>testRequestOperationShouldThrowException : taskId is empty +>>testRequestOperationShouldThrowException : ref and taskId is null +>>testRequestOperationShouldThrowException : ref is empty +>>testGetConvQueryModifyRefMessage : +body {"ops":[{"obj_id":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} +url https://api.corezoid.com/api/1/json/12345/1751358530/2f50be5f1b3f87426fa801b7a0f8bd24fb5fc288e92eea208f4e1d4df30668db +>>testGetConvQueryModifyRefMessage : +body {"ops":[{"ref":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} +url https://api.corezoid.com/api/1/json/12345/1751358530/4daf50212e7e2c4237a7b173678dbdf79083e92d8ad557b08f3d7b8ffacdc7a5 +>>testcheckAnswerShouldThrowException : Request processing failed, request_proc = fail +>>testGetConvQueryCreateMessage : +body {"ops":[{"ref":"11","conv_id":"1234","type":"create","obj":"task","data":{"phone":"1","card":"2"}}]} +url https://api.corezoid.com/api/1/json/12345/1751358530/5d6f3a1e98aef8e7a8e83594a3dad77cc33f095813b2f3bd5a5483226ec83dc0 +>>checkSignTrue : true +>>testCheckAnswerReturnsNotEmptyMap : {PB11345969838=ok} +>>testGetConAnswerMessage : +body {"request_proc":"ok","ops":[{"ref":"22","conv_id":"11","proc":"ok","res_data":{"id":"1","test":"2"}}]} +>>testConveyorQueryBuilderShouldThrowException : apiSecret is null or empty +>>testConveyorQueryBuilderShouldThrowException : apiSecret is null or empty +>>testConveyorQueryBuilderShouldThrowException : apiLogin is null or empty +>>testConveyorQueryBuilderShouldThrowException : apiLogin is null or empty +>>testConveyorQueryBuilderShouldThrowException : operations is null +>>testResponseOperationBuilderShouldThrowEsception : convId is null or empty +>>testResponseOperationBuilderShouldThrowEsception : convId is null or empty +>>testResponseOperationBuilderShouldThrowEsception : ref is null or empty +>>testResponseOperationBuilderShouldThrowEsception : ref is null or empty +>>testResponseOperationBuilderShouldThrowEsception : data is null +>>testRequestOperationBuilderShouldThrowEsception : convId is null or empty +>>testRequestOperationBuilderShouldThrowEsception : convId is null or empty +>>testRequestOperationBuilderShouldThrowEsception : ref and taskId is null +>>testRequestOperationBuilderShouldThrowEsception : ref is empty +>>testRequestOperationBuilderShouldThrowEsception : data is null +>>checkSignFalse : false +]]> + + diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin new file mode 100644 index 0000000..7f9e0cf --- /dev/null +++ b/build/test-results/test/binary/output.bin @@ -0,0 +1,34 @@ +D>>testRequestOperationShouldThrowException : ref and taskId is null +=>>testRequestOperationShouldThrowException : taskId is empty +D>>testRequestOperationShouldThrowException : ref and taskId is null +:>>testRequestOperationShouldThrowException : ref is empty +%>>testGetConvQueryModifyRefMessage : +obody {"ops":[{"obj_id":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} +}url https://api.corezoid.com/api/1/json/12345/1751358530/2f50be5f1b3f87426fa801b7a0f8bd24fb5fc288e92eea208f4e1d4df30668db +%>>testGetConvQueryModifyRefMessage : +lbody {"ops":[{"ref":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} +}url https://api.corezoid.com/api/1/json/12345/1751358530/4daf50212e7e2c4237a7b173678dbdf79083e92d8ad557b08f3d7b8ffacdc7a5 +X>>testcheckAnswerShouldThrowException : Request processing failed, request_proc = fail +">>testGetConvQueryCreateMessage : +lbody {"ops":[{"ref":"11","conv_id":"1234","type":"create","obj":"task","data":{"phone":"1","card":"2"}}]} +}url https://api.corezoid.com/api/1/json/12345/1751358530/5d6f3a1e98aef8e7a8e83594a3dad77cc33f095813b2f3bd5a5483226ec83dc0 +>>checkSignTrue : true +9>>testCheckAnswerReturnsNotEmptyMap : {PB11345969838=ok} +>>testGetConAnswerMessage : +nbody {"request_proc":"ok","ops":[{"ref":"22","conv_id":"11","proc":"ok","res_data":{"id":"1","test":"2"}}]} +L>>testConveyorQueryBuilderShouldThrowException : apiSecret is null or empty +L>>testConveyorQueryBuilderShouldThrowException : apiSecret is null or empty +K>>testConveyorQueryBuilderShouldThrowException : apiLogin is null or empty +K>>testConveyorQueryBuilderShouldThrowException : apiLogin is null or empty +D>>testConveyorQueryBuilderShouldThrowException : operations is null + M>>testResponseOperationBuilderShouldThrowEsception : convId is null or empty + M>>testResponseOperationBuilderShouldThrowEsception : convId is null or empty + J>>testResponseOperationBuilderShouldThrowEsception : ref is null or empty + J>>testResponseOperationBuilderShouldThrowEsception : ref is null or empty + B>>testResponseOperationBuilderShouldThrowEsception : data is null + L>>testRequestOperationBuilderShouldThrowEsception : convId is null or empty + L>>testRequestOperationBuilderShouldThrowEsception : convId is null or empty + K>>testRequestOperationBuilderShouldThrowEsception : ref and taskId is null + A>>testRequestOperationBuilderShouldThrowEsception : ref is empty + A>>testRequestOperationBuilderShouldThrowEsception : data is null +!>>checkSignFalse : false diff --git a/build/test-results/test/binary/output.bin.idx b/build/test-results/test/binary/output.bin.idx new file mode 100644 index 0000000000000000000000000000000000000000..3f981954feb4c6ffdfa7ad3e62dd23430d0f1658 GIT binary patch literal 366 zcmZP+=N4l?1sDIL0SSmaBR`a0jVAwJ5+cE*1Er6mE0BUnFuTEMbOq8-iA4~a#R6S{ z3{+w#j7C==3zfJ6qtO+}K_plOp|l~o0(q#!VhGLl5M6-+M1oxtLUUp$P=rWusljM; F697yLyBh!i literal 0 HcmV?d00001 diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin new file mode 100644 index 0000000000000000000000000000000000000000..e6ae7be740461ba59c7b42e549db313d1601dd09 GIT binary patch literal 2075 zcmb7E$!-%t5Us=}EMZ?m_JD+D1TsQ^;0jhkd@upqe89w0aYk`^hMt}T=M&%(p)4#1 z!Xkvkcklyz2nU2fAdr~uX_qIaEt@$_zpnRc>8i>M9NsM9!w5q$7a(_p=d((DFoFPm z+nn$`2E)gxe6ApcvI|@g(Bsb5|5tw3{QR0ok(GAHfuob87xdj$P zBD8E1Mx1dt_PiBm2^UiCI$l8hsVpa;|5e`SxaNCq5yQ}_VSx#(wQAJmI?mIA=I<#TXuQ^{KyQ%7sWKs5NOp%Nr zvA)6J`m7K^(P44wyb`C-e%AVb`VTyj`ekIUWv71OWi~OvAvm}rO;Umd<_Rx;%Qe+= zmfh{X85j=3z((7{$ly$v4)A++&r|9Bp2I`D#lltOmi;f%Y@GQYuvfLCelpdo@myH8 z871CN*tahIyN^i#T>M4c^BhGm^vs3k#b5%WRxzJt8$-?9w2+s>; zUXSTd=W=22^v9%jyBAk^(U0nGWs&=<(~qhc$Yo~P|6vLl?ZJkjH`2o$6nUSm+>ekq zn(Iz41IzAiL6y7+XWyFj;lAboF-dp@=vO@A_hTIS`Ga6IgaHHWbHI7=O{K zej-ZQbiN_}HJJFIVv1V<8$MU`$)Wi50j3CYBP52A@f9~}F literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/HttpManager.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/HttpManager.class.uniqueId0 new file mode 100644 index 0000000000000000000000000000000000000000..f731c90d2bcb1fa3408a5391a3f50bb4d67ba993 GIT binary patch literal 6078 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 rKsWXH3$JVL<=RT1dX5*42rjf#GXkBu#iZ_ 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 literal 0 HcmV?d00001 diff --git a/build/tmp/compileTestJava/compileTransaction/stash-dir/UtiisTest.class.uniqueId0 b/build/tmp/compileTestJava/compileTransaction/stash-dir/UtiisTest.class.uniqueId0 new file mode 100644 index 0000000000000000000000000000000000000000..82c4b1c2f2fc3d2c5911c161a28165c79d8367ff GIT binary patch literal 10180 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 literal 0 HcmV?d00001 diff --git a/build/tmp/compileTestJava/previous-compilation-data.bin b/build/tmp/compileTestJava/previous-compilation-data.bin new file mode 100644 index 0000000000000000000000000000000000000000..dc7ca4087c6e66daa407bfa06a507c85946af3fd GIT binary patch literal 23946 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/corezoid/sdk/entity/CorezoidMessage.java b/src/main/java/com/corezoid/sdk/entity/CorezoidMessage.java index 2eb38fc..d6d486c 100644 --- a/src/main/java/com/corezoid/sdk/entity/CorezoidMessage.java +++ b/src/main/java/com/corezoid/sdk/entity/CorezoidMessage.java @@ -168,13 +168,8 @@ private CorezoidMessage(String body, String time, String apiSecret, this.time = time; this.apiSecret = apiSecret; this.signCode = generateSign(time, apiSecret, body); - this.url = new StringBuilder() - .append(baseUri).append("/api/") - .append(version).append(slash) - .append(format).append(slash) - .append(apiLogin).append(slash) - .append(time).append(slash) - .append(signCode).toString(); + this.url = String.format("%s/api/%s/%s/%s/%s/%s", + baseUri, version, format, apiLogin, time, signCode); } //---------------------------------------------------------------------------------------------------------------------- @@ -205,19 +200,14 @@ public boolean equals(Object obj) { @Override public int hashCode() { - int hash = 3; - hash = 89 * hash + (this.body != null ? this.body.hashCode() : 0); - hash = 89 * hash + (this.time != null ? this.time.hashCode() : 0); - hash = 89 * hash + (this.apiSecret != null ? this.apiSecret.hashCode() : 0); - hash = 89 * hash + (this.signCode != null ? this.signCode.hashCode() : 0); - hash = 89 * hash + (this.url != null ? this.url.hashCode() : 0); - return hash; + // Only use signCode to match the equals() method implementation + return this.signCode != null ? this.signCode.hashCode() : 0; } //---------------------------------------------------------------------------------------------------------------------- /** - * Genarate signature {SIGNATURE} = hex( sha1({GMT_UNIXTIME} + {API_SECRET} + * Generate signature {SIGNATURE} = hex( sha256({GMT_UNIXTIME} + {API_SECRET} * + {CONTENT} + {API_SECRET}) ) * * @param time - time @@ -227,17 +217,17 @@ public int hashCode() { */ private static String generateSign(String time, String apiSecret, String body) { - MessageDigest sha1 = messageDigest.get(); - sha1.reset(); + MessageDigest sha256 = messageDigest.get(); + sha256.reset(); byte[] bytes; - String sha1hex; + String sha256hex; try { bytes = (time + apiSecret + body + apiSecret).getBytes("UTF-8"); - sha1hex = HexFormat.of().formatHex(sha1.digest(bytes)).toLowerCase(); + sha256hex = HexFormat.of().formatHex(sha256.digest(bytes)).toLowerCase(); } catch (UnsupportedEncodingException e) { throw new RuntimeException("generateSign error", e); } - return sha1hex; + return sha256hex; } //---------------------------------------------------------------------------------------------------------------------- @@ -245,7 +235,7 @@ private static String generateSign(String time, String apiSecret, @Override protected MessageDigest initialValue() { try { - return MessageDigest.getInstance("SHA-1"); + return MessageDigest.getInstance("SHA-256"); } catch (NoSuchAlgorithmException ex) { throw new RuntimeException("MessageDigest init error", ex); } diff --git a/src/main/java/com/corezoid/sdk/utils/HttpManager.java b/src/main/java/com/corezoid/sdk/utils/HttpManager.java index d4edb52..73b18ec 100644 --- a/src/main/java/com/corezoid/sdk/utils/HttpManager.java +++ b/src/main/java/com/corezoid/sdk/utils/HttpManager.java @@ -101,5 +101,4 @@ private String sendBasic(HttpUriRequestBase request) throws HttpException { } } //---------------------------------------------------------------------------------------------------------------------- - private static final ContentType jsonUTF8 = ContentType.create("application/json", StandardCharsets.UTF_8); } diff --git a/src/test/java/com/corezoid/sdk/test/UtiisTest.java b/src/test/java/com/corezoid/sdk/test/UtiisTest.java index a6ead7d..556c01c 100644 --- a/src/test/java/com/corezoid/sdk/test/UtiisTest.java +++ b/src/test/java/com/corezoid/sdk/test/UtiisTest.java @@ -30,11 +30,11 @@ void tearDown() throws Exception { } /** - * Valid signature check test + * Valid signature check test (updated for SHA-256) */ @Test void testCheckSignTrue() { - String sign = "e01f19285c09c8eff449a60fef9dbc3c8f3915db"; + String sign = "00b9dfba49da25238df93f827c2c1be784a5fde1be78ccaced8cbb9e84305a8b"; String key = "tgGsR8FTuLXzzVBsp3rngeSgOB2E2pMFJDwAXarbrs92GmLiiy"; String time = "1389956320"; String content = "{\n" From af26f9fb77ed9482bc02dbc4069af4635ef23207 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 1 Jul 2025 09:15:43 +0000 Subject: [PATCH 2/3] Revert SHA-1 change and update bug analysis report Co-authored-by: dm --- .../8.7/executionHistory/executionHistory.bin | Bin 50769 -> 50769 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.7/fileHashes/fileHashes.bin | Bin 21197 -> 21197 bytes .gradle/8.7/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.7/fileHashes/resourceHashesCache.bin | Bin 19415 -> 19517 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes bug_analysis_report.md | 35 +++++++++--------- build/reports/tests/test/index.html | 16 ++++---- .../test/packages/com.corezoid.sdk.test.html | 6 +-- .../tests/test/packages/default-package.html | 10 ++--- .../TEST-CorezoidMessageIntegrationTest.xml | 6 +-- .../test/TEST-CorezoidMessageTest.xml | 10 ++--- .../test/TEST-HttpManagerTest.xml | 6 +-- .../test/TEST-RequestOperationTest.xml | 2 +- .../test/TEST-ResponseOperationTest.xml | 2 +- .../TEST-com.corezoid.sdk.test.UtiisTest.xml | 10 ++--- build/test-results/test/binary/output.bin | 6 +-- build/test-results/test/binary/output.bin.idx | Bin 366 -> 366 bytes build/test-results/test/binary/results.bin | Bin 2075 -> 2075 bytes .../CorezoidMessage$1.class.uniqueId3 | Bin 0 -> 1129 bytes ...CorezoidMessage$ResultType.class.uniqueId1 | Bin 0 -> 1327 bytes .../stash-dir/CorezoidMessage.class.uniqueId2 | Bin 0 -> 8435 bytes .../stash-dir/HttpManager.class.uniqueId0 | Bin 6078 -> 5860 bytes .../compileJava/previous-compilation-data.bin | Bin 29439 -> 29439 bytes ...zoidMessageIntegrationTest.class.uniqueId0 | Bin 0 -> 5439 bytes .../CorezoidMessageTest.class.uniqueId3 | Bin 0 -> 2175 bytes .../stash-dir/HttpManagerTest.class.uniqueId1 | Bin 0 -> 2164 bytes ...ss.uniqueId0 => UtiisTest.class.uniqueId2} | Bin 10180 -> 10204 bytes .../previous-compilation-data.bin | Bin 23946 -> 23946 bytes .../corezoid/sdk/entity/CorezoidMessage.java | 14 +++---- .../java/com/corezoid/sdk/test/UtiisTest.java | 4 +- 31 files changed, 64 insertions(+), 63 deletions(-) create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/CorezoidMessage$1.class.uniqueId3 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/CorezoidMessage$ResultType.class.uniqueId1 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/CorezoidMessage.class.uniqueId2 create mode 100644 build/tmp/compileTestJava/compileTransaction/stash-dir/CorezoidMessageIntegrationTest.class.uniqueId0 create mode 100644 build/tmp/compileTestJava/compileTransaction/stash-dir/CorezoidMessageTest.class.uniqueId3 create mode 100644 build/tmp/compileTestJava/compileTransaction/stash-dir/HttpManagerTest.class.uniqueId1 rename build/tmp/compileTestJava/compileTransaction/stash-dir/{UtiisTest.class.uniqueId0 => UtiisTest.class.uniqueId2} (98%) diff --git a/.gradle/8.7/executionHistory/executionHistory.bin b/.gradle/8.7/executionHistory/executionHistory.bin index af3ac3803effa52b75be030861f5cc8a01149121..308028b33f6323273736e334694f80f01115f1f6 100644 GIT binary patch delta 1815 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 Q#+tIQkcIgY7?=!t0FXW~n*aa+ delta 1129 zcmX@Rl=19R#tr@+3dw&D9}?W?^xJ7Kx1MESV4QwbqA-a840N_`&i5!_RET?T ze_%$!iQdzlAud4+4C5fGR!2Zov1CsE@2PGpu{sLEXVnMNdd5IP6NnW-SYYXFm4iox zN{gJgF5uu@y;~1zLMl)a2oyeVPWDn{G?hx&2@w!`0;JK52)MQLFX ztphefD&f%Po!%9U3RUvuPu1*f5@O~{wSV6w$)g6TPv@B7x(Pd9p1^&;$#^g{J*YjQdpApVoQd>Eox{SKyM*uH1Im(XkX{uk}N z?(JvaR}kwipMmIz?ZVV?^rk}eMwYcgzxb>5N}Ye*l9T7;{poev@terM&bS1mr#L zRJC|BB>z(2NHBv+1_A8=0k&^E&xMxZvuXouQFU+tO+a_R!%B^r zD@8(lSFAa@`Wg4NSx7n(fvPz4|^;#kU;E*g0)GFjgQz05*+5@+qcq zpIE$t4n;=xO;~OpbtqzKII0fb)sxu+SJVf1n?82sHPqVHbFiTF$4PsrB7canOjukQ zZ+W_>W0&}fV{ZL&MQfN%QFSn$#&pO}m5zNGrs+2qr+NP=oh=cKq{AGjntunTmd6SP zCvNp|nnwP5{L=7@^=%|AK*db;lM4fc#if(`|GvF0Yf`XKm`jKcn0&w?;y<}RNJ^#m Z-am%ld|lgIBZI;Xl&_=v3z$C{^Z=KEJ0$=B diff --git a/.gradle/8.7/fileHashes/fileHashes.lock b/.gradle/8.7/fileHashes/fileHashes.lock index 5a8ab076119ae909fea9fd5b41ea41761c83d6ed..2c6c21e716dbfa22b91a195ceb60d26dfb4dcccb 100644 GIT binary patch literal 17 TcmZSPvg^&${A<(700CVydTNKdwv>SlbnQSpcPMgt4c&5j<^m?!&t^9dx* bsIc*m58BvRmw0!fdyvEAdM}g7`CcLby5Km? delta 55 zcmdlxgYo)w#tkMCg3_HIwtR86^Gag?1JB=^VTest Summary
-
0.594s
+
0.580s

duration

@@ -85,7 +85,7 @@

Packages

16 0 0 -0.581s +0.566s 100% @@ -95,7 +95,7 @@

Packages

11 0 0 -0.013s +0.014s 100% @@ -122,7 +122,7 @@

Classes

3 0 0 -0.032s +0.030s 100% @@ -132,7 +132,7 @@

Classes

4 0 0 -0.004s +0s 100% @@ -142,7 +142,7 @@

Classes

2 0 0 -0.541s +0.532s 100% @@ -172,7 +172,7 @@

Classes

11 0 0 -0.013s +0.014s 100% @@ -186,7 +186,7 @@

Classes

Generated by -Gradle 8.7 at Jul 1, 2025, 8:28:50 AM

+Gradle 8.7 at Jul 1, 2025, 9:15:25 AM

diff --git a/build/reports/tests/test/packages/com.corezoid.sdk.test.html b/build/reports/tests/test/packages/com.corezoid.sdk.test.html index 2d0e168..01bcc79 100644 --- a/build/reports/tests/test/packages/com.corezoid.sdk.test.html +++ b/build/reports/tests/test/packages/com.corezoid.sdk.test.html @@ -40,7 +40,7 @@

Package com.corezoid.sdk.test

-
0.013s
+
0.014s

duration

@@ -83,7 +83,7 @@

Classes

11 0 0 -0.013s +0.014s 100% @@ -96,7 +96,7 @@

Classes

Generated by -Gradle 8.7 at Jul 1, 2025, 8:28:50 AM

+Gradle 8.7 at Jul 1, 2025, 9:15:25 AM

diff --git a/build/reports/tests/test/packages/default-package.html b/build/reports/tests/test/packages/default-package.html index 2a1d859..a992898 100644 --- a/build/reports/tests/test/packages/default-package.html +++ b/build/reports/tests/test/packages/default-package.html @@ -40,7 +40,7 @@

Default package

-
0.581s
+
0.566s

duration

@@ -83,7 +83,7 @@

Classes

3 0 0 -0.032s +0.030s 100% @@ -93,7 +93,7 @@

Classes

4 0 0 -0.004s +0s 100% @@ -103,7 +103,7 @@

Classes

2 0 0 -0.541s +0.532s 100% @@ -136,7 +136,7 @@

Classes

Generated by -Gradle 8.7 at Jul 1, 2025, 8:28:50 AM

+Gradle 8.7 at Jul 1, 2025, 9:15:25 AM

diff --git a/build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml b/build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml index 8b089c4..130bf05 100644 --- a/build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml +++ b/build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml @@ -1,9 +1,9 @@ - + - + - + diff --git a/build/test-results/test/TEST-CorezoidMessageTest.xml b/build/test-results/test/TEST-CorezoidMessageTest.xml index 9344089..5bca837 100644 --- a/build/test-results/test/TEST-CorezoidMessageTest.xml +++ b/build/test-results/test/TEST-CorezoidMessageTest.xml @@ -1,10 +1,10 @@ - + - - - - + + + + diff --git a/build/test-results/test/TEST-HttpManagerTest.xml b/build/test-results/test/TEST-HttpManagerTest.xml index bca920d..1a3e6f2 100644 --- a/build/test-results/test/TEST-HttpManagerTest.xml +++ b/build/test-results/test/TEST-HttpManagerTest.xml @@ -1,8 +1,8 @@ - + - - + + diff --git a/build/test-results/test/TEST-RequestOperationTest.xml b/build/test-results/test/TEST-RequestOperationTest.xml index aa5385e..8b34f58 100644 --- a/build/test-results/test/TEST-RequestOperationTest.xml +++ b/build/test-results/test/TEST-RequestOperationTest.xml @@ -1,5 +1,5 @@ - + diff --git a/build/test-results/test/TEST-ResponseOperationTest.xml b/build/test-results/test/TEST-ResponseOperationTest.xml index 2f2b715..b0759ee 100644 --- a/build/test-results/test/TEST-ResponseOperationTest.xml +++ b/build/test-results/test/TEST-ResponseOperationTest.xml @@ -1,5 +1,5 @@ - + diff --git a/build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml b/build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml index 186ef8a..4e29734 100644 --- a/build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml +++ b/build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml @@ -1,7 +1,7 @@ - + - + @@ -18,14 +18,14 @@ >>testRequestOperationShouldThrowException : ref is empty >>testGetConvQueryModifyRefMessage : body {"ops":[{"obj_id":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} -url https://api.corezoid.com/api/1/json/12345/1751358530/2f50be5f1b3f87426fa801b7a0f8bd24fb5fc288e92eea208f4e1d4df30668db +url https://api.corezoid.com/api/1/json/12345/1751361325/9c77b8d0c293e77eb215dfb67b3e29370ee1b257 >>testGetConvQueryModifyRefMessage : body {"ops":[{"ref":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} -url https://api.corezoid.com/api/1/json/12345/1751358530/4daf50212e7e2c4237a7b173678dbdf79083e92d8ad557b08f3d7b8ffacdc7a5 +url https://api.corezoid.com/api/1/json/12345/1751361325/b08b0bbe09937a6ba42866f4ab632bccb6347b4c >>testcheckAnswerShouldThrowException : Request processing failed, request_proc = fail >>testGetConvQueryCreateMessage : body {"ops":[{"ref":"11","conv_id":"1234","type":"create","obj":"task","data":{"phone":"1","card":"2"}}]} -url https://api.corezoid.com/api/1/json/12345/1751358530/5d6f3a1e98aef8e7a8e83594a3dad77cc33f095813b2f3bd5a5483226ec83dc0 +url https://api.corezoid.com/api/1/json/12345/1751361325/8e7eb8f0546ac26116ed92907ca8a7871fb63753 >>checkSignTrue : true >>testCheckAnswerReturnsNotEmptyMap : {PB11345969838=ok} >>testGetConAnswerMessage : diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin index 7f9e0cf..180f83b 100644 --- a/build/test-results/test/binary/output.bin +++ b/build/test-results/test/binary/output.bin @@ -4,14 +4,14 @@ :>>testRequestOperationShouldThrowException : ref is empty %>>testGetConvQueryModifyRefMessage : obody {"ops":[{"obj_id":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} -}url https://api.corezoid.com/api/1/json/12345/1751358530/2f50be5f1b3f87426fa801b7a0f8bd24fb5fc288e92eea208f4e1d4df30668db +eurl https://api.corezoid.com/api/1/json/12345/1751361325/9c77b8d0c293e77eb215dfb67b3e29370ee1b257 %>>testGetConvQueryModifyRefMessage : lbody {"ops":[{"ref":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} -}url https://api.corezoid.com/api/1/json/12345/1751358530/4daf50212e7e2c4237a7b173678dbdf79083e92d8ad557b08f3d7b8ffacdc7a5 +eurl https://api.corezoid.com/api/1/json/12345/1751361325/b08b0bbe09937a6ba42866f4ab632bccb6347b4c X>>testcheckAnswerShouldThrowException : Request processing failed, request_proc = fail ">>testGetConvQueryCreateMessage : lbody {"ops":[{"ref":"11","conv_id":"1234","type":"create","obj":"task","data":{"phone":"1","card":"2"}}]} -}url https://api.corezoid.com/api/1/json/12345/1751358530/5d6f3a1e98aef8e7a8e83594a3dad77cc33f095813b2f3bd5a5483226ec83dc0 +eurl https://api.corezoid.com/api/1/json/12345/1751361325/8e7eb8f0546ac26116ed92907ca8a7871fb63753 >>checkSignTrue : true 9>>testCheckAnswerReturnsNotEmptyMap : {PB11345969838=ok} >>testGetConAnswerMessage : diff --git a/build/test-results/test/binary/output.bin.idx b/build/test-results/test/binary/output.bin.idx index 3f981954feb4c6ffdfa7ad3e62dd23430d0f1658..0c5de7ed3b7085fbc3e14db3ad9541eef6bc67da 100644 GIT binary patch literal 366 zcmZP+=N4l?1sDIL0SSmaBR`a0jVAwJ5+cDQ0;SiYE0BUnFhi|k7DHDc4OLJCp;yT$+j literal 366 zcmZP+=N4l?1sDIL0SSmaBR`a0jVAwJ5+cE*1Er6mE0BUnFuTEMbOq8-iA4~a#R6S{ z3{+w#j7C==3zfJ6qtO+}K_plOp|l~o0(q#!VhGLl5M6-+M1oxtLUUp$P=rWusljM; F697yLyBh!i diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin index e6ae7be740461ba59c7b42e549db313d1601dd09..1b4750c0514a12f4f7786ee6d6f27f484ec5688f 100644 GIT binary patch delta 395 zcmYjMze_?<7`^x1``+_<4Mf6>N118-!AaZJKXo;fd85-RB z2O^M&_Wq2v^6%)QR2mNFJBRN(d}kOPMjvXn(P=psbP_=)DU8kp7Y(x3Sacxg2ht-e z8+YbnF z3;#w2`M0W*IJ5SrhdPCkRi(HP##T z&AJq^EX!1;gtnxI^*XM9xq?@D5}AHeV~Ho++j02z1_jjFBJS)op-3kUyxYgbn}|6F x#9Qb(K5cEYCA>KqLW$fRjGY#_O_s!=n(b~w_5-r&TKoV2 delta 395 zcmYjMyGjF56ufuu-Cg1XLXa5m<{inyn1sy(1+fwfn?w)`8;ivYR)Uzy(!xd*H&a-o z^9Mu-BKH1(y`84C5K$Bb4;q8TFlUByhBMt@H+Wh#m3HK~--`IHgit!_?>5Mav0z6| zbfiO8+`nHSO2FaErt& zW^rS#6PFRPR){Ouv|QS9Sq#_KG@(dt4Sj2o+&W8O)y@+tq#7)V3%f|D(#{+n?3z@1 Go_zztdT6fz diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/CorezoidMessage$1.class.uniqueId3 b/build/tmp/compileJava/compileTransaction/stash-dir/CorezoidMessage$1.class.uniqueId3 new file mode 100644 index 0000000000000000000000000000000000000000..42a5641d81b85f5e3c53067c0abf56dad63c130f GIT binary patch literal 1129 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 U5D`0C7VvybeYpQ>6CH^DKXRGJ{Qv*} literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/HttpManager.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/HttpManager.class.uniqueId0 index f731c90d2bcb1fa3408a5391a3f50bb4d67ba993..7c5cf827f7e94bb666c3668584f47583f9d8bbf4 100644 GIT binary patch delta 504 zcmYL_%S%*Y7{-5RbWDeF!gEH+&2Sb%h-gYhFpz__8ZUSO7cCWCNNRYgMSnxP5BeXX zmDD0!%yPu3yj$L~nk==n(wfW!^*INz&G$V#-}C;S^Pbd|jp|V5csvE%w6XF-%`OF-ij0E5=$&=enm6hE>ESq==O>6(i80yFKfNy^>$Dw z_7JPAiDolEJ4wyl(w}&zErJyBh;`m;_PO3a@KL$P)RN_sJV>ASr`h1M+P;`<+11yxSnEPu1l&}tb6clc=Q_{x-1@zX)WyB$BerDuH$h|GJK&VuU8(Mle9HAw zeZ}(rVt*x@lDR?r2;(Py)#0~=D*mVwu}MQj9kw$8sSzaA5j&|SYD4Jfi+FHGcYWVh205<3M7D`wTQ}+3x3dAVlvnrtpMrHuhmF^3<&7k38iT0hl<1 zXLwHSDb8QuC3#1&07e+0rh%YJ;PfM^$(j! zCVzRlWwk_zWRR4K$i!WGjKULN8j6XiFfn0m8Dr@s{ zNy`Yl$Tijf#HD`FWbsA!I!=uqDPBfKbw&{e5k@8nWkyv7Sw=<$Mv=*NjGm$*OuVuT z5{y7e1_ee&Sq27WAbav1#z<))MxaUtbw);B1_n<*FE4LBJuV-Hmg4+8v&{iaxzJ3SGKx=D(R5%G+MKGHB?P1{Sg&FNQq^`gJdEO-cX&-?1M<8A9TXXbCwCVqa|#Lf v@-Z+lF!4^_UZkWZCJyE?izrJh=F?lkr$3o*DkE5kaVei3^HfGgpjrk1vQ%Of delta 339 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 literal 0 HcmV?d00001 diff --git a/build/tmp/compileTestJava/compileTransaction/stash-dir/CorezoidMessageTest.class.uniqueId3 b/build/tmp/compileTestJava/compileTransaction/stash-dir/CorezoidMessageTest.class.uniqueId3 new file mode 100644 index 0000000000000000000000000000000000000000..c51036fb689815f459d71f9005357439efbe11b1 GIT binary patch literal 2175 zcma)7ZCe{f6g@)%yM(2{@**!)Y1&d!D6y?=6=)SB_|iZt(5Tdk%VruDHoIYWV@03- zD4)ltMnCui{82uh*$pJTRGSZzojWt<+k`KCy-=WAR%_8=(FqA_PUniPZOXQgfr&v4Lk5O1B5=+2t9jcG zj$b~cKxh5dk!2eETA0BVT-7jT;2Ne+WG#tVK(~D_vK*!QL_1?)*9tb2TAnQza$72% z>jq{pE09S%-3;oKG(EkQcr|Arue?gt16RjQelS9nsoMtL#~m^SGORJZJanbW)UIr+ zpqlB>aZjMb-`DXWX+o#s=~&=bol44e7{=z`b9x&BEHQ1-_k~&-(k>*(~+X&OcRa&uO}O>o#qz z^_S0HD#t%J@CCjkXw3>jx#Wc}WFT<)9M{|1VAZNE=qOTT!uDVdk2E|s@D)x+8;4YsaO0^QJK!?K%20mvgCvg9a!=_KZ*g#f3bLe^Qw^O#!%u$Qray)dX>4*Dn`u-OP1@D z1;iE=P^*vIGoINCeeb9#yVxpqms#se1djVeIoq*8~qBem|F+`8D7n%CC;0|I82 zf3jsQzJxURl(p4}$1B{m;nxFOt~e@Nqvs@KP94J~e9d=4{W`%rA6*>3q8TR?_~P`SpW^_pWD{8oVh%$w^+*EWr0(IJxs4y_g2hwH#hut8 z``Do;+^?b>j-9!cIAh*DO=}{}O{35-M(S~rO|;PsH|h8q@_w8=LsvegTP2R78!$hh z0`ul#0}mD_8u+9Y;RQ+rz6u6``k4hKXcE;xlSaMU63@@jR7jJGWe)hSP)5vU713v_ z=G|HI;U8G-Km!|!D-|a#3F|6nQ_%UY3}ZUxn@mnO`BKz(Hx5f@fDZN;!agxnniGpl ROO=*1E#4`uYqWRZ;9s%03&a2b literal 0 HcmV?d00001 diff --git a/build/tmp/compileTestJava/compileTransaction/stash-dir/HttpManagerTest.class.uniqueId1 b/build/tmp/compileTestJava/compileTransaction/stash-dir/HttpManagerTest.class.uniqueId1 new file mode 100644 index 0000000000000000000000000000000000000000..a3d4d6876e55944697927fbdff7e3e09772f41e2 GIT binary patch literal 2164 zcmb7F?Q+vb6g}%WR!~Ij7!sNWXrQLp2}Sh#!-O`tp>ZpR54)!Q)luxlQ6g(yX+=ri zs((s`&h!B~eULsyr*|b`3v4s#jJ>Pfy?f8O_uSq6>)#iD0@%clIx?8ikTo!i97Ey2 zerlVp?e)z2dk4HD8FIHB&yjZ+X3CYehB=0-9nm*C!so}r>6$_J&-%;aaGAs8TO3|YAnx87eoFsqEi0J(O=qxdm#$_Ha1uCBY%c?$o zRWhtR3h8Y0dD{sbqPgXHLfVP07pKUk0w=;}mH@WcZi;M-)S z=xtKZaA!#7A(2rLF1=1>;{@dq@InNzM3Bq$XkLgwm*b5?(Afku1y#^h0Vi=Q8VX8V z-}oIjQc=ZeE2Nxikt?#L`&98~*rIQx!CfNq4Si>@jeFFqG=EQX-(rXUk7!1xnI?X~ HW32oK*k(>8 literal 0 HcmV?d00001 diff --git a/build/tmp/compileTestJava/compileTransaction/stash-dir/UtiisTest.class.uniqueId0 b/build/tmp/compileTestJava/compileTransaction/stash-dir/UtiisTest.class.uniqueId2 similarity index 98% rename from build/tmp/compileTestJava/compileTransaction/stash-dir/UtiisTest.class.uniqueId0 rename to build/tmp/compileTestJava/compileTransaction/stash-dir/UtiisTest.class.uniqueId2 index 82c4b1c2f2fc3d2c5911c161a28165c79d8367ff..b6905c1037c25ffa6fd7150158b934ba11348fee 100644 GIT binary patch delta 76 zcmX@&f5(5q9R~*kgCxt8w4_86%alYTQzK)Glr&4@Gz%m1WTRxmq*QYYlSI?BlvFS? cIXN*oHN_%1DakU`!o=9XG|^%+3*!Mb0O55QZ~y=R delta 52 zcmccPf5d;n9Sx0C1H&{!OCt-@WCP1&i`29<6BElsGlR6$G|QBvWaDIuG-FFc)0E9J Hj0e;J+)ohW diff --git a/build/tmp/compileTestJava/previous-compilation-data.bin b/build/tmp/compileTestJava/previous-compilation-data.bin index dc7ca4087c6e66daa407bfa06a507c85946af3fd..5dcc3e8c92e9d7b54c2d104340f6db16688afddb 100644 GIT binary patch delta 198 zcmeC$&Dgb@al&5#XUCI5YAQmDc_-iTfx*<*%-PVKp(DR2wJJX|g_Dtmm79O_GDdw4M*Yp#IPYl) zWS!%k>ii?1eyfg#=f>>!r#2rk;ujP$6;Q9Y)ib>HQ2(%rWb&7%TUKv=>Rimis?W&4 yXu3JpV;?J!lJV2v0UF~PrO(7@I=M7vGNbuq&e$S;6K0m}+zbp1i~@{6k^unQr#ylH delta 198 zcmeC$&Dgb@al&7L=|-=rUWEOTUZ}opO-^S+++<$H1WR87XG1+BJ#k}(_SC$R%#uo3 z6NZlbqSUJV%oI*W7FKS4VFm_Mf3qM%bB2!8;)49V;#6ivW>$gC%NX@J7)>`{2e`DQgCg7mKW;u^#4jkMFR*mB%E6;TrA5wL7jW>d-mSO!sdF(4t0^M` yqyFYtkA18_O2$uv2WX6Ils*%q{^Zh_$&4nGIb)0X&6!!Yb2Bh7FbXgNNd^F)qCOh{ diff --git a/src/main/java/com/corezoid/sdk/entity/CorezoidMessage.java b/src/main/java/com/corezoid/sdk/entity/CorezoidMessage.java index d6d486c..bd86e7e 100644 --- a/src/main/java/com/corezoid/sdk/entity/CorezoidMessage.java +++ b/src/main/java/com/corezoid/sdk/entity/CorezoidMessage.java @@ -207,7 +207,7 @@ public int hashCode() { //---------------------------------------------------------------------------------------------------------------------- /** - * Generate signature {SIGNATURE} = hex( sha256({GMT_UNIXTIME} + {API_SECRET} + * Generate signature {SIGNATURE} = hex( sha1({GMT_UNIXTIME} + {API_SECRET} * + {CONTENT} + {API_SECRET}) ) * * @param time - time @@ -217,17 +217,17 @@ public int hashCode() { */ private static String generateSign(String time, String apiSecret, String body) { - MessageDigest sha256 = messageDigest.get(); - sha256.reset(); + MessageDigest sha1 = messageDigest.get(); + sha1.reset(); byte[] bytes; - String sha256hex; + String sha1hex; try { bytes = (time + apiSecret + body + apiSecret).getBytes("UTF-8"); - sha256hex = HexFormat.of().formatHex(sha256.digest(bytes)).toLowerCase(); + sha1hex = HexFormat.of().formatHex(sha1.digest(bytes)).toLowerCase(); } catch (UnsupportedEncodingException e) { throw new RuntimeException("generateSign error", e); } - return sha256hex; + return sha1hex; } //---------------------------------------------------------------------------------------------------------------------- @@ -235,7 +235,7 @@ private static String generateSign(String time, String apiSecret, @Override protected MessageDigest initialValue() { try { - return MessageDigest.getInstance("SHA-256"); + return MessageDigest.getInstance("SHA-1"); } catch (NoSuchAlgorithmException ex) { throw new RuntimeException("MessageDigest init error", ex); } diff --git a/src/test/java/com/corezoid/sdk/test/UtiisTest.java b/src/test/java/com/corezoid/sdk/test/UtiisTest.java index 556c01c..a6ead7d 100644 --- a/src/test/java/com/corezoid/sdk/test/UtiisTest.java +++ b/src/test/java/com/corezoid/sdk/test/UtiisTest.java @@ -30,11 +30,11 @@ void tearDown() throws Exception { } /** - * Valid signature check test (updated for SHA-256) + * Valid signature check test */ @Test void testCheckSignTrue() { - String sign = "00b9dfba49da25238df93f827c2c1be784a5fde1be78ccaced8cbb9e84305a8b"; + String sign = "e01f19285c09c8eff449a60fef9dbc3c8f3915db"; String key = "tgGsR8FTuLXzzVBsp3rngeSgOB2E2pMFJDwAXarbrs92GmLiiy"; String time = "1389956320"; String content = "{\n" From 88452189177ec3aabce3ae833e0d7eb1d7a56f4c Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 1 Jul 2025 09:53:31 +0000 Subject: [PATCH 3/3] Add comprehensive documentation for Corezoid Java SDK Co-authored-by: dm --- .../8.7/executionHistory/executionHistory.bin | Bin 50769 -> 50769 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.7/fileHashes/fileHashes.bin | Bin 21197 -> 21197 bytes .gradle/8.7/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.7/fileHashes/resourceHashesCache.bin | Bin 19517 -> 19721 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes DOCUMENTATION_SUMMARY.md | 166 ++++++ QUICK_REFERENCE.md | 232 +++++++++ README.md | 78 +++ TROUBLESHOOTING.md | 489 ++++++++++++++++++ build/reports/tests/test/index.html | 18 +- .../test/packages/com.corezoid.sdk.test.html | 6 +- .../tests/test/packages/default-package.html | 12 +- .../TEST-CorezoidMessageIntegrationTest.xml | 6 +- .../test/TEST-CorezoidMessageTest.xml | 2 +- .../test/TEST-HttpManagerTest.xml | 4 +- .../test/TEST-RequestOperationTest.xml | 4 +- .../test/TEST-ResponseOperationTest.xml | 6 +- .../TEST-com.corezoid.sdk.test.UtiisTest.xml | 18 +- build/test-results/test/binary/output.bin | 6 +- build/test-results/test/binary/results.bin | Bin 2075 -> 2075 bytes .../CorezoidMessage$1.class.uniqueId3 | Bin 1129 -> 1127 bytes .../stash-dir/CorezoidMessage.class.uniqueId2 | Bin 8435 -> 8431 bytes .../compileJava/previous-compilation-data.bin | Bin 29439 -> 29439 bytes .../corezoid/sdk/entity/CorezoidMessage.java | 73 ++- .../com/corezoid/sdk/utils/HttpManager.java | 101 +++- 26 files changed, 1162 insertions(+), 59 deletions(-) create mode 100644 DOCUMENTATION_SUMMARY.md create mode 100644 QUICK_REFERENCE.md create mode 100644 TROUBLESHOOTING.md diff --git a/.gradle/8.7/executionHistory/executionHistory.bin b/.gradle/8.7/executionHistory/executionHistory.bin index 308028b33f6323273736e334694f80f01115f1f6..95b4c23e8914bb60f10b2b611ed8a825839638cc 100644 GIT binary patch delta 1404 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 bMNaW?6;k*w&?cdI{=$)b7DfgJv*RZKpgU%( diff --git a/.gradle/8.7/executionHistory/executionHistory.lock b/.gradle/8.7/executionHistory/executionHistory.lock index 4db4c07b420f4b66870cdfb89869a9eba378cdfb..9ce6d999bd8fedc6fa8d6cdfd7487e9c228ec8fb 100644 GIT binary patch literal 17 TcmZQ};|LFTu02)F00A-pBOe1H literal 17 TcmZQ};|LFTu02)F00H6vBN_u7 diff --git a/.gradle/8.7/fileHashes/fileHashes.bin b/.gradle/8.7/fileHashes/fileHashes.bin index 85e3974f516e4c74a98b4aad679f8a2f32a7160a..e94e39fd61812563667afdf7f7cb407e556ceab5 100644 GIT binary patch delta 975 zcmX@Rl=19R#tr@+3i&Lu7D`?Zd2=TU=s%d?$Hc(EIQ?jf!wLp4FnKdM-{Y3T+O(}t zucjZI@2j!wvO|&gMzEr^xF--rioYgjdY0AK-OlNpZ*a?E-P+X~7I&Oy1}jRJd<{{= zk`AQxjDdtE5G#VPfZ2EE%tLvb-&{?wFnBb3jSN)B8=xc*u<8Q|G#wTz0tJf}%xvFV zy}wSnQECHJ#|NOw&2e6Wj9!JZlRaEQCN<2e`=>c6{MTEkf}bD*85qPsE=DubF<;Ns zQGCg#3xQgX*6-Nr3DF_NvU#UB2eX9R?SDo3=e|skl?W4Ao_TF8L{`pX@=ZT|=5!#< z?Jp$}nR9%{HH|mzFQ4!l=GvsP!4=s8CBGNg#@?G|@w6!*YyH}oH)2pp>&f{*$q%gt zSJ|8A@=kX-{U_yaW++tBYVtyVsruKinXb4L1%$po!Et|b!qx9EonWspa7tkM<=?DK zABSk$Nlo3R_DR!E+Mw#-5X986H|vG*)lcmg=O^A_SfYCGFw6l!m5D&i@fA}`a=qOQ zWvS(l<}R6U;P!mxb2Lk)Vd{u7>X>`F>3r*)H{7{)`bvy29g}AVNO`pg2zcLo&%7p0 zMdaFBkG-2P zxiVl;!I%G!%+~a6Q-c0{h(l%~CKelVgLVB#N`Izv@4J vLAd134?XRVEG2Ns{vat8#s@!l3(8LpEZ-nnQIM0)1Cs>W0R&72Ktc}ydZi{g delta 975 zcmX@Rl=19R#tr@+3V|26tSa|s#Yi5UQpuJ4djbOki@F%VKxgUXe2-fSzf#|9 zNU(3)TKaO~xsTc=FTskWTmvAA1TRj`^en5t_JqaXYwvSC(cdrKj7s*_ffc#3t%4|G zNe9w;#y~<7h!sItAg$-tRD*r;)f$EDCo}S^)c9jw*XZFUF*sQ)XA_p&P$NdE9)HZROcT7^;>l`JU3>)KLu5=6=Wa-gV+-wfoA0C zdXW|fvjWR|r{8SQn=54l)vA4$T?QVx98o<7k}?ehDwG`&Id~F zIC_o$m@p?3*KVGO-C0KMaLI-KQuV$|ih5aoCS)gk+wuHM*F6E4B-kqqoFbTh5qkP; z-Hh~oxmQ)UzgQsIy$4kXhajd7_9a?dKSsqZI{nn7Mp|Ac1xZIDP&LO_OfB6rXKU_*W3e?1E?(X!u4 zN%s$wJ#R~ZN(O@rV_;yy;<|?{%Ck7?v!=fczI~=u8SXl$4#v|!ZDAGMaG)4u)u?P2pC=rdH@989xVU> diff --git a/.gradle/8.7/fileHashes/fileHashes.lock b/.gradle/8.7/fileHashes/fileHashes.lock index 2c6c21e716dbfa22b91a195ceb60d26dfb4dcccb..90784c4a72d4e5fafc59fd86b9fe55ccb786e9de 100644 GIT binary patch literal 17 TcmZSPvg^&${A<(700HL#CUFD( literal 17 TcmZSPvg^&${A<(700C)8&tG$@>j_W0TbQNt=^62I-r8_lS8E}1iTljy)^yTEdUjKKDiYr7`trJ z(nVVrCPvXVe72*Lu^-yW>X{4bt+dWE$% qXGGt8pr9P8in||j{z^K>n(>Et9O~-bwq$a>m&s&bFPF*I-XZ`)PfjiX delta 52 zcmV-40L%Z0ngP9-0kAX}0Unbz7+|x-7-#{LMH*m}y&5o+1sgDvO&d}I0^zYC_!qG- KI2E%&Nc;oa6A~H# diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index a9968a638e0fc3365a4c0c7b19b60092c22aae2b..440800c32ab5bf554a9aaf11979cb01e4d220126 100644 GIT binary patch literal 17 UcmZRcW92ewLc~XV1_+1(051;&A^-pY literal 17 UcmZRcW92ewLc~XV1_ result = CorezoidMessage.parseAnswer(response); +``` + +### Modify Task by Reference + +```java +ObjectNode updateData = mapper.createObjectNode(); +updateData.put("status", "processed"); + +RequestOperation operation = RequestOperation.modifyRef(conveyorId, reference, updateData); +CorezoidMessage message = CorezoidMessage.request(apiSecret, apiLogin, + Collections.singletonList(operation)); +``` + +### Modify Task by ID + +```java +ObjectNode updateData = mapper.createObjectNode(); +updateData.put("notes", "Updated via API"); + +RequestOperation operation = RequestOperation.modifyId(conveyorId, taskId, updateData); +CorezoidMessage message = CorezoidMessage.request(apiSecret, apiLogin, + Collections.singletonList(operation)); +``` + +### Batch Operations + +```java +List operations = Arrays.asList( + RequestOperation.create(conveyorId, "ref-1", data1), + RequestOperation.create(conveyorId, "ref-2", data2), + RequestOperation.modifyRef(conveyorId, "existing-ref", updateData) +); + +CorezoidMessage message = CorezoidMessage.request(apiSecret, apiLogin, operations); +String response = httpManager.send(message); +Map results = CorezoidMessage.parseAnswer(response); +``` + +## Error Handling + +```java +try { + String response = httpManager.send(message); + Map results = CorezoidMessage.parseAnswer(response); + + for (Map.Entry entry : results.entrySet()) { + if ("ok".equals(entry.getValue())) { + System.out.println("Success: " + entry.getKey()); + } else { + System.err.println("Failed: " + entry.getKey() + " - " + entry.getValue()); + } + } + +} catch (HttpException e) { + // Network/HTTP errors + System.err.println("HTTP Error: " + e.getMessage()); + +} catch (Exception e) { + // Parsing/other errors + System.err.println("Error: " + e.getMessage()); +} +``` + +## Response Verification (Callbacks) + +```java +// Verify incoming callback signatures +public boolean verifyCallback(HttpServletRequest request, String requestBody) { + String signature = request.getParameter("signature"); + String timestamp = request.getParameter("gmt_unixtime"); + + return CorezoidMessage.checkSign(signature, apiSecret, timestamp, requestBody); +} +``` + +## Configuration Examples + +### Development Environment +```java +HttpManager devManager = new HttpManager(5, 3000, 10000); +``` + +### Production Environment +```java +HttpManager prodManager = new HttpManager(50, 5000, 15000); +``` + +### Slow Network +```java +HttpManager slowManager = new HttpManager(10, 10000, 30000); +``` + +## Common Patterns + +### Unique Reference Generation +```java +public String generateReference(String prefix) { + return prefix + "-" + System.currentTimeMillis() + "-" + + ThreadLocalRandom.current().nextInt(1000, 9999); +} +``` + +### Retry Logic +```java +public String sendWithRetry(CorezoidMessage message, int maxRetries) throws HttpException { + HttpException lastException = null; + + for (int attempt = 1; attempt <= maxRetries; attempt++) { + try { + return httpManager.send(message); + } catch (HttpException e) { + lastException = e; + if (attempt < maxRetries) { + try { + Thread.sleep(1000 * attempt); // Exponential backoff + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + break; + } + } + } + } + + throw lastException; +} +``` + +### Async Processing +```java +CompletableFuture future = CompletableFuture.supplyAsync(() -> { + try { + return httpManager.send(message); + } catch (HttpException e) { + throw new RuntimeException(e); + } +}); + +future.thenAccept(response -> { + // Process response asynchronously +}); +``` + +## Status Codes + +| Status | Meaning | +|--------|---------| +| `ok` | Operation successful | +| `fail` | Operation failed | +| `error` | System error occurred | + +## HTTP Error Codes + +| Code | Meaning | Action | +|------|---------|--------| +| 401 | Unauthorized | Check API credentials | +| 403 | Forbidden | Check conveyor permissions | +| 404 | Not Found | Verify conveyor ID | +| 429 | Rate Limited | Implement retry with backoff | +| 500 | Server Error | Retry with exponential backoff | + +## Best Practices + +- ✅ **Reuse HttpManager** - Create once, use throughout application +- ✅ **Handle exceptions** - Always catch HttpException and parsing errors +- ✅ **Use batch operations** - More efficient than individual requests +- ✅ **Generate unique references** - Include timestamps or UUIDs +- ✅ **Verify signatures** - Always validate callback signatures +- ✅ **Configure timeouts** - Set appropriate values for your network +- ✅ **Enable logging** - Use DEBUG level for troubleshooting + +## Common Mistakes + +- ❌ Creating new HttpManager for each request +- ❌ Not handling exceptions properly +- ❌ Using placeholder API credentials +- ❌ Not verifying callback signatures +- ❌ Hardcoding sensitive data +- ❌ Not using unique task references + +## Quick Debugging + +```java +// Enable debug logging +logger.debug("Request URL: {}", message.url); +logger.debug("Request Body: {}", message.body); +logger.debug("Response: {}", response); + +// Manual signature verification +String expectedSignature = generateSignature(time, apiSecret, body); +logger.debug("Expected: {}, Received: {}", expectedSignature, receivedSignature); +``` + +## Links + +- [Full Documentation](README.md) +- [Troubleshooting Guide](TROUBLESHOOTING.md) +- [Corezoid API Docs](https://doc.corezoid.com/) \ No newline at end of file diff --git a/README.md b/README.md index 720ddef..551fe47 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,64 @@ updateData.put("processed_at", System.currentTimeMillis()); RequestOperation modifyOperation = RequestOperation.modifyRef(conveyorId, reference, updateData); CorezoidMessage message = CorezoidMessage.request(apiSecret, apiLogin, Collections.singletonList(modifyOperation)); + +String response = httpManager.send(message); +Map result = CorezoidMessage.parseAnswer(response); +System.out.println("Update status: " + result.get(reference)); +``` + +### Error Handling + +```java +import com.corezoid.sdk.utils.HttpException; + +public void createTaskWithErrorHandling() { + try { + // Create and send request + RequestOperation operation = RequestOperation.create(conveyorId, reference, taskData); + CorezoidMessage message = CorezoidMessage.request(apiSecret, apiLogin, + Collections.singletonList(operation)); + + String response = httpManager.send(message); + Map result = CorezoidMessage.parseAnswer(response); + + String status = result.get(reference); + if ("ok".equals(status)) { + System.out.println("Task created successfully!"); + } else { + System.err.println("Task creation failed with status: " + status); + } + + } catch (HttpException e) { + System.err.println("Network error: " + e.getMessage()); + // Handle connection issues, timeouts, HTTP errors + + } catch (Exception e) { + System.err.println("Parsing error: " + e.getMessage()); + // Handle JSON parsing errors, invalid responses + } +} +``` + +### Batch Operations + +```java +// Process multiple tasks in a single request +List operations = new ArrayList<>(); + +// Add multiple operations +operations.add(RequestOperation.create("1234", "order-1", taskData1)); +operations.add(RequestOperation.create("1234", "order-2", taskData2)); +operations.add(RequestOperation.modifyRef("1234", "existing-ref", updateData)); + +CorezoidMessage batchMessage = CorezoidMessage.request(apiSecret, apiLogin, operations); +String response = httpManager.send(batchMessage); + +// Parse batch results +Map results = CorezoidMessage.parseAnswer(response); +for (Map.Entry entry : results.entrySet()) { + System.out.println("Reference: " + entry.getKey() + ", Status: " + entry.getValue()); +} ``` ## Configuration @@ -168,6 +226,24 @@ HttpManager httpManager = new HttpManager(int maxConnections, int connectionTime String response = httpManager.send(CorezoidMessage message) ``` +## Troubleshooting + +For common issues, error handling patterns, and debugging tips, see the [Troubleshooting Guide](TROUBLESHOOTING.md). + +Common issues include: +- **Authentication failures** - Check API credentials and conveyor permissions +- **Connection timeouts** - Adjust HttpManager timeout settings +- **JSON parsing errors** - Validate request data and response format +- **Memory leaks** - Reuse HttpManager instances instead of creating new ones + +## Best Practices + +- **Reuse HttpManager instances** - Create once, use many times for better performance +- **Handle errors gracefully** - Always catch HttpException and parsing exceptions +- **Use batch operations** - Process multiple tasks in single requests when possible +- **Generate unique references** - Include timestamps or UUIDs to avoid conflicts +- **Enable debug logging** - Use DEBUG level for troubleshooting issues + ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. @@ -178,5 +254,7 @@ This project is licensed under the MIT License - see the LICENSE file for detail ## Additional Resources +- [Quick Reference Guide](QUICK_REFERENCE.md) - Concise examples and common patterns +- [Troubleshooting Guide](TROUBLESHOOTING.md) - Common issues and solutions - [Corezoid API Documentation](https://doc.corezoid.com/en/api/upload_modify.html) - [Corezoid Website](https://corezoid.com/) diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md new file mode 100644 index 0000000..9cceafb --- /dev/null +++ b/TROUBLESHOOTING.md @@ -0,0 +1,489 @@ +# Corezoid Java SDK - Troubleshooting Guide + +This guide covers common issues, error handling patterns, and best practices when using the Corezoid Java SDK. + +## Table of Contents + +- [Common Issues](#common-issues) +- [Error Handling](#error-handling) +- [Best Practices](#best-practices) +- [Performance Optimization](#performance-optimization) +- [Security Considerations](#security-considerations) +- [Debugging Tips](#debugging-tips) + +## Common Issues + +### 1. Authentication Failures + +**Problem**: Getting 401 Unauthorized or signature validation errors + +**Symptoms**: +``` +HttpException: Fail to send POST request to url https://api.corezoid.com/api/1/json/your_login/timestamp/signature, code : '401' +``` + +**Solutions**: +```java +// ✅ Correct: Ensure API credentials are valid +String apiSecret = "your_actual_api_secret"; // Not placeholder text +String apiLogin = "your_actual_api_login"; // Not placeholder text + +// ✅ Correct: Verify conveyor ID is correct +String conveyorId = "12345"; // Use actual conveyor ID from Corezoid dashboard + +// ❌ Common mistake: Using placeholder values +String apiSecret = "your_api_secret"; // This will fail! +``` + +**Debug Steps**: +1. Verify your API credentials in the Corezoid dashboard +2. Check that the conveyor ID exists and is accessible +3. Ensure system clock is synchronized (signatures are time-sensitive) +4. Test with a simple create operation first + +### 2. Connection Timeouts + +**Problem**: Requests timing out or connection refused + +**Symptoms**: +``` +HttpException: Fail to send POST request, Connection timeout +``` + +**Solutions**: +```java +// ✅ Increase timeouts for slow networks +HttpManager httpManager = new HttpManager( + 10, // maxConnections + 10000, // connectionTimeout: 10 seconds + 30000 // responseTimeout: 30 seconds +); + +// ✅ Configure retry logic +public String sendWithRetry(CorezoidMessage message, int maxRetries) { + HttpManager httpManager = new HttpManager(); + + for (int attempt = 1; attempt <= maxRetries; attempt++) { + try { + return httpManager.send(message); + } catch (HttpException e) { + if (attempt == maxRetries) { + throw e; // Re-throw on final attempt + } + + // Exponential backoff + try { + Thread.sleep(1000 * attempt); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + throw new RuntimeException("Interrupted during retry", ie); + } + } + } + return null; // Never reached +} +``` + +### 3. JSON Parsing Errors + +**Problem**: Invalid JSON in request data or response parsing failures + +**Symptoms**: +``` +Exception: Cannot parse response JSON +``` + +**Solutions**: +```java +// ✅ Validate your data before sending +ObjectMapper mapper = new ObjectMapper(); +ObjectNode taskData = mapper.createObjectNode(); + +// Ensure all values are properly typed +taskData.put("customer_id", "12345"); // String +taskData.put("amount", new BigDecimal("100.50")); // Use BigDecimal for money +taskData.put("timestamp", System.currentTimeMillis()); // Long +taskData.put("active", true); // Boolean + +// ✅ Handle parsing errors gracefully +try { + Map result = CorezoidMessage.parseAnswer(response); + // Process result... +} catch (Exception e) { + logger.error("Failed to parse Corezoid response: {}", response, e); + // Handle parsing failure... +} +``` + +### 4. Memory Leaks with HttpManager + +**Problem**: Application running out of memory or connection pool exhaustion + +**Solutions**: +```java +// ❌ Wrong: Creating new HttpManager for each request +public void processTask(TaskData data) { + HttpManager httpManager = new HttpManager(); // Creates new connection pool! + // ... use httpManager +} // Connection pool not properly closed + +// ✅ Correct: Reuse HttpManager instance +public class CorezoidService { + private final HttpManager httpManager; + + public CorezoidService() { + this.httpManager = new HttpManager(20, 5000, 15000); + } + + public void processTask(TaskData data) { + // Reuse the same HttpManager instance + String response = httpManager.send(message); + } + + // ✅ Implement proper cleanup if needed + @PreDestroy + public void cleanup() { + // HttpManager uses Apache HttpClient which handles cleanup automatically + // No manual cleanup needed in most cases + } +} +``` + +## Error Handling + +### Comprehensive Error Handling Pattern + +```java +public class CorezoidService { + private static final Logger logger = LoggerFactory.getLogger(CorezoidService.class); + private final HttpManager httpManager; + + public CorezoidService() { + this.httpManager = new HttpManager(10, 5000, 10000); + } + + public TaskResult createTask(String conveyorId, String reference, ObjectNode data) { + try { + // Create operation + RequestOperation operation = RequestOperation.create(conveyorId, reference, data); + CorezoidMessage message = CorezoidMessage.request( + apiSecret, apiLogin, Collections.singletonList(operation) + ); + + // Send request + String response = httpManager.send(message); + logger.debug("Corezoid response: {}", response); + + // Parse response + Map result = CorezoidMessage.parseAnswer(response); + String status = result.get(reference); + + if ("ok".equals(status)) { + return TaskResult.success(reference, response); + } else { + return TaskResult.failure(reference, "Task processing failed: " + status); + } + + } catch (HttpException e) { + logger.error("HTTP error creating task {}: {}", reference, e.getMessage(), e); + return TaskResult.error(reference, "Network error: " + e.getMessage()); + + } catch (Exception e) { + logger.error("Unexpected error creating task {}: {}", reference, e.getMessage(), e); + return TaskResult.error(reference, "Internal error: " + e.getMessage()); + } + } + + // Result wrapper class + public static class TaskResult { + private final boolean success; + private final String reference; + private final String message; + private final String response; + + private TaskResult(boolean success, String reference, String message, String response) { + this.success = success; + this.reference = reference; + this.message = message; + this.response = response; + } + + public static TaskResult success(String reference, String response) { + return new TaskResult(true, reference, "Success", response); + } + + public static TaskResult failure(String reference, String message) { + return new TaskResult(false, reference, message, null); + } + + public static TaskResult error(String reference, String message) { + return new TaskResult(false, reference, message, null); + } + + // Getters... + public boolean isSuccess() { return success; } + public String getReference() { return reference; } + public String getMessage() { return message; } + public String getResponse() { return response; } + } +} +``` + +## Best Practices + +### 1. Thread Safety + +```java +// ✅ HttpManager is thread-safe - can be shared across threads +public class CorezoidService { + private final HttpManager httpManager = new HttpManager(); + + // This method can be called from multiple threads safely + public void processTask(TaskData data) { + String response = httpManager.send(message); + // Process response... + } +} + +// ✅ CorezoidMessage is immutable - thread-safe +CorezoidMessage message = CorezoidMessage.request(apiSecret, apiLogin, operations); +// Can be safely used across multiple threads +``` + +### 2. Connection Pool Management + +```java +// ✅ Configure appropriate connection pool size +HttpManager httpManager = new HttpManager( + 50, // maxConnections: Based on expected concurrent requests + 5000, // connectionTimeout: 5 seconds + 15000 // responseTimeout: 15 seconds +); + +// ✅ For high-throughput applications +HttpManager highThroughputManager = new HttpManager( + 100, // Higher connection pool + 3000, // Faster connection timeout + 10000 // Reasonable response timeout +); +``` + +### 3. Reference Generation + +```java +// ✅ Generate unique references +public String generateReference(String prefix) { + return prefix + "-" + System.currentTimeMillis() + "-" + + ThreadLocalRandom.current().nextInt(1000, 9999); +} + +// ✅ For distributed systems, include instance ID +public String generateDistributedReference(String prefix, String instanceId) { + return prefix + "-" + instanceId + "-" + System.currentTimeMillis() + "-" + + UUID.randomUUID().toString().substring(0, 8); +} +``` + +### 4. Batch Operations + +```java +// ✅ Process multiple operations in a single request +public void processBatch(List tasks) { + List operations = tasks.stream() + .map(task -> RequestOperation.create( + task.getConveyorId(), + generateReference("batch"), + task.getData() + )) + .collect(Collectors.toList()); + + CorezoidMessage message = CorezoidMessage.request(apiSecret, apiLogin, operations); + String response = httpManager.send(message); + + // Parse batch response + Map results = CorezoidMessage.parseAnswer(response); + // Process results... +} +``` + +## Performance Optimization + +### 1. Connection Reuse + +```java +// ✅ Singleton pattern for HttpManager +@Component +public class CorezoidHttpManager { + private final HttpManager httpManager; + + public CorezoidHttpManager(@Value("${corezoid.max-connections:20}") int maxConnections, + @Value("${corezoid.connection-timeout:5000}") int connectionTimeout, + @Value("${corezoid.response-timeout:15000}") int responseTimeout) { + this.httpManager = new HttpManager(maxConnections, connectionTimeout, responseTimeout); + } + + public HttpManager getHttpManager() { + return httpManager; + } +} +``` + +### 2. Async Processing Pattern + +```java +// ✅ Async processing with CompletableFuture +@Service +public class AsyncCorezoidService { + private final HttpManager httpManager; + private final Executor executor; + + public AsyncCorezoidService() { + this.httpManager = new HttpManager(); + this.executor = ForkJoinPool.commonPool(); + } + + public CompletableFuture createTaskAsync(String conveyorId, String reference, ObjectNode data) { + return CompletableFuture.supplyAsync(() -> { + try { + RequestOperation operation = RequestOperation.create(conveyorId, reference, data); + CorezoidMessage message = CorezoidMessage.request( + apiSecret, apiLogin, Collections.singletonList(operation) + ); + + String response = httpManager.send(message); + Map result = CorezoidMessage.parseAnswer(response); + + return TaskResult.success(reference, response); + } catch (Exception e) { + return TaskResult.error(reference, e.getMessage()); + } + }, executor); + } +} +``` + +## Security Considerations + +### 1. API Credential Management + +```java +// ✅ Use environment variables or secure configuration +public class CorezoidConfig { + @Value("${corezoid.api.secret}") + private String apiSecret; + + @Value("${corezoid.api.login}") + private String apiLogin; + + // ❌ Never hard-code credentials + // private String apiSecret = "actual_secret_here"; // DON'T DO THIS! +} +``` + +### 2. Data Sanitization + +```java +// ✅ Sanitize sensitive data before sending +public ObjectNode sanitizeTaskData(ObjectNode originalData) { + ObjectNode sanitized = originalData.deepCopy(); + + // Remove or mask sensitive fields + if (sanitized.has("ssn")) { + sanitized.put("ssn", "***-**-" + sanitized.get("ssn").asText().substring(7)); + } + + if (sanitized.has("credit_card")) { + String cc = sanitized.get("credit_card").asText(); + sanitized.put("credit_card", "**** **** **** " + cc.substring(cc.length() - 4)); + } + + return sanitized; +} +``` + +## Debugging Tips + +### 1. Enable Debug Logging + +```xml + + + + + +``` + +### 2. Request/Response Logging + +```java +public class DebugCorezoidService { + private static final Logger logger = LoggerFactory.getLogger(DebugCorezoidService.class); + + public String sendWithLogging(CorezoidMessage message) throws HttpException { + logger.debug("Sending request to URL: {}", message.url); + logger.debug("Request body: {}", message.body); + + long startTime = System.currentTimeMillis(); + String response = httpManager.send(message); + long duration = System.currentTimeMillis() - startTime; + + logger.debug("Response received in {}ms: {}", duration, response); + return response; + } +} +``` + +### 3. Common Error Codes + +| HTTP Code | Meaning | Solution | +|-----------|---------|----------| +| 401 | Unauthorized | Check API credentials and signature | +| 403 | Forbidden | Verify conveyor access permissions | +| 404 | Not Found | Check conveyor ID and API endpoint | +| 429 | Rate Limited | Implement exponential backoff | +| 500 | Server Error | Retry with backoff, check Corezoid status | + +### 4. Signature Debugging + +```java +// Debug signature generation +public void debugSignature(String time, String apiSecret, String body) { + String stringToSign = time + apiSecret + body + apiSecret; + logger.debug("String to sign: {}", stringToSign); + + // Manual signature calculation for debugging + try { + MessageDigest sha1 = MessageDigest.getInstance("SHA-1"); + byte[] bytes = stringToSign.getBytes("UTF-8"); + byte[] digest = sha1.digest(bytes); + String signature = HexFormat.of().formatHex(digest).toLowerCase(); + logger.debug("Generated signature: {}", signature); + } catch (Exception e) { + logger.error("Signature generation failed", e); + } +} +``` + +## Getting Help + +If you're still experiencing issues: + +1. **Check the logs** - Enable DEBUG logging for detailed information +2. **Verify credentials** - Test with Corezoid dashboard or API tools +3. **Check network connectivity** - Ensure you can reach api.corezoid.com +4. **Review API documentation** - [Corezoid API Docs](https://doc.corezoid.com/) +5. **Contact support** - Reach out to Corezoid support with logs and error details + +## FAQ + +**Q: Why am I getting "Invalid signature" errors?** +A: The SDK uses SHA-1 for signature generation as required by the Corezoid API. Ensure your system clock is synchronized and API credentials are correct. + +**Q: Can I use this SDK in a multi-threaded environment?** +A: Yes, the SDK is thread-safe. You can share a single HttpManager instance across multiple threads. + +**Q: How do I handle rate limiting?** +A: Implement exponential backoff when you receive 429 responses. Start with 1-second delays and double the delay on each retry. + +**Q: What's the maximum number of operations per request?** +A: Check the Corezoid API documentation for current limits. Generally, batch operations are more efficient than individual requests. \ No newline at end of file diff --git a/build/reports/tests/test/index.html b/build/reports/tests/test/index.html index 7042107..292fa95 100644 --- a/build/reports/tests/test/index.html +++ b/build/reports/tests/test/index.html @@ -38,7 +38,7 @@

Test Summary

-
0.580s
+
0.601s

duration

@@ -85,7 +85,7 @@

Packages

16 0 0 -0.566s +0.590s 100% @@ -95,7 +95,7 @@

Packages

11 0 0 -0.014s +0.011s 100% @@ -122,7 +122,7 @@

Classes

3 0 0 -0.030s +0.031s 100% @@ -142,7 +142,7 @@

Classes

2 0 0 -0.532s +0.552s 100% @@ -152,7 +152,7 @@

Classes

4 0 0 -0.003s +0.004s 100% @@ -162,7 +162,7 @@

Classes

3 0 0 -0.001s +0.003s 100% @@ -172,7 +172,7 @@

Classes

11 0 0 -0.014s +0.011s 100% @@ -186,7 +186,7 @@

Classes

Generated by -Gradle 8.7 at Jul 1, 2025, 9:15:25 AM

+Gradle 8.7 at Jul 1, 2025, 9:52:38 AM

diff --git a/build/reports/tests/test/packages/com.corezoid.sdk.test.html b/build/reports/tests/test/packages/com.corezoid.sdk.test.html index 01bcc79..c6c8e42 100644 --- a/build/reports/tests/test/packages/com.corezoid.sdk.test.html +++ b/build/reports/tests/test/packages/com.corezoid.sdk.test.html @@ -40,7 +40,7 @@

Package com.corezoid.sdk.test

-
0.014s
+
0.011s

duration

@@ -83,7 +83,7 @@

Classes

11 0 0 -0.014s +0.011s 100% @@ -96,7 +96,7 @@

Classes

Generated by -Gradle 8.7 at Jul 1, 2025, 9:15:25 AM

+Gradle 8.7 at Jul 1, 2025, 9:52:38 AM

diff --git a/build/reports/tests/test/packages/default-package.html b/build/reports/tests/test/packages/default-package.html index a992898..e00e95a 100644 --- a/build/reports/tests/test/packages/default-package.html +++ b/build/reports/tests/test/packages/default-package.html @@ -40,7 +40,7 @@

Default package

-
0.566s
+
0.590s

duration

@@ -83,7 +83,7 @@

Classes

3 0 0 -0.030s +0.031s 100% @@ -103,7 +103,7 @@

Classes

2 0 0 -0.532s +0.552s 100% @@ -113,7 +113,7 @@

Classes

4 0 0 -0.003s +0.004s 100% @@ -123,7 +123,7 @@

Classes

3 0 0 -0.001s +0.003s 100% @@ -136,7 +136,7 @@

Classes

Generated by -Gradle 8.7 at Jul 1, 2025, 9:15:25 AM

+Gradle 8.7 at Jul 1, 2025, 9:52:38 AM

diff --git a/build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml b/build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml index 130bf05..69521a3 100644 --- a/build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml +++ b/build/test-results/test/TEST-CorezoidMessageIntegrationTest.xml @@ -1,8 +1,8 @@ - + - - + + diff --git a/build/test-results/test/TEST-CorezoidMessageTest.xml b/build/test-results/test/TEST-CorezoidMessageTest.xml index 5bca837..89541eb 100644 --- a/build/test-results/test/TEST-CorezoidMessageTest.xml +++ b/build/test-results/test/TEST-CorezoidMessageTest.xml @@ -1,5 +1,5 @@ - + diff --git a/build/test-results/test/TEST-HttpManagerTest.xml b/build/test-results/test/TEST-HttpManagerTest.xml index 1a3e6f2..09482c0 100644 --- a/build/test-results/test/TEST-HttpManagerTest.xml +++ b/build/test-results/test/TEST-HttpManagerTest.xml @@ -1,7 +1,7 @@ - + - + diff --git a/build/test-results/test/TEST-RequestOperationTest.xml b/build/test-results/test/TEST-RequestOperationTest.xml index 8b34f58..4bfcb6f 100644 --- a/build/test-results/test/TEST-RequestOperationTest.xml +++ b/build/test-results/test/TEST-RequestOperationTest.xml @@ -1,10 +1,10 @@ - + - + diff --git a/build/test-results/test/TEST-ResponseOperationTest.xml b/build/test-results/test/TEST-ResponseOperationTest.xml index b0759ee..d4c654b 100644 --- a/build/test-results/test/TEST-ResponseOperationTest.xml +++ b/build/test-results/test/TEST-ResponseOperationTest.xml @@ -1,9 +1,9 @@ - + - - + + diff --git a/build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml b/build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml index 4e29734..80fcff8 100644 --- a/build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml +++ b/build/test-results/test/TEST-com.corezoid.sdk.test.UtiisTest.xml @@ -1,31 +1,31 @@ - + - + - + - - + + - + >testRequestOperationShouldThrowException : ref and taskId is null >>testRequestOperationShouldThrowException : taskId is empty >>testRequestOperationShouldThrowException : ref and taskId is null >>testRequestOperationShouldThrowException : ref is empty >>testGetConvQueryModifyRefMessage : body {"ops":[{"obj_id":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} -url https://api.corezoid.com/api/1/json/12345/1751361325/9c77b8d0c293e77eb215dfb67b3e29370ee1b257 +url https://api.corezoid.com/api/1/json/12345/1751363558/b45354cf865adc098d87ddfee042bfa073308b5f >>testGetConvQueryModifyRefMessage : body {"ops":[{"ref":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} -url https://api.corezoid.com/api/1/json/12345/1751361325/b08b0bbe09937a6ba42866f4ab632bccb6347b4c +url https://api.corezoid.com/api/1/json/12345/1751363558/b1e87e654e7f1f8e378e04a63ed6b8ed0dedef69 >>testcheckAnswerShouldThrowException : Request processing failed, request_proc = fail >>testGetConvQueryCreateMessage : body {"ops":[{"ref":"11","conv_id":"1234","type":"create","obj":"task","data":{"phone":"1","card":"2"}}]} -url https://api.corezoid.com/api/1/json/12345/1751361325/8e7eb8f0546ac26116ed92907ca8a7871fb63753 +url https://api.corezoid.com/api/1/json/12345/1751363558/fb6b8de2bc6477d4aa5bb05c1bdc1857ee899693 >>checkSignTrue : true >>testCheckAnswerReturnsNotEmptyMap : {PB11345969838=ok} >>testGetConAnswerMessage : diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin index 180f83b..f3c1ba9 100644 --- a/build/test-results/test/binary/output.bin +++ b/build/test-results/test/binary/output.bin @@ -4,14 +4,14 @@ :>>testRequestOperationShouldThrowException : ref is empty %>>testGetConvQueryModifyRefMessage : obody {"ops":[{"obj_id":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} -eurl https://api.corezoid.com/api/1/json/12345/1751361325/9c77b8d0c293e77eb215dfb67b3e29370ee1b257 +eurl https://api.corezoid.com/api/1/json/12345/1751363558/b45354cf865adc098d87ddfee042bfa073308b5f %>>testGetConvQueryModifyRefMessage : lbody {"ops":[{"ref":"11","conv_id":"1234","type":"modify","obj":"task","data":{"phone":"1","card":"2"}}]} -eurl https://api.corezoid.com/api/1/json/12345/1751361325/b08b0bbe09937a6ba42866f4ab632bccb6347b4c +eurl https://api.corezoid.com/api/1/json/12345/1751363558/b1e87e654e7f1f8e378e04a63ed6b8ed0dedef69 X>>testcheckAnswerShouldThrowException : Request processing failed, request_proc = fail ">>testGetConvQueryCreateMessage : lbody {"ops":[{"ref":"11","conv_id":"1234","type":"create","obj":"task","data":{"phone":"1","card":"2"}}]} -eurl https://api.corezoid.com/api/1/json/12345/1751361325/8e7eb8f0546ac26116ed92907ca8a7871fb63753 +eurl https://api.corezoid.com/api/1/json/12345/1751363558/fb6b8de2bc6477d4aa5bb05c1bdc1857ee899693 >>checkSignTrue : true 9>>testCheckAnswerReturnsNotEmptyMap : {PB11345969838=ok} >>testGetConAnswerMessage : diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin index 1b4750c0514a12f4f7786ee6d6f27f484ec5688f..3f9bc6bc8a52441cca1a96309180ce89b1327978 100644 GIT binary patch delta 407 zcmYjNJx>Bb6x_SryOS@y5JhmkMbHR%K?6wm1r|17Vk~T|Bxglpq_VWIF&d94Ea+@3 zjR_iK?;kM6;8&;o4xf=D7L&J`H#;+VUAt?amkm!@BIY-eek092HRkVEi3%~hBPKgS z5*6`3t09ds?c&i>QAlmg@Z>GmaI9qr*^u+MlTWzO+(0Rx@vT+3Cto1-+@dEx^zcc$ zdC=Z$ws!M{e@}KLhUOf5`Z^^V=;bq_94-u*?$#huBxtd4c8|4tb5{J9@lA zont&c>O2l5azPa}fw~wKQ#Ou7iBjUY6WdWf%${P&OPm=Al#Ep}n`SAT8uNrDk|yzB zY|%_1ZvGaW!H(%hf}6}T2lwUz!KIypfmw^Np{-(RY*=|hVZ^1`9Ih>wP$qo_Usf?3 HcxBlS=8kDG delta 407 zcmYjNyG{Z@6rI_b*<~3_2r&e+K}3*cS-}7z@!4%*11848#!3<^6C;(Sg^kg;oWg?6 zA224w7<)g%PWcY6aoJd$oVn+|&Yf|3oPKDjK$qlP*w2Oif(Uduyy%d$!qOu-Kavhf zmGHA;GsgJiN1$CeJWxSmDmZRt1uh5NP+IUTa1MHi!fxgY4wDyt125im34b E0GAXF9smFU diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index c4a88011bc575a985920e034d82a6f1bb92242d0..6c9a6b368d9761c6ff9521643d87ec40830fd34a 100644 GIT binary patch delta 118 zcmV-+0Ez$q+D0vY+iZ!SFxoh-t*fx3h|dEhO#vnVhhc7EXJv8_ YaUGLLL{yT1ntuK%l2`ievrPfAam)2HaR2}S delta 118 zcmV-+0Ez$q * This method checks if a received signature matches the calculated signature - * for the given content, time, and API secret. + * for the given content, time, and API secret. This is typically used when + * processing callbacks or webhooks from Corezoid to ensure message authenticity. *

+ * + *

Security Note: This method uses SHA-1 hashing as required + * by the Corezoid API specification. While SHA-1 is cryptographically weak, + * it cannot be changed without breaking compatibility with Corezoid servers.

* - * @param sign The signature to verify (from the SIGNATURE query parameter) - * @param apiSecret The API secret key used for signing + * @param sign The signature to verify (from the SIGNATURE query parameter in callbacks) + * @param apiSecret The API secret key used for signing (same as used for requests) * @param time The timestamp when the message was created (from the GMT_UNIXTIME query parameter) - * @param content The message body content - * @return true if the signature is valid, false otherwise + * @param content The message body content (JSON string) + * @return true if the signature is valid and the message is authentic, false otherwise + * + * @see #request(String, String, List) for creating signed requests + * + * @example + *
{@code
+     * // Verify a callback from Corezoid
+     * boolean isValid = CorezoidMessage.checkSign(
+     *     request.getParameter("signature"),
+     *     "your_api_secret",
+     *     request.getParameter("gmt_unixtime"),
+     *     requestBody
+     * );
+     * 
+     * if (isValid) {
+     *     // Process the callback
+     * } else {
+     *     // Reject the request - invalid signature
+     * }
+     * }
*/ public static boolean checkSign(String sign, String apiSecret, String time, String content) { @@ -130,12 +154,43 @@ public static boolean checkSign(String sign, String apiSecret, String time, * Parses a response from the Corezoid API into a map of reference-to-status pairs. *

* This method processes the JSON response from the Corezoid API and extracts - * the status of each operation, indexed by the task reference. + * the status of each operation, indexed by the task reference. This is used + * to determine the success or failure of individual operations in a request. *

+ * + *

Response Format: The expected JSON format is:

+ *
{@code
+     * {
+     *   "request_proc": "ok",
+     *   "ops": [
+     *     {"ref": "task-ref-1", "proc": "ok"},
+     *     {"ref": "task-ref-2", "proc": "fail"}
+     *   ]
+     * }
+     * }
* * @param jsonString The JSON response string from the Corezoid API - * @return A map where keys are task references and values are processing statuses - * @throws Exception if the response indicates a failure or cannot be parsed + * @return A map where keys are task references and values are processing statuses + * (typically "ok", "fail", or other status codes) + * @throws Exception if the response indicates a failure (request_proc != "ok") + * or the JSON cannot be parsed + * + * @example + *
{@code
+     * String response = httpManager.send(message);
+     * Map results = CorezoidMessage.parseAnswer(response);
+     * 
+     * for (Map.Entry entry : results.entrySet()) {
+     *     String taskRef = entry.getKey();
+     *     String status = entry.getValue();
+     *     
+     *     if ("ok".equals(status)) {
+     *         System.out.println("Task " + taskRef + " processed successfully");
+     *     } else {
+     *         System.err.println("Task " + taskRef + " failed: " + status);
+     *     }
+     * }
+     * }
*/ public static Map parseAnswer(String jsonString) throws Exception { ObjectMapper mapper = new ObjectMapper(); diff --git a/src/main/java/com/corezoid/sdk/utils/HttpManager.java b/src/main/java/com/corezoid/sdk/utils/HttpManager.java index 73b18ec..ba8d0f3 100644 --- a/src/main/java/com/corezoid/sdk/utils/HttpManager.java +++ b/src/main/java/com/corezoid/sdk/utils/HttpManager.java @@ -27,8 +27,25 @@ * request execution, and response handling. It provides methods for sending messages * to the Corezoid API and processing the responses. *

+ * + *

Thread Safety: This class is thread-safe and can be shared across + * multiple threads. It's recommended to create a single instance and reuse it throughout + * your application for optimal performance.

+ * + *

Connection Pooling: Uses Apache HttpClient's connection pooling + * for efficient connection reuse. The pool is automatically managed and cleaned up.

+ * + *

Best Practices:

+ *
    + *
  • Create one HttpManager instance per application, not per request
  • + *
  • Configure appropriate timeouts based on your network conditions
  • + *
  • Set maxConnections based on expected concurrent request volume
  • + *
  • Monitor connection pool usage in high-throughput scenarios
  • + *
* * @author Corezoid + * @see CorezoidMessage for creating messages to send + * @see HttpException for HTTP-related error handling */ public class HttpManager { //---------------------------------------------------------------------------------------------------------------------- @@ -37,12 +54,33 @@ public class HttpManager { //---------------------------------------------------------------------------------------------------------------------- /** + * Creates an HttpManager with custom connection pool and timeout settings. + *

+ * This constructor allows you to configure the HTTP client for your specific + * network conditions and performance requirements. + *

* - * create PoolingClientConnectionManager. - * - * @param maxCount max total connection, default max connection per route - * @param connectionTimeout milliseconds - * @param answerTimeout milliseconds + * @param maxCount Maximum total connections in the pool. This should be set based + * on your expected concurrent request volume. Default max connections + * per route is also set to this value. + * @param connectionTimeout Connection establishment timeout in milliseconds. + * Time to wait when establishing a connection to the server. + * Recommended: 3000-10000ms depending on network conditions. + * @param answerTimeout Response timeout in milliseconds. Time to wait for the server + * to send a complete response after the connection is established. + * Recommended: 10000-30000ms depending on expected response times. + * + * @example + *
{@code
+     * // For high-throughput applications
+     * HttpManager highThroughput = new HttpManager(50, 5000, 15000);
+     * 
+     * // For slow networks
+     * HttpManager slowNetwork = new HttpManager(10, 10000, 30000);
+     * 
+     * // For development/testing
+     * HttpManager development = new HttpManager(5, 3000, 10000);
+     * }
*/ public HttpManager(int maxCount, int connectionTimeout, int answerTimeout) { PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(); @@ -58,17 +96,62 @@ public HttpManager(int maxCount, int connectionTimeout, int answerTimeout) { } //---------------------------------------------------------------------------------------------------------------------- + /** + * Creates an HttpManager with default settings suitable for most applications. + *

+ * Default configuration: + *

    + *
  • Max connections: 15
  • + *
  • Connection timeout: 1000ms (1 second)
  • + *
  • Response timeout: 10000ms (10 seconds)
  • + *
+ *

+ * + *

These defaults work well for moderate-load applications. For high-throughput + * or special network conditions, consider using the parameterized constructor.

+ * + * @see #HttpManager(int, int, int) for custom configuration + */ public HttpManager() { this(15, 1000, 10000); } //---------------------------------------------------------------------------------------------------------------------- /** - * send request + * Sends a CorezoidMessage to the Corezoid API and returns the response. + *

+ * This method performs the actual HTTP POST request to the Corezoid API endpoint + * specified in the message URL. It handles the complete request/response cycle + * including connection management, error handling, and response parsing. + *

+ * + *

Error Handling: This method throws HttpException for various + * failure scenarios including network errors, timeouts, and HTTP error responses.

* - * @param message - corezoid message - * @return - * @throws org.apache.http.HttpException + * @param message The CorezoidMessage containing the request URL, body, and signature + * @return The raw JSON response string from the Corezoid API + * @throws HttpException if the request fails due to network issues, timeouts, + * HTTP error responses (4xx, 5xx), or other communication problems + * + * @example + *
{@code
+     * try {
+     *     HttpManager httpManager = new HttpManager();
+     *     CorezoidMessage message = CorezoidMessage.request(apiSecret, apiLogin, operations);
+     *     
+     *     String response = httpManager.send(message);
+     *     Map results = CorezoidMessage.parseAnswer(response);
+     *     
+     *     // Process results...
+     *     
+     * } catch (HttpException e) {
+     *     // Handle network/HTTP errors
+     *     logger.error("Failed to send request: " + e.getMessage(), e);
+     * }
+     * }
+ * + * @see CorezoidMessage#request(String, String, List) for creating messages + * @see CorezoidMessage#parseAnswer(String) for parsing responses */ public String send(CorezoidMessage message) throws HttpException { HttpPost post = new HttpPost(message.url);