NET-A-PORTER / scala-uri

Simple scala library for building and parsing URIs
Other
261 stars 33 forks source link

Accept empty passwords in parser #101

Closed fchiron closed 9 years ago

fchiron commented 9 years ago

Currently, a java.net.URISyntaxException is raised when attempting to parse an URI with an empty password, such as ftp://theon:@github.com. However, it is possible to generate such an URI with scala-uri by calling .withPassword(""). This makes scala-uri unable to parse some of the URIs generated by itself.

This illustrates the problem :

scala> import com.netaporter.uri.Uri._
import com.netaporter.uri.Uri._

scala> parse("ftp://theon:password@github.com")
res0: com.netaporter.uri.Uri = ftp://theon:password@github.com

scala> parse("ftp://theon:password@github.com").withPassword("")
res1: com.netaporter.uri.Uri = ftp://theon:@github.com

scala> parse(res1.toString)
java.net.URISyntaxException: Invalid URI could not be parsed. Vector(RuleTrace(List(NonTerminal(Named(_uri),-12), NonTerminal(RuleCall,-12), NonTerminal(Sequence,-12), NonTerminal(FirstOf,-12), NonTerminal(Named(_abs_uri),-12), NonTerminal(RuleCall,-12), NonTerminal(Sequence,-12), NonTerminal(Optional,-6), NonTerminal(Named(_authority),-6), NonTerminal(RuleCall,-6), NonTerminal(Sequence,-6), NonTerminal(FirstOf,-6), NonTerminal(Sequence,-6), NonTerminal(Optional,-6), NonTerminal(Named(_userInfo),-6), NonTerminal(RuleCall,-6), NonTerminal(Sequence,-6), NonTerminal(Optional,-1), NonTerminal(Sequence,-1), NonTerminal(Capture,0), NonTerminal(OneOrMore,0), NonTerminal(Sequence,0)),NotPredicate(Terminal(AnyOf(@)),1)), RuleTrace(List(NonTerminal(Named(_uri),-12), NonTerminal(RuleCall,-12), NonTerminal(Sequence,-12), NonTerminal(FirstOf,-12), NonTerminal(Named(_abs_uri),-12), NonTerminal(RuleCall,-12), NonTerminal(Sequence,-12), NonTerminal(Optional,-6), NonTerminal(Named(_authority),-6), NonTerminal(RuleCall,-6), NonTerminal(Sequence,-6), NonTerminal(FirstOf,-6), NonTerminal(Sequence,-6), NonTerminal(Optional,-1), NonTerminal(Named(_port),-1), NonTerminal(RuleCall,-1), NonTerminal(Sequence,-1), NonTerminal(Capture,0), NonTerminal(OneOrMore,0), NonTerminal(Named(Digit),0)),CharPredicateMatch(CharPredicate.MaskBased(0123456789)))) at index 12: ftp://theon:@github.com
  at com.netaporter.uri.parsing.UriParser$.parse(UriParser.scala:67)
  at com.netaporter.uri.Uri$.parse(Uri.scala:288)
  ... 43 elided

To make the behavior more coherent, this PR updates the parser to accept empty passwords :

scala> import com.netaporter.uri.Uri._
import com.netaporter.uri.Uri._

scala> parse("ftp://theon:password@github.com")
res0: com.netaporter.uri.Uri = ftp://theon:password@github.com

scala> parse("ftp://theon:password@github.com").withPassword("")
res1: com.netaporter.uri.Uri = ftp://theon:@github.com

scala> parse(res1.toString)
res2: com.netaporter.uri.Uri = ftp://theon:@github.com
codecov-io commented 9 years ago

Current coverage is 92.50%

Merging #101 into master will not affect coverage as of 130d3ed

@@            master   #101   diff @@
=====================================
  Files           19     19       
  Stmts          200    200       
  Branches        12     12       
  Methods          0      0       
=====================================
  Hit            185    185       
  Partial          0      0       
  Missed          15     15       

Review entire Coverage Diff as of 130d3ed

Powered by Codecov. Updated on successful CI builds.

theon commented 9 years ago

Thanks!

theon commented 8 years ago

I just published a 0.4.9 release which should have this included.

fchiron commented 8 years ago

Great, thanks !