PAC (Proxy auto-config) সিনট্যাক্স
নথিতে কোনো ত্রুটি থাকলে বা কোনো পরামর্শ থাকলে দয়া করে Mudfish ফোরামে (https://forums.mudfish.net) বার্তা দিন। এখানে উল্লেখিত উদাহরণ এবং ব্যাখ্যাগুলো নিচের সাইটের বিষয়বস্তু অনুবাদ বা উল্লেখ করে তৈরি করা হয়েছে।
Mudfish ব্রাউজার এক্সটেনশনের ক্ষেত্রে, এটি PAC (Proxy auto-config) ফাইল ফরম্যাট সমর্থন করে।
PAC ফাংশনসমূহ
PAC ফরম্যাট সমর্থনকারী ব্রাউজারগুলো সাধারণত Netscape কর্তৃক নির্ধারিত স্ট্যান্ডার্ড ফরম্যাটে প্রস্তাবিত ফাংশনগুলোকে সমর্থন করে থাকে।
তবে সাধারণত এই ফিচারগুলো একটি স্যান্ডবক্সের (sandbox) মধ্যে কাজ করে, তাই এগুলো অত্যন্ত সীমাবদ্ধ পরিবেশে চলে। উদাহরণস্বরূপ, User Agent সংক্রান্ত তথ্য পরীক্ষা করার মতো কার্যক্রম পুরোপুরি ব্লক করা থাকে।
নিচে স্যান্ডবক্স পরিবেশে অনুমোদিত ফাংশনগুলো বর্ণনা করা হলো।
dnsDomainIs
Hostname পরীক্ষা করে যদি তা মিলে যায় তবে এটি true প্রদান (return) করে। সাধারণত নির্দিষ্ট কোনো ব্যতিক্রমী hostname পরীক্ষা করার সময় এটি ব্যবহৃত হয়।
// যদি hostname টি google.com এর সাথে মেলে বা এর সাব-ঠিকানাগুলোর সাথে মেলে
// (যেমন maps.google.com, www.google.com),
// তবে ব্রাউজার প্রক্সি ছাড়া সরাসরি সংযোগ করবে।
if (dnsDomainIs(host, "google.com"))
return "DIRECT";
shExpMatch
Hostname বা URL-কে শেল এক্সপ্রেশনের (shell expression) মাধ্যমে নির্দিষ্ট স্ট্রিংয়ের সাথে তুলনা করে এবং মিললে true প্রদান করে।
// সব রিকোয়েস্ট (.local দিয়ে শেষ হওয়া সব hostname-এর জন্য)
// ব্রাউজারকে প্রক্সি ব্যবহার না করে সরাসরি সংযোগ করতে দেয়।
if (shExpMatch(url, "*.local"))
return "DIRECT";
// vpn.domain.com-এ সংযোগের চেষ্টা বা
// http://abcdomain.com/folder/ এর অধীনস্থ সব ফোল্ডার বা ফাইলে সংযোগের
// রিকোয়েস্টগুলো প্রক্সি ছাড়াই সরাসরি সংযোগ করবে।
if (shExpMatch(host, "vpn.domain.com") ||
shExpMatch(url, "http://abcdomain.com/folder/*"))
return "DIRECT";
isInNet
এই ফাংশনটি hostname-এর IP address পরীক্ষা করে এবং সেটি নির্দিষ্ট subnet-এর অন্তর্ভুক্ত হলে true প্রদান করে। যদি আর্গুমেন্ট হিসেবে কোনো hostname পাঠানো হয়, তবে DNS resolving-এর মাধ্যমে IP রূপান্তর প্রক্রিয়া সম্পন্ন হয়।
// যদি অনুরোধকৃত hostname-এর IP ঠিকানা (DNS resolving-এর পরে)
// আর্গুমেন্ট হিসেবে দেওয়া IP রেঞ্জের মধ্যে পড়ে, তবে সরাসরি সংযোগ করবে।
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
return "DIRECT";
myIpAddress
বর্তমান কম্পিউটারের IP ঠিকানা প্রদান করে।
// যদি আমার কম্পিউটার নির্দিষ্ট কোনো IP রেঞ্জের অন্তর্ভুক্ত হয়, তবে প্রক্সি 10.10.5.1 (পোর্ট 8080)
// এর মাধ্যমে রিকোয়েস্ট পাঠাবে।
if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))
return "PROXY 10.10.5.1:8080";
dnsResolve
DNS resolving-এর মাধ্যমে hostname-কে IP ঠিকানায় রূপান্তর করে।
// যদি অনুরোধকৃত host-এর IP নির্দিষ্ট সীমার অন্তর্ভুক্ত হয়, তবে সরাসরি সংযোগ
// নিশ্চিত করবে।
if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
return "DIRECT";
isPlainHostName
যদি hostname-এ কোনো . (ডট) বর্ণ না থাকে তবে এটি true প্রদান করে। উদাহরণস্বরূপ http://intranet এর মতো ক্ষেত্রে এটি প্রযোজ্য, যা সাধারণত অভ্যন্তরীণ নেটওয়ার্কের ওয়েব ঠিকানায় প্রবেশের জন্য ব্যবহৃত হতে পারে।
// যদি ব্যবহারকারী কোনো plain hostname (যেমন, http://intranet/ বা
// http://webserver-name01/) এর জন্য অনুরোধ করে, তবে সরাসরি সংযোগ করবে।
if (isPlainHostName(host))
return "DIRECT";
localHostOrDomainIs
Hostname পরীক্ষা করে যদি hostname অংশগুলো পরস্পরের সাথে মিলে যায় তবে true প্রদান করে।
// যদি অনুরোধকৃত hostname "www" বা "www.google.com" হয়, তবে সরাসরি
// সংযোগ করবে।
if (localHostOrDomainIs(host, "www.google.com"))
return "DIRECT";
isResolvable
Hostname-কে IP ঠিকানায় রূপান্তর করতে সক্ষম হলে true প্রদান করে।
যদি কোনো ডোমেন ঠিকানার resolving সঠিকভাবে কাজ না করে, তবে ব্রাউজার সাময়িকভাবে থমকে যেতে (freeze হয়ে যেতে) পারে। তাই এটি সতর্কতার সাথে ব্যবহার করা উচিত।
// যদি অনুরোধকৃত hostname-কে DNS সার্ভারের মাধ্যমে resolve করা সম্ভব হয়,
// তবে proxy1.example.com প্রক্সির মাধ্যমে রিকোয়েস্ট পাঠাবে।
if (isResolvable(host))
return "PROXY proxy1.example.com:8080";
dnsDomainLevels
Hostname পরীক্ষা করে স্ট্রিংটিতে কতগুলো . (ডট) রয়েছে তা প্রদান করে। উদাহরণস্বরূপ অভ্যন্তরীণ নেটওয়ার্কের কোনো ওয়েব সার্ভারকে ব্যতিক্রম হিসেবে নির্ধারণ করার ক্ষেত্রে এটি ব্যবহৃত হতে পারে।
// যদি hostname-এ অন্তত একটি . (ডট) থাকে, তবে proxy1.example.com
// প্রক্সির মাধ্যমে সংযোগ করবে, অন্যথায় সরাসরি সংযোগ করবে।
if (dnsDomainLevels(host) > 0)
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
weekdayRange
সময়ের ওপর ভিত্তি করে কোনো নিয়ম (rule) তৈরির জন্য এটি ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ শুধুমাত্র নির্দিষ্ট কিছু দিনেই প্রক্সি সেটিংস কার্যকর করতে চাইলে এটি ব্যবহৃত হয়।
// সোমবার থেকে শুক্রবারের মধ্যে proxy1.example.com প্রক্সি ব্যবহার
// করবে এবং অন্য দিনগুলোতে সরাসরি ইন্টারনেটে সংযোগ করবে।
if (weekdayRange("MON", "FRI"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
dateRange
সময়ের ওপর ভিত্তি করে নিয়ম তৈরির জন্য এটি ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ শুধুমাত্র নির্দিষ্ট কোনো মাসে প্রক্সি কার্যকর করতে চাইলে এটি ব্যবহৃত হয়।
// জানুয়ারি থেকে মার্চের মধ্যে proxy1.example.com প্রক্সি ব্যবহারের ব্যবস্থা করবে
// এবং অন্য সময়ে সরাসরি সংযোগের ব্যবস্থা নেবে।
if (dateRange("JAN", "MAR"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
timeRange
শুধুমাত্র নির্দিষ্ট সময়ের ব্যবধানে প্রক্সি ব্যবহার করতে চাইলে এটি ব্যবহার করা যেতে পারে।
// শুধুমাত্র সকাল ৮টা থেকে সন্ধ্যা ৬টা পর্যন্ত proxy1.example.com ব্যবহার করবে
// এবং অন্য সময়ে সরাসরি সংযোগ করবে।
if (timeRange(8, 18))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";
alert
এই ফাংশনটি প্রথম যখন PAC ফরম্যাট নির্ধারিত হয়েছিল তখন ছিল না, তবে সমস্যা সমাধানের (troubleshooting) সুবিধার্থে Internet Explorer এবং Firefox ব্রাউজারে এটি সংজ্ঞায়িত করা হয়েছে।
// ব্রাউজারের error কনসোলে DNS resolving এর ফলাফল প্রিন্ট করবে।
resolved_host = dnsResolve(host);
alert(resolved_host);