git-off

git off handles large files in git repos
git clone https://noulin.net/git/git-off.git
Log | Files | Refs | README

rest.js (4000B)


      1 var util = require('../util');
      2 
      3 function populateMethod(req) {
      4   req.httpRequest.method = req.service.api.operations[req.operation].httpMethod;
      5 }
      6 
      7 function populateURI(req) {
      8   var operation = req.service.api.operations[req.operation];
      9   var input = operation.input;
     10   var uri = [req.httpRequest.endpoint.path, operation.httpPath].join('/');
     11   uri = uri.replace(/\/+/g, '/');
     12 
     13   var queryString = {}, queryStringSet = false;
     14   util.each(input.members, function (name, member) {
     15     var paramValue = req.params[name];
     16     if (paramValue === null || paramValue === undefined) return;
     17     if (member.location === 'uri') {
     18       var regex = new RegExp('\\{' + member.name + '(\\+)?\\}');
     19       uri = uri.replace(regex, function(_, plus) {
     20         var fn = plus ? util.uriEscapePath : util.uriEscape;
     21         return fn(String(paramValue));
     22       });
     23     } else if (member.location === 'querystring') {
     24       queryStringSet = true;
     25 
     26       if (member.type === 'list') {
     27         queryString[member.name] = paramValue.map(function(val) {
     28           return util.uriEscape(String(val));
     29         });
     30       } else if (member.type === 'map') {
     31         util.each(paramValue, function(key, value) {
     32           if (Array.isArray(value)) {
     33             queryString[key] = value.map(function(val) {
     34               return util.uriEscape(String(val));
     35             });
     36           } else {
     37             queryString[key] = util.uriEscape(String(value));
     38           }
     39         });
     40       } else {
     41         queryString[member.name] = util.uriEscape(String(paramValue));
     42       }
     43     }
     44   });
     45 
     46   if (queryStringSet) {
     47     uri += (uri.indexOf('?') >= 0 ? '&' : '?');
     48     var parts = [];
     49     util.arrayEach(Object.keys(queryString).sort(), function(key) {
     50       if (!Array.isArray(queryString[key])) {
     51         queryString[key] = [queryString[key]];
     52       }
     53       for (var i = 0; i < queryString[key].length; i++) {
     54         parts.push(util.uriEscape(String(key)) + '=' + queryString[key][i]);
     55       }
     56     });
     57     uri += parts.join('&');
     58   }
     59 
     60   req.httpRequest.path = uri;
     61 }
     62 
     63 function populateHeaders(req) {
     64   var operation = req.service.api.operations[req.operation];
     65   util.each(operation.input.members, function (name, member) {
     66     var value = req.params[name];
     67     if (value === null || value === undefined) return;
     68 
     69     if (member.location === 'headers' && member.type === 'map') {
     70       util.each(value, function(key, memberValue) {
     71         req.httpRequest.headers[member.name + key] = memberValue;
     72       });
     73     } else if (member.location === 'header') {
     74       value = member.toWireFormat(value).toString();
     75       req.httpRequest.headers[member.name] = value;
     76     }
     77   });
     78 }
     79 
     80 function buildRequest(req) {
     81   populateMethod(req);
     82   populateURI(req);
     83   populateHeaders(req);
     84 }
     85 
     86 function extractError() {
     87 }
     88 
     89 function extractData(resp) {
     90   var req = resp.request;
     91   var data = {};
     92   var r = resp.httpResponse;
     93   var operation = req.service.api.operations[req.operation];
     94   var output = operation.output;
     95 
     96   // normalize headers names to lower-cased keys for matching
     97   var headers = {};
     98   util.each(r.headers, function (k, v) {
     99     headers[k.toLowerCase()] = v;
    100   });
    101 
    102   util.each(output.members, function(name, member) {
    103     var header = (member.name || name).toLowerCase();
    104     if (member.location === 'headers' && member.type === 'map') {
    105       data[name] = {};
    106       var location = member.isLocationName ? member.name : '';
    107       var pattern = new RegExp('^' + location + '(.+)', 'i');
    108       util.each(r.headers, function (k, v) {
    109         var result = k.match(pattern);
    110         if (result !== null) {
    111           data[name][result[1]] = v;
    112         }
    113       });
    114     } else if (member.location === 'header') {
    115       if (headers[header] !== undefined) {
    116         data[name] = headers[header];
    117       }
    118     } else if (member.location === 'statusCode') {
    119       data[name] = parseInt(r.statusCode, 10);
    120     }
    121   });
    122 
    123   resp.data = data;
    124 }
    125 
    126 module.exports = {
    127   buildRequest: buildRequest,
    128   extractError: extractError,
    129   extractData: extractData
    130 };