invertase / dart_edge

Run Dart on the Edge - supporting Vercel & Cloudflare Workers (more coming soon).
https://docs.dartedge.dev
Apache License 2.0
318 stars 22 forks source link

How to make multi-part/form-data request in edge_http_client package? #22

Open Ansh-Rathod opened 1 year ago

Ansh-Rathod commented 1 year ago

Hey guys, loving this package in the edge function. but any plans to add muliPartRequest to the package?

Ehesp commented 1 year ago

@Ansh-Rathod ill have to investigate, however it should theoretically work, have you tried?

Cc @lesnitsky

Ansh-Rathod commented 1 year ago

@Ansh-Rathod ill have to investigate, however it should theoretically work, have you tried?

Cc @lesnitsky

yeah, i tried this, the major issue i think is it didn't added proper headers to request. every time headers was empty and response became 400 bad request.

Ehesp commented 1 year ago

Could you share the code? Will add a test case

MichealReed commented 1 year ago

@Ansh-Rathod how did you get this working? I can't find MultipartRequest anywhere in the edge library, and using the traditional http lib triggers

<ref *1> UnsupportedError {
  message: "Cannot create a client without dart:html or dart:io.",
  "$thrownJsError": <ref *2> Unsupported operation: Cannot create a client without dart:html or dart:io.
    at Object.wrapException (file:///src/main.dart.js:698:17)
    at Object.throwExpression (file:///src/main.dart.js:712:15)
    at Object.createClient (file:///src/main.dart.js:6951:16)
    at Object.Client_Client (file:///src/main.dart.js:6947:18)
    at file:///src/main.dart.js:13071:26
    at _wrapJsFunctionForAsync_closure.$protected (file:///src/main.dart.js:3324:15)
    at _wrapJsFunctionForAsync_closure.call$2 (file:///src/main.dart.js:8780:12)
    at Object._asyncStartSync (file:///src/main.dart.js:3288:20)
    at MultipartRequest.send$0 (file:///src/main.dart.js:13076:16)
    at file:///src/main.dart.js:14098:48 {
    dartException: [Circular *1],
    name: "",
    "$cachedTrace": _StackTrace { _exception: [Circular *2], _trace: null }
  }
}

and when trying with the provided fetch --

final mulitResponse = await edge.fetch(edge.Resource.request(httpRequest));

I see

The argument type 'MultipartRequest' can't be assigned to the parameter type 'Request'.dart[argument_type_not_assignable](https://dart.dev/diagnostics/argument_type_not_assignable)

nor does edge.fetch appear to support a StreamedResponse, which is what should be used in conjunction with MultipartRequest.

Ansh-Rathod commented 1 year ago

well, if you use runtimeclient with HTTP library.

MichealReed commented 1 year ago

well, if you use runtimeclient with HTTP library.

The problem is not with http, but the missing html/io libraries. Are you sure you got this working? Could you please share code? If it was not working for you please say so Invertase can prioritize this to be fixed.

I tried with

http.runWithClient(() => getResponse, () => EdgeHttpClient());

as well.

Any thoughts @Ehesp?