
وكيل HTTP قابل للاختراق لاختبار المرونة ومحاكاة ظروف الشبكة
لا تتم صيانته بنشاط، قد لا يعمل مع أحدث إصدارات node.js. إذا كنت مهتماً بصيانة toxy، يرجى فتح issue.
وكيل HTTP قابل للتخصيص لمحاكاة سيناريوهات فشل الخادم، اختبار مرونة الأنظمة وظروف شبكة غير متوقعة، مبني لـ node.js.
تم تصميمه بشكل أساسي لاختبار مقاومة الفشل، حيث يصبح toxy مفيدًا بشكل خاص لتغطية قدرات تحمل الأخطاء والمرونة للنظام، خاصة في الشبكات المتسامحة مع الانقطاع والهندسة الموجهة نحو الخدمة، حيث يمكن لـ toxy العمل كوكيل وسيط (MitM) بين الخدمات لحقن الفشل.
يسمح لك toxy بتوصيل poisons، والتي يتم تصفيتها اختياريًا بواسطة rules، والتي يمكنها بشكل أساسي اعتراض وتعديل تدفق HTTP حسب حاجتك، مع تنفيذ إجراءات ضارة متعددة في منتصف تلك العملية، مثل تحديد النطاق الترددي، تأخير حزم الشبكة، حقن زمن انتقال شبكة (jitter)، أو الرد برمز خطأ أو حالة مخصص.
يعمل بشكل أساسي على الطبقة السابعة (L7)، على الرغم من أنه يمكنه محاكاة ظروف الشبكة للطبقة الثالثة (L3).
يمكن استخدام toxy بسلاسة برمجيًا أو عبر HTTP API.
تم بناؤه فوق rocky، وهو وكيل HTTP كامل الميزات موجه للوسائط (middleware)، وهو أيضًا قابل للتوصيل في connect/express كوسيط (middleware) قياسي.
يتطلب node.js +4.
توجد بعض الحلول المشابهة لـ toxy في السوق، لكن معظمها لا يوفر تحكمًا برمجيًا مناسبًا وعادةً لا يكون سهلاً في التخصيص أو التكوين أو أنها مغلقة مباشرة أمام قابلية التوسع.
علاوة على ذلك، تعمل غالبية هذه الحلول فقط على مستوى TCP L3 بدلاً من توفير تجريدات عالية المستوى لتغطية المتطلبات الشائعة في المجال المحدد وطبيعة بروتوكول HTTP L7، كما يحاول toxy توفيره.
يجلب toxy حلاً قويًا وقابلًا للتخصيص والتوسع مع تجريد مريح، ولكن دون فقدان قدرات الواجهة ذات المستوى المنخفض المناسبة للتعامل مع بدائيات بروتوكول HTTP بسهولة.
تم تصميم toxy بناءً على مبادئ التركيب والبساطة وقابلية التوسع. من خلال طبقة الوسائط الهرمية الخاصة بالمجال المدمجة، يمكنك بسهولة توسيع ميزات toxy لتناسب احتياجاتك الخاصة.
يقدم toxy توجيهين: poisons و rules.
Poisons هي المنطق المحدد الذي يصيب معاملة HTTP واردة أو صادرة (مثل: حقن زمن انتقال (latency)، الرد بخطأ). يمكن تسميم معاملة HTTP واحدة بواسطة poison واحد أو أكثر، ويمكن تكوين هذه poisons أيضًا لإصابة حركة المرور على المستوى العام أو مستوى المسار.
Rules هي نوع من مرشحات التحقق من المطابقة التي تفحص طلب/استجابة HTTP لتحديد، وفقًا لقواعد معينة، ما إذا كان يجب تسميم معاملة HTTP أم لا (على سبيل المثال: إذا تطابقت الرؤوس (headers)، معاملات الاستعلام (query params)، الطريقة (method)، النص (body)...). يمكن إعادة استخدام rules وتطبيقها على كل من تدفقات حركة المرور الواردة والصادرة، بما في ذلك نطاقات مختلفة: المستوى العام، مستوى المسار، أو مستوى poison.
↓ ( Incoming request ) ↓ ↓ ||| ↓ ↓ +-------------+ ↓ ↓ | Toxy Router | ↓ -> Match the incoming request ↓ +-------------+ ↓ ↓ ||| ↓ ↓ +--------------------+ ↓ ↓ | Incoming phase | ↓ -> The proxy receives the request from the client ↓ |~~~~~~~~~~~~~~~~~~~~| ↓ ↓ | ---------------- | ↓ ↓ | | Exec Rules | | ↓ -> Apply configured rules for the incoming request ↓ | ---------------- | ↓ ↓ | ||| | ↓ ↓ | ---------------- | ↓ ↓ | | Exec Poisons | | ↓ -> If all rules passed, then poison the HTTP flow ↓ | ---------------- | ↓ ↓ +~~~~~~~~~~~~~~~~~~~~+ ↓ ↓ / \ ↓ ↓ \ / ↓ ↓ +--------------------+ ↓ ↓ | HTTP dispatcher | ↓ -> Forward the HTTP traffic to the target server, either poisoned or not ↓ +--------------------+ ↓ ↓ / \ ↓ ↓ \ / ↓ ↓ +--------------------+ ↓ ↓ | Outgoing phase | ↓ -> Receives response from target server ↓ |~~~~~~~~~~~~~~~~~~~~| ↓ ↓ | ---------------- | ↓ ↓ | | Exec Rules | | ↓ -> Apply configured rules for the outgoing request ↓ | ---------------- | ↓ ↓ | ||| | ↓ ↓ | ---------------- | ↓ ↓ | | Exec Poisons | | ↓ -> If all rules passed, then poison the HTTP flow before send it to the client ↓ | ---------------- | ↓ ↓ +~~~~~~~~~~~~~~~~~~~~+ ↓ ↓ ||| ↓ ↓ ( Send to the client ) ↓ -> Finally, send the request to the client, either poisoned or not
## الاستخدام
### التثبيت```
npm install toxy
انظر إلى دليل أمثلة لمزيد من حالات الاستخدام.```js var toxy = require('toxy') var poisons = toxy.poisons var rules = toxy.rules
// Create a new toxy proxy var proxy = toxy()
// Default server to forward incoming traffic proxy .forward('http://httpbin.org')
// Register global poisons and rules proxy .poison(poisons.latency({ jitter: 500 })) .rule(rules.probability(25))
// Register multiple routes proxy .get('/download/') .forward('http://files.myserver.net') .poison(poisons.bandwidth({ bps: 1024 })) .withRule(rules.headers({'Authorization': /^Bearer (.)$/i }))