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

আপনি Apigee Edge ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন দেখুন।

এইচটিটিপি শিরোনাম হল নামের মান জোড়া যা ক্লায়েন্ট অ্যাপ্লিকেশন এবং ব্যাকএন্ড পরিষেবাগুলিকে যথাক্রমে অনুরোধ এবং প্রতিক্রিয়া সম্পর্কে অতিরিক্ত তথ্য পাঠাতে দেয়। কিছু সহজ উদাহরণ হল:

  • অনুমোদনের অনুরোধ শিরোনাম সার্ভারে ব্যবহারকারীর শংসাপত্রগুলি পাস করে:
    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 ডেভেলপারদের যেকোনও এজ পলিসি বা শর্তসাপেক্ষ ফ্লোতে ফ্লো ভেরিয়েবল ব্যবহার করে সহজেই হেডার অ্যাক্সেস করতে দেয়। এখানে ভেরিয়েবলের তালিকা রয়েছে যা এজ-এ একটি নির্দিষ্ট অনুরোধ বা প্রতিক্রিয়া শিরোনাম অ্যাক্সেস করতে ব্যবহার করা যেতে পারে:

প্রবাহ ভেরিয়েবল:

  • 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>

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

এজ নীতিতে HTTP শিরোনামগুলির মানগুলিকে এমনভাবে অ্যাক্সেস করা যা শুধুমাত্র প্রথম মান প্রদান করে ভুল এবং নির্দিষ্ট HTTP হেডার(গুলি) এর একাধিক মান থাকলে সমস্যা হতে পারে৷

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

উদাহরণ 1: JavaScript কোড ব্যবহার করে একটি বহু-মূল্যবান 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

উদাহরণ 2: AssignMessage বা RaiseFault নীতিতে একটি বহু-মূল্যবান অ্যাক্সেস-কন্ট্রোল-অ্যালো-হেডার শিরোনাম পড়ুন

বিবেচনা করুন যে 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 থেকে শুধুমাত্র প্রথম মান সহ শিরোলেখ Access-Control-Allow-Headers সেট করে, এই উদাহরণে content-type

প্রভাব

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

ভাল অভ্যাস

  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. ফ্লো ভেরিয়েবল request.header. header_name .valuessubstring() ফাংশন ব্যবহার করুন। একটি নির্দিষ্ট শিরোনামের সমস্ত মান পড়ার জন্য RaiseFault বা AssignMessage নীতিতে request.header. header_name .values

    উদাহরণ: একটি বহু-মান শিরোনাম পড়ার জন্য নমুনা RaiseFault বা AssignMessage নীতি

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

আরও পড়া