ইউআরআই তৈরি করার সময় হোস্টনামটি কেন অবৈধ ঘোষণা করা হয়


17

JDK 1.8 দিয়ে এই কোডটি চালানো হচ্ছে:

try {
    System.out.println( new URI(null, null, "5-12-145-35_s-81", 443, null, null, null));
} catch (URISyntaxException e) {
    e.printStackTrace();
}

এই ত্রুটির ফলাফল: java.net.URISyntaxException: Illegal character in hostname at index 13: //5-12-145-35_s-81:443

ইউআরআই চরিত্রের প্রকারভেদে সমস্ত হোস্টনাম অক্ষরকে বৈধ বলে মনে করে এই ত্রুটিটি কোথা থেকে এসেছে ?


যদি আমি এই ইউআরএলগুলি ব্যবহার করি: //5-12-145-35_s-81:443বা /5-12-145-35_s-81:443ত্রুটিটি চলে গেছে।


মন্তব্যগুলি থেকে, আমি বুঝতে পারি যে, আরএফসি -2396 অনুসারে , হোস্টনেমে কোনও আন্ডারস্কোর অক্ষর থাকতে পারে না।

এখনও যে প্রশ্নটি রয়েছে তা হ'ল স্ল্যাশ বা ডাবল স্ল্যাশ দিয়ে শুরু হওয়া হোস্টনামকে কেন আন্ডারস্কোরগুলি রাখার অনুমতি দেওয়া হচ্ছে?


1
@ আর্নেস্ট_ কে এই স্কিমটি দেওয়া হয়নি, এটি বাতিল।
ইউজেন কোভাচি

আপনি যদি এখনও url- এ চান তবে @ fg78nc কর্মজীবন আপনার পক্ষে কাজ করবে। ব্যবহার করবেন না / কারণ হোস্টনামটি অবৈধ হবে এবং ক্ষেত্র তৈরি করবে না
বিক্রয়

3
দেখুন বোঝায় যা RFC-2396 অধ্যায় 3.2.2। -
ইউআরআইতে

@ মার্করোটটিভেল জাভা ডট কম.উরি সর্বশেষতম চশমা
fg78nc

@ fg78nc যদিও আরএফসি -3986 এটিকে শিথিল করে, তবুও এটি উল্লেখ করেছে যে " ডিএনএসে অনুসন্ধানের উদ্দেশ্যে নিবন্ধিত নামটি [আরএফসি 1034] এর ৩.৩ অনুচ্ছেদ এবং [আরএফসি১১১৩৩] এর ২.১ ধারায় সংশ্লেষ ব্যবহার করে।" , এবং এটি মূলত আরএফসি -2396 বিভাগ 3.2.2 এর বাক্য গঠন।
মার্ক রোটভেল

উত্তর:


8

হোস্টের নামটি অবশ্যই নিম্নলিখিত সিনট্যাক্সের সাথে মেলে:

hostname      = domainlabel [ "." ] | 1*( domainlabel "." ) toplabel [ "." ]
domainlabel   = alphanum | alphanum *( alphanum | "-" ) alphanum
toplabel      = alpha | alpha *( alphanum | "-" ) alphanum

যেমন আপনি দেখতে পাচ্ছেন, কেবল .এবং -অনুমোদিত _তবে তা নয়।


তারপরে আপনি বলবেন যে //5-12-145-35_s-81:443এটি অনুমোদিত, এবং এটি তবে হোস্ট নামের জন্য নয় ।

কীভাবে তা বন্ধ হয়ে যায় তা দেখতে:

URI uriBadHost = URI.create("//5-12-145-35_s-81:443");
System.out.println("uri = " + uriBadHost);
System.out.println("  authority = " + uriBadHost.getAuthority());
System.out.println("  host = " + uriBadHost.getHost());
System.out.println("  port = " + uriBadHost.getPort());
URI uriGoodHost = URI.create("//example.com:443");
System.out.println("uri = " + uriGoodHost);
System.out.println("  authority = " + uriGoodHost.getAuthority());
System.out.println("  host = " + uriGoodHost.getHost());
System.out.println("  port = " + uriGoodHost.getPort());

