অ্যান্টি-প্যাটার্ন: একটি API প্রক্সিতে ভুলভাবে মাল্টি-ভ্যালু HTTP হেডার অ্যাক্সেস করুন

আপনি Apigee Edge-এর ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন
.info- তে যান।

HTTP হেডার হলো নাম-মান জোড়া, যা ক্লায়েন্ট অ্যাপ্লিকেশন এবং ব্যাকএন্ড সার্ভিসগুলোকে যথাক্রমে অনুরোধ এবং প্রতিক্রিয়া সম্পর্কে অতিরিক্ত তথ্য আদান-প্রদান করতে সাহায্য করে। এর কয়েকটি সহজ উদাহরণ হলো:

  • অনুমোদন অনুরোধ হেডার ব্যবহারকারীর পরিচয়পত্র সার্ভারে প্রেরণ করে:
    Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
  • Content-Type হেডারটি প্রেরিত অনুরোধ/প্রতিক্রিয়া বিষয়বস্তুর ধরন নির্দেশ করে:
    Content-Type: application/json

হেডার ফিল্ডের সংজ্ঞার উপর নির্ভর করে HTTP হেডারে এক বা একাধিক ভ্যালু থাকতে পারে। একটি মাল্টি-ভ্যালুড হেডারে ভ্যালুগুলো কমা দ্বারা পৃথক করা থাকে। নিচে একাধিক ভ্যালু ধারণকারী কয়েকটি হেডারের উদাহরণ দেওয়া হলো:

  • Cache-Control: no-cache, no-store, must-revalidate
  • Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
  • X-Forwarded-For: 10.125.5.30, 10.125.9.125

Apigee Edge ডেভেলপারদের যেকোনো Edge পলিসি বা কন্ডিশনাল ফ্লো-তে ফ্লো ভেরিয়েবল ব্যবহার করে সহজেই হেডার অ্যাক্সেস করার সুযোগ দেয়। Edge-এ একটি নির্দিষ্ট রিকোয়েস্ট বা রেসপন্স হেডার অ্যাক্সেস করার জন্য যে ভেরিয়েবলগুলো ব্যবহার করা যেতে পারে, তার তালিকা নিচে দেওয়া হলো:

প্রবাহ চলকসমূহ:

  • message.header. header-name
  • request.header. header-name
  • response.header. header-name
  • message.header. header-name . N
  • request.header. header-name . N
  • response.header. header-name . N

জাভাস্ক্রিপ্ট অবজেক্ট:

  • context.proxyRequest.headers. header-name
  • context.targetRequest.headers. header-name
  • context.proxyResponse.headers. header-name
  • context.targetResponse.headers. header-name

এখানে একটি নমুনা AssignMessage পলিসি দেওয়া হলো, যেখানে দেখানো হয়েছে কীভাবে একটি রিকোয়েস্ট হেডারের মান পড়ে সেটিকে একটি ভেরিয়েবলে সংরক্ষণ করা যায়:

<AssignMessage continueOnError="false" enabled="true" name="assign-message-default">
  <AssignVariable>
    <Name>reqUserAgent</Name>
    <Ref>request.header.User-Agent</Ref>
  </AssignVariable>
</AssignMessage>

অ্যান্টিপ্যাটার্ন

Edge পলিসিতে HTTP হেডারের মানগুলো এমনভাবে অ্যাক্সেস করা ভুল, যাতে শুধুমাত্র প্রথম মানটি ফেরত আসে এবং নির্দিষ্ট HTTP হেডারটির একাধিক মান থাকলে এটি সমস্যা সৃষ্টি করতে পারে।

নিম্নলিখিত বিভাগগুলিতে হেডার অ্যাক্সেসের উদাহরণ রয়েছে।

উদাহরণ ১: জাভাস্ক্রিপ্ট কোড ব্যবহার করে একটি বহু-মান বিশিষ্ট Accept হেডার পড়ুন

মনে করুন যে Accept হেডারের একাধিক মান রয়েছে, যেমনটি নিচে দেখানো হয়েছে:

Accept: text/html, application/xhtml+xml, application/xml

এই হলো জাভাস্ক্রিপ্ট কোড যা Accept হেডার থেকে মানটি পড়ে:

// Read the values from Accept header
var acceptHeaderValues = context.getVariable("request.header.Accept");

উপরের জাভাস্ক্রিপ্ট কোডটি Accept হেডার থেকে শুধুমাত্র প্রথম ভ্যালুটি রিটার্ন করে, যেমন text/html

