rhino-http-client.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /**
  2. * HTTP Client using the JSGI standard objects
  3. */
  4. var LazyArray = require("../../lazy-array").LazyArray;
  5. // configurable proxy server setting, defaults to http_proxy env var
  6. exports.proxyServer = require("../../process").env.http_proxy;
  7. exports.request = function(request){
  8. var url = new java.net.URL(request.url),
  9. connection = url.openConnection(),
  10. method = request.method || "GET",
  11. is = null,
  12. promised = true;
  13. if (request.jsgi && "async" in request.jsgi) promised = request.jsgi.async;
  14. for (var header in this.headers) {
  15. var value = this.headers[header];
  16. connection.addRequestProperty(String(header), String(value));
  17. }
  18. connection.setFollowRedirects(false)
  19. connection.setDoInput(true);
  20. connection.setRequestMethod(method);
  21. if (request.body && typeof request.body.forEach === "function") {
  22. connection.setDoOutput(true);
  23. var writer = new java.io.OutputStreamWriter(connection.getOutputStream());
  24. request.body.forEach(function(chunk) {
  25. writer.write(chunk);
  26. writer.flush();
  27. });
  28. }
  29. if (typeof writer !== "undefined") writer.close();
  30. try {
  31. connection.connect();
  32. is = connection.getInputStream();
  33. }
  34. catch (e) {
  35. is = connection.getErrorStream();
  36. }
  37. var status = Number(connection.getResponseCode()),
  38. headers = {};
  39. for (var i = 0;; i++) {
  40. var key = connection.getHeaderFieldKey(i),
  41. value = connection.getHeaderField(i);
  42. if (!key && !value)
  43. break;
  44. // returns the HTTP status code with no key, ignore it.
  45. if (key) {
  46. key = String(key).toLowerCase();
  47. value = String(value);
  48. if (headers[key]) {
  49. if (!Array.isArray(headers[key])) headers[key] = [headers[key]];
  50. headers[key].push(value);
  51. }
  52. else {
  53. headers[key] = value;
  54. }
  55. }
  56. }
  57. var reader = new java.io.BufferedReader(new java.io.InputStreamReader(is)),
  58. builder = new java.lang.StringBuilder(),
  59. line;
  60. // FIXME create deferred and LazyArray
  61. while((line = reader.readLine()) != null){
  62. builder.append(line + '\n');
  63. }
  64. if (typeof writer !== "undefined") writer.close();
  65. reader.close();
  66. return {
  67. status: status,
  68. headers: headers,
  69. body: LazyArray({
  70. some: function(write) {
  71. write(builder.toString());
  72. }
  73. })
  74. }
  75. };