আউটপুট

uri = //5-12-145-35_s-81:443
  authority = 5-12-145-35_s-81:443
  host = null
  port = -1
uri = //example.com:443
  authority = example.com:443
  host = example.com
  port = 443

যেমন আপনি দেখতে পাচ্ছেন, যখন এর authorityবৈধ হোস্টের নাম থাকবে, hostএবং portপার্স করা হবে তবে যখন বৈধ নয়, তখন authorityএটিকে ফ্রিফর্ম পাঠ্য হিসাবে বিবেচনা করা হবে, এবং আর কোনও বিশ্লেষণ করা হবে না।


হালনাগাদ

মন্তব্য থেকে:

System.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))আউটপুট: /// 5-12-145-35_s-81: 443। আমি এটি হোস্ট নাম হিসাবে দিচ্ছি

যে URIকনস্ট্রাক্টরকে আপনি কল করছেন এটি একটি সুবিধার পদ্ধতি এবং এটি সাধারণভাবে একটি সম্পূর্ণ ইউআরআই স্ট্রিং তৈরি করে এবং তারপরে পার্স করে।

পাসিং "5-12-145-35_s-81", 443হয়ে যায় //5-12-145-35_s-81:443
পাসিং "/5-12-145-35_s-81", 443হয়ে যায় ///5-12-145-35_s-81:443

প্রথমটিতে, এটি একটি হোস্ট এবং বন্দর এবং পার্স করতে ব্যর্থ।
দ্বিতীয়টিতে কর্তৃপক্ষের অংশটি খালি, এবং /5-12-145-35_s-81:443এটি একটি পথ

URI uri1 = new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null);
System.out.println("uri = " + uri1);
System.out.println("  authority = " + uri1.getAuthority());
System.out.println("  host = " + uri1.getHost());
System.out.println("  port = " + uri1.getPort());
System.out.println("  path = " + uri1.getPath());

আউটপুট

uri = ///5-12-145-35_s-81:443
  authority = null
  host = null
  port = -1
  path = /5-12-145-35_s-81:443

এখন আমি বুঝতে পেরেছি, তবে কেন, যাক /a_b, এটি অনুমোদিত। পার্থক্য কেবল এই যে এটি পরম, আপেক্ষিক নয়
ইউজেন কোভাচি

System.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))আউটপুট: ///5-12-145-35_s-81:443। আমি এটি হোস্ট নাম হিসাবে দিচ্ছি।
ইউজেন কোভাচি

এই আচরণটি (যখন হোস্টনাম পরম হয়) অদ্ভুত, কমপক্ষে বলতে গেলে। ইউআরআইয়ের নির্মাতা একটি হোস্টনাম এবং একটি বন্দর দিচ্ছেন, এবং ফলিত ইউআরআইয়ের একটিও নেই, কেবল একটি পথ।
ইউজেন কোভাচি

5

বাগ জাভাতে নয় তবে হোস্টের নামকরণের ক্ষেত্রে, যেহেতু আন্ডারস্কোরটি কোনও হোস্টনামে বৈধ অক্ষর নয়। যদিও বিস্তৃতভাবে ভুলভাবে ব্যবহৃত হয়, জাভা এই জাতীয় হোস্টনামগুলি হ্যান্ডেল করতে অস্বীকার করে


এই এক /5-12-145-35_s-81:443আইনী।
ইউজেন কোভাচি

2

অ্যান্ডস্কোরগুলি ইউআরআইগুলিতে সমর্থিত নয়।

