소스 검색

cfworker 修改

zjcqoo 6 년 전
부모
커밋
6ec1fdc6d8
2개의 변경된 파일63개의 추가작업 그리고 16개의 파일을 삭제
  1. 1 0
      cf-worker/README.md
  2. 62 16
      cf-worker/index.js

+ 1 - 0
cf-worker/README.md

@@ -0,0 +1 @@
+https://cloudflareworkers.com/

+ 62 - 16
cf-worker/index.js

@@ -1,51 +1,65 @@
 /**
  * jsproxy cfworker api
  * 
- * @update: 2019-05-03
+ * @update: 2019-05-07
  * @author: EtherDream
  * @see: https://github.com/EtherDream/jsproxy/
  */
-const pairs = Object.entries
-
-addEventListener('fetch', e => {
-  const ret = handler(e.request)
-    .catch(err => new Response(err))
-
-  e.respondWith(ret)
-})
-
+'use strict'
 
 const PREFLIGHT_INIT = {
   status: 204,
   headers: new Headers({
     'access-control-allow-origin': '*',
     'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS',
-    'access-control-allow-headers': '--url,--referer,--cookie,--origin,--ext,--aceh,--ver,--type,--mode,accept,accept-charset,accept-encoding,accept-language,accept-datetime,authorization,cache-control,content-length,content-type,date,if-match,if-modified-since,if-none-match,if-range,if-unmodified-since,max-forwards,pragma,range,te,upgrade,upgrade-insecure-requests,x-requested-with,chrome-proxy',
+    'access-control-allow-headers': '--raw-info,--level,--url,--referer,--cookie,--origin,--ext,--aceh,--ver,--type,--mode,accept,accept-charset,accept-encoding,accept-language,accept-datetime,authorization,cache-control,content-length,content-type,date,if-match,if-modified-since,if-none-match,if-range,if-unmodified-since,max-forwards,pragma,range,te,upgrade,upgrade-insecure-requests,x-requested-with,chrome-proxy',
     'access-control-max-age': '1728000',
   }),
 }
 
+const pairs = Object.entries
+
+
+addEventListener('fetch', e => {
+  const ret = handler(e.request)
+    .catch(err => new Response(err))
+
+  e.respondWith(ret)
+})
+
+
 /**
  * @param {Request} req
  */
 async function handler(req) {
   const reqHdrRaw = req.headers
+  if (reqHdrRaw.has('x-jsproxy')) {
+    return Response.error()
+  }
 
   // preflight
-  if (reqHdrRaw.has('access-control-request-headers')) {
+  if (req.method === 'OPTIONS' &&
+      reqHdrRaw.has('access-control-request-headers')
+  ) {
     return new Response(null, PREFLIGHT_INIT)
   }
 
   let url = ''
   let extHdrs = null
   let acehOld = false
+  let rawSvr = ''
+  let rawLen = ''
+  let rawEtag = ''
 
   const reqHdrNew = new Headers(reqHdrRaw)
+  reqHdrNew.set('x-jsproxy', '1')
 
   for (const [k, v] of reqHdrRaw.entries()) {
     if (!k.startsWith('--')) {
       continue
     }
+    reqHdrNew.delete(k)
+
     const k2 = k.substr(2)
     switch (k2) {
     case 'url':
@@ -54,6 +68,11 @@ async function handler(req) {
     case 'aceh':
       acehOld = true
       break
+    case 'raw-info':
+      // TODO: ,,
+      [rawSvr, rawLen, rawEtag] = v.split(/,{1,2}/)
+      break
+    case 'level':
     case 'mode':
     case 'type':
       break
@@ -61,7 +80,11 @@ async function handler(req) {
       extHdrs = JSON.parse(v)
       break
     default:
-      reqHdrNew.set(k2, v)
+      if (v) {
+        reqHdrNew.set(k2, v)
+      } else {
+        reqHdrNew.delete(k2)
+      }
       break
     }
   }
@@ -84,7 +107,7 @@ async function handler(req) {
 
   let expose = '*'
   let vary = '--url'
-
+  
   for (const [k, v] of resHdrOld.entries()) {
     if (k === 'access-control-allow-origin' ||
         k === 'access-control-expose-headers' ||
@@ -123,8 +146,31 @@ async function handler(req) {
   resHdrNew.set('vary', vary)
   resHdrNew.set('--s', res.status)
 
-  return new Response(res.body, {
-    status: 200,
+  // verify
+  const newLen = resHdrOld.get('content-length') || ''
+  const newEtag = resHdrOld.get('etag') || ''
+
+  const badLen = (rawLen !== newLen)
+  const badEtag = (rawEtag && rawEtag !== newEtag)
+
+  // resHdrNew.set('--l', rawLen + ',' + newLen)
+  // resHdrNew.set('--e', rawEtag + ',' + newEtag)
+
+  let status = 200
+  let body = res.body
+
+  if (badLen) {
+    status = 400
+    body = `bad len (old: ${rawLen} new: ${newLen})`
+    resHdrNew.set('cache-control', 'no-cache')
+  }
+  // else if (badEtag) {
+  //   status = 400
+  //   body = `bad etag (old: ${rawEtag} new: ${newEtag})`
+  // }
+
+  return new Response(body, {
+    status,
     headers: resHdrNew,
   })
 }