2

URLがスクリプトに渡されるさまざまなWebサイトのサイズを取得しようとしていますが、無効なURLを渡しても例外は発生せず、非常に小さなページが取得されます。を使用してSource.fromURLいますが、次の結果が得られます。

thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway 1052
www.bbc.co.uk 113871

最初のものは、それが言うように、それに何も含まれるべきではありませんが、それはあります。私のスクリプトは次のとおりです。

def main( args:Array[String] ){
    val tasks = for(arg <- args) yield future {
        try {
            println(arg + " " + Source.fromURL( attachPrefix(arg) ).length)
        } catch {
            case e : java.net.UnknownHostException => println(arg + " *")
        }
    }

    awaitAll(20000L, tasks: _*)
}

def attachPrefix( url:String ) = url.slice(0, 4) match {
    case "http" => url
    case "www." => "http://" + url
    case _ => "http://www." + url
}

attachPrefix各引数は、使用される前に必要なプレフィックスが付いていることを確認するために関数に渡されます。この問題は、URLをにマッピングするのではなく、パラメータとしてURLを渡し始めてから発生しましたarg。これは、以前に行っていたものです。

args map attachPrefix

2つの違いは何ですか、そしてなぜ私の現在のものがそのような振る舞いをしているのですか?

4

1 に答える 1

1

Source.fromURL(URI)署名を使用できます。を作成すると、ここに記載されているURIように効果的に検証URLされます。ただし、この場合、はに関するURL http://www.thisIsClearlyABoggusURLThatCantPossiblyLead‌​Anyway限り有効ですURI。一方、UrlValidatorom-nom-nomによって提案されたものは、最上位のドメインセグメントに4文字を超えており、すでに古くなっているため、無効と見なされます。完全にScala検証ライブラリーや、これが要件になる理由はわかりませんが、検証に正規表現を使用してみることができます。たとえば、トップレベルドメインが6文字を超えるため、これはあなたの例を捉えます。

val re = """^(https?://)?(([\w!~*'().&=+$%-]+: )?[\w!~*'().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([\w!~*'()-]+\.)*([\w^-][\w-]{0,61})?[\w]\.[a-z]{2,6})(:[0-9]{1,4})?((/*)|(/+[\w!~*'().;?:@&=+$,%#-]+)+/*)$""".r
re.pattern.matcher("http://google.com").matches // true
re.pattern.matcher("http://www.thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway").matches // false
于 2013-02-27T22:27:51.767 に答える