Is Scala/Java not respecting w3 “excess dtd traffic” specs?

后端 未结 9 1175
青春惊慌失措
青春惊慌失措 2021-02-01 07:40

I\'m new to Scala, so I may be off base on this, I want to know if the problem is my code. Given the Scala file httpparse, simplified to:

object Http {
   import         


        
9条回答
  •  别那么骄傲
    2021-02-01 08:21

    Without addressing, for now, the problem, what do you expect to happen if the function request return false below?

    def fetchAndParseURL(URL:String) = {      
      val (true, body) = Http request(URL)
    

    What will happen is that an exception will be thrown. You could rewrite it this way, though:

    def fetchAndParseURL(URL:String) = (Http request(URL)) match {      
      case (true, body) =>      
        val xml = XML.load(body)
        "True"
      case _ => "False"
    }
    

    Now, to fix the XML parsing problem, we'll disable DTD loading in the parser, as suggested by others:

    def fetchAndParseURL(URL:String) = (Http request(URL)) match {      
      case (true, body) =>
        val f = javax.xml.parsers.SAXParserFactory.newInstance()
        f.setNamespaceAware(false)
        f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
        val MyXML = XML.withSAXParser(f.newSAXParser())
        val xml = MyXML.load(body)
        "True"
      case _ => "False"
    }
    

    Now, I put that MyXML stuff inside fetchAndParseURL just to keep the structure of the example as unchanged as possible. For actual use, I'd separate it in a top-level object, and make "parser" into a def instead of val, to avoid problems with mutable parsers:

    import scala.xml.Elem
    import scala.xml.factory.XMLLoader
    import javax.xml.parsers.SAXParser
    object MyXML extends XMLLoader[Elem] {
      override def parser: SAXParser = {
        val f = javax.xml.parsers.SAXParserFactory.newInstance()
        f.setNamespaceAware(false)
        f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
        f.newSAXParser()
      }
    }
    

    Import the package it is defined in, and you are good to go.

提交回复
热议问题