1818import static java .util .Objects .nonNull ;
1919import static java .util .stream .Collectors .joining ;
2020
21+ import elemental2 .core .ArrayBuffer ;
22+ import elemental2 .core .TypedArray ;
23+ import elemental2 .core .Uint8Array ;
24+ import elemental2 .dom .Blob ;
25+ import elemental2 .dom .BlobPropertyBag ;
26+ import elemental2 .dom .FormData ;
27+ import elemental2 .dom .XMLHttpRequest ;
2128import java .util .ArrayList ;
2229import java .util .LinkedHashMap ;
2330import java .util .List ;
2431import java .util .Map ;
2532import org .dominokit .rest .shared .BaseRestfulRequest ;
33+ import org .dominokit .rest .shared .MultipartForm ;
2634import org .dominokit .rest .shared .RestfulRequest ;
2735import org .dominokit .rest .shared .request .RequestTimeoutException ;
2836import org .gwtproject .timer .client .Timer ;
29- import org .gwtproject .xhr .client .XMLHttpRequest ;
3037
3138/** JS implementation for {@link RestfulRequest} that uses {@link XMLHttpRequest} */
3239public class JsRestfulRequest extends BaseRestfulRequest {
3340
3441 public static final String CONTENT_TYPE = "Content-Type" ;
3542 public static final String APPLICATION_PDF = "application/pdf" ;
36- private XMLHttpRequest request ;
37- private Map <String , List <String >> params = new LinkedHashMap <>();
38- private Map <String , String > headers = new LinkedHashMap <>();
43+ private final XMLHttpRequest request ;
44+ private final Map <String , List <String >> params = new LinkedHashMap <>();
45+ private final Map <String , String > headers = new LinkedHashMap <>();
3946 private final Timer timer =
4047 new Timer () {
4148 @ Override
@@ -46,7 +53,7 @@ public void run() {
4653
4754 public JsRestfulRequest (String uri , String method ) {
4855 super (uri , method );
49- request = XMLHttpRequest . create ();
56+ request = new XMLHttpRequest ();
5057 parseUri (uri );
5158 }
5259
@@ -90,7 +97,7 @@ public RestfulRequest setQueryParam(String key, String value) {
9097 public RestfulRequest putHeader (String key , String value ) {
9198 if (CONTENT_TYPE .equalsIgnoreCase (key )) {
9299 if (APPLICATION_PDF .equalsIgnoreCase (value )) {
93- request .setResponseType ( XMLHttpRequest . ResponseType . ArrayBuffer ) ;
100+ request .responseType = "arraybuffer" ;
94101 }
95102 }
96103 headers .put (key , value );
@@ -138,6 +145,47 @@ public void sendJson(String json) {
138145 send (json );
139146 }
140147
148+ /** {@inheritDoc} */
149+ @ Override
150+ public void sendMultipartForm (MultipartForm multipartForm ) {
151+ initRequest ();
152+ FormData data = new FormData ();
153+ for (MultipartForm .TextMultipart textMultipart : multipartForm .getTextMultiParts ()) {
154+ BlobPropertyBag blobPropertyBag = BlobPropertyBag .create ();
155+ blobPropertyBag .setType (textMultipart .contentType ());
156+ Blob blob =
157+ new Blob (
158+ new Blob .ConstructorBlobPartsArrayUnionType [] {
159+ Blob .ConstructorBlobPartsArrayUnionType .of (textMultipart .value ())
160+ },
161+ blobPropertyBag );
162+ if (textMultipart .fileName ().isPresent ()) {
163+ data .append (textMultipart .name (), blob , textMultipart .fileName ().get ());
164+ } else {
165+ data .append (textMultipart .name (), blob );
166+ }
167+ }
168+ for (MultipartForm .FileMultipart fileMultipart : multipartForm .getFileMultiParts ()) {
169+ ArrayBuffer arrayBuffer = new ArrayBuffer (fileMultipart .value ().length );
170+ Uint8Array buffer = new Uint8Array (arrayBuffer );
171+ buffer .set (TypedArray .SetArrayUnionType .of (fileMultipart .value ()));
172+ BlobPropertyBag options = BlobPropertyBag .create ();
173+ options .setType (fileMultipart .contentType ());
174+ Blob blob =
175+ new Blob (
176+ new Blob .ConstructorBlobPartsArrayUnionType [] {
177+ Blob .ConstructorBlobPartsArrayUnionType .of (buffer )
178+ },
179+ options );
180+ if (fileMultipart .fileName ().isPresent ()) {
181+ data .append (fileMultipart .name (), blob , fileMultipart .fileName ().get ());
182+ } else {
183+ data .append (fileMultipart .name (), blob );
184+ }
185+ }
186+ request .send (data );
187+ }
188+
141189 /** {@inheritDoc} */
142190 @ Override
143191 public void send (String data ) {
@@ -155,20 +203,20 @@ public void send() {
155203 /** {@inheritDoc} */
156204 @ Override
157205 public void abort () {
158- request .clearOnReadyStateChange () ;
206+ request .onreadystatechange = p0 -> null ;
159207 request .abort ();
160208 }
161209
162210 /** {@inheritDoc} */
163211 @ Override
164212 public void setWithCredentials (boolean withCredentials ) {
165- request .setWithCredentials ( withCredentials ) ;
213+ request .withCredentials = withCredentials ;
166214 }
167215
168216 /** {@inheritDoc} */
169217 @ Override
170218 public RestfulRequest setResponseType (String responseType ) {
171- request .setResponseType ( responseType ) ;
219+ request .responseType = responseType ;
172220 return this ;
173221 }
174222
@@ -180,22 +228,23 @@ private void initRequest() {
180228 String url = getUri ();
181229 request .open (getMethod (), url );
182230 setHeaders ();
183- request .setOnReadyStateChange (
231+ request .onreadystatechange =
184232 xhr -> {
185- if (xhr . getReadyState () == XMLHttpRequest .DONE ) {
186- xhr . clearOnReadyStateChange () ;
233+ if (request . readyState == XMLHttpRequest .DONE ) {
234+ request . onreadystatechange = p0 -> null ;
187235 timer .cancel ();
188- successHandler .onResponseReceived (new JsResponse (xhr ));
236+ successHandler .onResponseReceived (new JsResponse (request ));
189237 }
190- });
238+ return null ;
239+ };
191240 if (getTimeout () > 0 ) {
192241 timer .schedule (getTimeout ());
193242 }
194243 }
195244
196245 private void fireOnTimeout () {
197246 timer .cancel ();
198- request .clearOnReadyStateChange () ;
247+ request .onreadystatechange = p0 -> null ;
199248 request .abort ();
200249 errorHandler .onError (new RequestTimeoutException ());
201250 }
0 commit comments