browserify / http-browserify

node's http module, but for the browser
MIT License
244 stars 110 forks source link

Support `FormData` #20

Open ForbesLindesay opened 10 years ago

ForbesLindesay commented 10 years ago

Posting FormData can be done using something like:

  var fd = new FormData()
  fd.append('image', file)
  var req = new XMLHttpRequest()
  req.onload = function () {
    callback(null, req.responseText)
  }
  req.onerror = callback
  req.open('post', 'https://api.imgur.com:443/3/image.json')
  req.setRequestHeader('Authorization', 'Client-ID ' + clientID)
  req.send(fd)

However, I can see know way of handling FormData using the built in http module.

(see https://github.com/substack/node-browserify/issues/439)

jackcviers commented 10 years ago

@ForbesLindesay take a look at mikeal/request. It does what you need with FormData, and has several nice examples.

ForbesLindesay commented 10 years ago

That's a server side library though, last I checked it wouldn't run on the client, and even if it does run on the client, requireing FormData on the client seems insane since it's already there.

What I'd like would be something where you could say:

var request = http.request(options)
request.end(FormData)

on the client.

jackcviers commented 10 years ago

@ForbesLindesay I am curious. What exactly are you doing with the FormData object?

If you are uploading in the browser you can already do that with jquery or something similar with the browsers' FormData implementation. If you like the http lib on node, and you want to use it to upload something from the browser, use the request lib with browserify. It transparently handles the problems for you. I guess I don't know how adding a FormData-browserify to the browserify stack will solve your issue.

My point is how would you write this on node using a feature of http that would handle FormData differently than the way a post encoded in multipart would work in http-browserify? On Jul 11, 2013 11:37 PM, "Forbes Lindesay" notifications@github.com wrote:

That's a server side library though, last I checked it wouldn't run on the client, and even if it does run on the client, requireing FormData on the client seems insane since it's already there.

What I'd like would be something where you could say:

var request = http.request(options)request.end(FormData)

on the client.

— Reply to this email directly or view it on GitHubhttps://github.com/substack/http-browserify/issues/20#issuecomment-20858112 .

ForbesLindesay commented 10 years ago

OK, what I'm doing is using it to upload images to imgur. I ended up with: https://github.com/ForbesLindesay/imsave/blob/master/lib/post.js on the server and https://github.com/ForbesLindesay/imsave/blob/master/lib/post-browser.js on the client.

What I'm saying is I'd like to be able to have the one file look something like:

var FD = FormData || require('form-data')
var hyperquest = require('hyperquest')
var concat = require('concat-stream')

module.exports = post
function post(file, clientID, callback) {
  var fd = new FD()
  fd.append('image', file)
  var headers = fd.getHeaders()
  headers.Authorization = 'Client-ID ' + clientID
  var req = hyperquest.post('https://api.imgur.com/3/image.json', {headers: headers})
  req.on('error', callback)

  //not sure what this API call should look like
  req.attachFormData(fd)

  req.pipe(concat(function (res) { callback(null, res) }))
}
juliangruber commented 10 years ago

see https://github.com/substack/http-browserify/issues/43

scottcorgan commented 10 years ago

has there been any work to support piping xhr2 files/buffers/etc into the request?

Ran into this headache recently and it breaks in Firefox.

lakenen commented 9 years ago

@ForbesLindesay did you ever figure out how to get hyperquest working with FormData?

ForbesLindesay commented 9 years ago

no, I'm just using browser APIs for making requests on the browser. Helps keep the bundle small since I don't need node streams on the client anyway.