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

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

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");

উপরের JavaScript কোডটি 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>

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

প্রভাব

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

    তারপর, JavaScript বা Java কলআউট নীতিতে নির্দিষ্ট হেডার থেকে সব ভ্যালু ফেচ করতে ইটারেট করুন।

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

    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() ফাংশন ব্যবহার করুন।

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

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

আরও পড়ুন