হোস্টনামে অন্যান্য অক্ষর যেমন আন্ডারস্কোর অক্ষর (_) নাও থাকতে পারে, অন্য ডিএনএসের নামগুলিতে আন্ডারস্কোর থাকতে পারে [[]] []] এই বিধিনিষেধটি আরএফসি 2181, বিভাগ 11 দ্বারা তুলে নিয়েছে ডোমেনকি এবং পরিষেবা রেকর্ডের মতো সিস্টেমগুলি আন্ডারস্কোরটিকে নিশ্চিত করার জন্য একটি উপায় হিসাবে ব্যবহার করে যে তাদের বিশেষ চরিত্রটি হোস্ট-নেমগুলির সাথে বিভ্রান্ত নয়। উদাহরণস্বরূপ, _http._sctp.www.example.com ডোমেন example.com এ এসসিটিপি-সক্ষম ওয়েবসার্ভার হোস্ট (www) এর জন্য একটি পরিষেবা পয়েন্টার নির্দিষ্ট করে। স্ট্যান্ডার্ড সত্ত্বেও, ক্রোম, ফায়ারফক্স, ইন্টারনেট এক্সপ্লোরার, এজ এবং সাফারি হোস্ট-নেমগুলিতে আন্ডারস্কোরগুলি মঞ্জুরি দেয়, যদিও হোস্টনেমের কোনও অংশে আন্ডারস্কোর অক্ষর থাকলে আই-তে কুকিজ সঠিকভাবে কাজ করে না

উইকিপিডিয়া

জাভাদোকস থেকে:

পাবলিক ইউআরআই (স্ট্রিং স্ট্র) ইউআরআইসিন্ট্যাক্স এক্সেপশন নিক্ষেপ করে: ইউরিসিন্ট্যাক্স এক্সেপশন - যদি উপরের বিচ্যুতিগুলির দ্বারা সংযুক্ত হিসাবে প্রদত্ত স্ট্রিংটি আরএফসি 2396 লঙ্ঘন করে

Javadocs

(হ্যাকি) সমাধান:

    URI url = URI.create("https://5-12-145-35_s-8:8080");

    System.out.println(url.getHost()) // null

    if (url.getHost() == null) {
        final Field hostField = URI.class.getDeclaredField("host");
        hostField.setAccessible(true);
        hostField.set(url, "5-12-145-35_s-81");
    }
    System.out.println(url.getHost()); // 5-12-145-35_s-81

এটি হিসাবে জবাব দেওয়া হয়েছিল - জেডিকে বাগ


1
বাহ, এটি হ্যাকি সমাধান। আপনি বলতে পারেন যে এটি ভবিষ্যতে ভাঙ্গতে পারে, কারণ এটি কোনও অভ্যন্তরীণ শ্রেণীর সম্পর্কে অভ্যন্তরীণ ধারণা নিচ্ছে এবং এটি সরাসরি অ্যাক্সেসের জন্য প্রতিবিম্ব ব্যবহার করে। সুতরাং বাস্তবায়ন যে কোনও জাভা রিলিজের সাথে পরিবর্তিত হতে পারে, এক্ষেত্রে এটি ভেঙে যেতে পারে। যদিও সমাধান দেওয়ার জন্য +1 ।
জাবুজার্ড

এই কাজটি আমি যতটা করতে চাইছিলাম না, এই বিষয়গুলির সমস্যাটি কেবল জবুজা উল্লেখ করেছেন। + আমরা যদি নিয়ম মানতে শুরু করি তবে সবকিছু ধীরে ধীরে ধসে পড়তে শুরু করবে। এটি প্রথম স্থানে কাজ না করার একটি ভাল কারণ রয়েছে।
বিক্রয়

@ সলেশ এবং সেই উত্তম কারণটি কী?
fg78nc

"ডোমেনকি এবং পরিষেবা রেকর্ডের মতো সিস্টেমগুলি আন্ডারস্কোরটিকে নিশ্চিত করার জন্য একটি বিশেষ উপায় ব্যবহার করে যে তাদের বিশেষ চরিত্র হোস্টনামের সাথে বিভ্রান্ত নয়" " উইকিপিডিয়া এবং সেখানে ভাল উত্তর এখানে Quora
salesh

1
আপনি যদি এটি করেন তবে আপনি nullহোস্ট হিসাবে পাবেন ।
fg78nc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.