উদাহরণ ২: AssignMessage বা RaiseFault পলিসিতে একটি বহু-মান বিশিষ্ট Access-Control-Allow-Headers হেডার পড়ুন

মনে রাখবেন যে Access-Control-Allow-Headers হেডারটির একাধিক মান রয়েছে, যেমনটি নিচে দেখানো হয়েছে:

Access-Control-Allow-Headers: content-type, authorization

এখানে AssignMessage বা RaiseFault পলিসির সেই কোডের অংশ দেওয়া হলো যা Access-Control-Allow-Headers হেডারটি সেট করে:

<Set>
  <Headers>
    <Header name="Access-Control-Allow-Headers">{request.header.Access-Control-Request-Headers}</Header>
  </Headers>
</Set>

উপরের কোডটি রিকোয়েস্ট হেডার Access-Control-Allow-Headers থেকে শুধুমাত্র প্রথম ভ্যালুটি (এই উদাহরণে content-type ) দিয়ে হেডার Access-Control-Allow-Headers সেট করে।

প্রভাব

  1. উপরের উভয় উদাহরণেই লক্ষ্য করুন যে, মাল্টি-ভ্যালুড হেডারগুলো থেকে শুধুমাত্র প্রথম মানটি ফেরত দেওয়া হয়েছে। যদি এই মানগুলো পরবর্তীতে এপিআই প্রক্সি ফ্লো-তে অন্য কোনো পলিসি দ্বারা অথবা ব্যাকএন্ড সার্ভিস দ্বারা কোনো ফাংশন বা লজিক সম্পাদনের জন্য ব্যবহৃত হয়, তাহলে এর ফলে একটি অপ্রত্যাশিত ফলাফল বা পরিণতি হতে পারে।
  2. যখন রিকোয়েস্ট হেডারের ভ্যালুগুলো অ্যাক্সেস করে টার্গেট সার্ভারে পাঠানো হয়, তখন ব্যাকএন্ড দ্বারা এপিআই রিকোয়েস্টগুলো ভুলভাবে প্রসেস হতে পারে এবং এর ফলে ভুল ফলাফল আসতে পারে।
  3. যদি ক্লায়েন্ট অ্যাপ্লিকেশনটি Edge রেসপন্সের নির্দিষ্ট হেডার ভ্যালুগুলোর উপর নির্ভরশীল হয়, তাহলে এটিও ভুলভাবে প্রসেস হতে পারে এবং ভুল ফলাফল দিতে পারে।

সর্বোত্তম অনুশীলন

  1. উপযুক্ত বিল্ট-ইন ফ্লো ভেরিয়েবল ব্যবহার করুন: request.header. header_name .values.count , request.header. header_name . N response.header. header_name .values.count , response.header. header_name.N

    তারপর জাভাস্ক্রিপ্ট বা জাভা কলআউট পলিসি ব্যবহার করে একটি নির্দিষ্ট হেডার থেকে সমস্ত ভ্যালু আনার জন্য পুনরাবৃত্তি করুন।

    উদাহরণ: একাধিক মানের হেডার পড়ার জন্য নমুনা জাভাস্ক্রিপ্ট কোড।

    for (var i = 1; i <=context.getVariable('request.header.Accept.values.count'); i++)
    {
      print(context.getVariable('request.header.Accept.' + i));
    }

    উদাহরণস্বরূপ, উপরের কোডটির সাহায্যে application/xml;q=0.9, */*;q=0.8 একটি একক মান হিসাবে প্রদর্শিত হবে।

    যদি হেডার ভ্যালুগুলোকে সেমিকোলন বিভাজক হিসেবে ব্যবহার করে ভাগ করার প্রয়োজন হয়, তাহলে সেগুলোকে ভ্যালুতে আলাদা করতে string.split(";") ব্যবহার করুন।

  2. একটি নির্দিষ্ট হেডারের সমস্ত ভ্যালু পড়ার জন্য, RaiseFault বা AssignMessage পলিসিতে request.header. header_name .values ​​ফ্লো ভ্যারিয়েবলের উপর substring() ফাংশনটি ব্যবহার করুন।

    উদাহরণ: একাধিক মানের হেডার পড়ার জন্য RaiseFault বা AssignMessage পলিসির নমুনা।

    <Set>
      <Headers>
       <Header name="Access-Control-Allow-Headers">{substring(request.header.Access-Control-Request-Headers.values,1,-1)}</Header>
      </Headers>
    </Set>

আরও পড়ুন