Skip to content

Instantly share code, notes, and snippets.

@EdamAme-x
Created January 12, 2024 04:01
Show Gist options
  • Save EdamAme-x/12e0a3116ee9fe0ea9ec464fce33aef6 to your computer and use it in GitHub Desktop.
Save EdamAme-x/12e0a3116ee9fe0ea9ec464fce33aef6 to your computer and use it in GitHub Desktop.
parseCurlToFetch
/**
* @Author @amex2189
*/
const scan=(e,a,r)=>{let t="";for(;e.length>0;){let s=e.match(a);s?(t+=e.slice(0,s.index),t+=r(s),e=e.slice(s.index+s[0].length)):(t+=e,e="")}},splitReg=/\s*(?:([^\s\\\'\"]+)|'((?:[^\'\\]|\\.)*)'|"((?:[^\"\\]|\\.)*)"|(\\.?)|(\S))(\s|$)?/,split=e=>{void 0===e&&(e="");let a=[],r="";return scan(e,splitReg,([e,t,s,o,d,c,i])=>{if(void 0!==c)throw Error("Unmatched quote");r+=t||(s||o||d).replace(/\\(?=.)/,""),void 0!==i&&(a.push(r),r="")}),r&&a.push(r),a},rewrite=e=>e.reduce((e,a)=>(0===a.indexOf("-X")?(e.push("-X"),e.push(a.slice(2))):e.push(a),e),[]),matchUrl=/((^https?:\/\/)|(^(?:[0-9]{1,3}\.){3}[0-9]{1,3})|localhost)/,addArg=(e,a)=>e?e+"&"+a:a,capitalize=e=>e[0].toUpperCase()+e.slice(1).toLowerCase(),forbidden=["Accept-Charset","Accept-Encoding","Access-Control-Request-Headers","Access-Control-Request-Method","Connection","Content-Length","Cookie","Cookie2","Date","DNT","Expect","Host","Keep-Alive","Origin","Referer","TE","Trailer","Transfer-Encoding","Upgrade","Via",],parseCurlToContext=e=>{if(0!=e.indexOf("curl "))throw Error("Missing curl keyword");let a={method:"GET",headers:{}},r="",t="",s="",o="";rewrite(split(e)).forEach(e=>{switch(!0){case!a.url&&matchUrl.test(e):a.url=e;break;case"-A"==e||"--user-agent"==e:r="user-agent";break;case"-H"==e||"--header"==e:r="header";break;case"-F"==e||"--form"==e||"--form-data"==e:r="form";break;case"--form-string"==e:r="form-string";break;case"-d"==e||"--data"==e||"--data-ascii"==e||"--data-binary"==e:r="data";break;case"--data-urlencode"==e:r="url";break;case"-u"==e||"--user"==e:r="user";break;case"-I"==e||"--head"==e:a.method="HEAD";break;case"-X"==e||"--request"==e:r="method";break;case"-b"==e||"--cookie"==e:r="cookie";break;case"--compressed"==e:a.headers["Accept-Encoding"]||(a.headers["Accept-Encoding"]="deflate, gzip");break;case!!e:switch(r){case"header":let d=e.indexOf(":"),c=e.slice(0,d).split("-").map(capitalize).join("-");"Cookie"===c?a.credentials="include":a.headers[c]=e.slice(d+1).trim(),r="";break;case"user-agent":a.headers["User-Agent"]=e,r="";break;case"url":t=addArg(t,e),r="";break;case"data":case"data-binary":a.headers["Content-Type"]||(a.headers["Content-Type"]="application/x-www-form-urlencoded"),a.body="data"===r?addArg(a.body,e):a.body,r="";break;case"form-string":o=e;break;case"form":a.headers["Content-Type"]||(a.headers["Content-Type"]="multipart/form-data"),(a.formData||(a.formData=[])).push([e.slice(0,e.indexOf("=")),e.slice(e.indexOf("=")+1),]);break;case"user":a.headers.Authorization="Basic "+btoa(e),r="";break;case"method":a.method=e,r="";break;case"cookie":a.headers["Set-Cookie"]=e,r=""}break;default:s=e}}),t&&(a.url=a.url+(parseUrl(a.url).search?"&":"?")+t);let d=forbidden.filter(e=>e in a.headers).map(e=>(delete a.headers[e],e));if(d.length){let c=d.length>1?`${d.join(", ")} are forbidden headers`:`${d} is a forbidden header`;console.log(`${c} in fetch, so they are skipped (see https://fetch.spec.whatwg.org/#terminology-headers)`)}return o&&(a.headers["Content-Type"]+="; boundary="+o),a.body&&"get"===a.method.toLowerCase()&&(a.method="POST"),a},parseCurlToFetch=e=>{let a=parseCurlToContext(e);return new Request(a.url,a)};
// based by https://kigiri.github.io/fetch
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment