@@ -8,7 +8,6 @@ package rapid
88
99import (
1010 "fmt"
11- "net"
1211 "net/url"
1312 "reflect"
1413 "strings"
@@ -31,29 +30,17 @@ func (*domainNameGen) String() string {
3130 return "Domain()"
3231}
3332
34- func (* domainNameGen ) type_ () reflect.Type {
35- return domainType
36- }
37-
3833var tldGenerator = SampledFrom (tlds )
3934
40- func (g * domainNameGen ) value (t * T ) value {
35+ func (g * domainNameGen ) value (t * T ) string {
4136 domain := tldGenerator .
4237 Filter (func (s string ) bool { return len (s )+ 2 <= domainMaxLength }).
43- Map (func (s string ) string {
44- var n string
45- for _ , ch := range s {
46- n += string (SampledFrom ([]rune {unicode .ToLower (ch ), unicode .ToUpper (ch )}).Draw (t , "" ).(rune ))
47- }
48-
49- return n
50- }).
51- Draw (t , "domain" ).(string )
38+ Draw (t , "domain" )
5239
5340 expr := fmt .Sprintf (`[a-zA-Z]([a-zA-Z0-9\-]{0,%d}[a-zA-Z0-9])?` , domainMaxElementLength - 2 )
54- elements := newRepeat (1 , 126 , 1 )
55- for elements .more (t .s , g . String () ) {
56- subDomain := StringMatching (expr ).Draw (t , "subdomain" ).( string )
41+ elements := newRepeat (1 , 126 , 1 , g . String () )
42+ for elements .more (t .s ) {
43+ subDomain := StringMatching (expr ).Draw (t , "subdomain" )
5744 if len (domain )+ len (subDomain ) >= domainMaxLength {
5845 break
5946 }
@@ -64,8 +51,8 @@ func (g *domainNameGen) value(t *T) value {
6451}
6552
6653// Domain generates an RFC 1035 compliant domain name.
67- func Domain () * Generator {
68- return newGenerator (& domainNameGen {})
54+ func Domain () * Generator [ string ] {
55+ return newGenerator [ string ] (& domainNameGen {})
6956}
7057
7158type urlGenerator struct {
@@ -76,38 +63,42 @@ func (g *urlGenerator) String() string {
7663 return "URL()"
7764}
7865
79- func (g * urlGenerator ) type_ () reflect.Type {
80- return urlType
81- }
82-
8366var printableGen = StringOf (RuneFrom (nil , unicode .PrintRanges ... ))
8467
85- func (g * urlGenerator ) value (t * T ) value {
86- scheme := SampledFrom (g .schemes ).Draw (t , "scheme" ).( string )
68+ func (g * urlGenerator ) value (t * T ) url. URL {
69+ scheme := SampledFrom (g .schemes ).Draw (t , "scheme" )
8770 var domain string
88- switch SampledFrom ([]int {0 , 1 , 2 }).Draw (t , "g" ).( int ) {
71+ switch SampledFrom ([]int {0 , 1 , 2 }).Draw (t , "g" ) {
8972 case 2 :
90- domain = Domain ().Draw (t , "domain" ).( string )
73+ domain = Domain ().Draw (t , "domain" )
9174 case 1 :
92- domain = IPv6 ().Draw (t , "domain" ).(net. IP ). String ()
75+ domain = IPv6 ().Draw (t , "domain" ).String ()
9376 domain = "[" + domain + "]"
9477 case 0 :
95- domain = IPv4 ().Draw (t , "domain" ).(net.IP ).String ()
78+ domain = IPv4 ().Draw (t , "domain" ).String ()
79+ }
80+ port := IntRange (0 , 2 ^ 16 - 1 ).Draw (t , "port" )
81+ path_ := SliceOf (printableGen ).Draw (t , "path" )
82+ query := SliceOf (printableGen ).Draw (t , "query" )
83+ fragment := printableGen .Draw (t , "fragment" )
84+
85+ // join domain and port
86+ if port > 0 {
87+ domain += fmt .Sprintf (":%d" , port )
88+ }
89+
90+ // URL escape path
91+ for i := range path_ {
92+ path_ [i ] = url .PathEscape (path_ [i ])
93+ }
94+
95+ // url escape query strings
96+ for i := range query {
97+ query [i ] = url .QueryEscape (query [i ])
9698 }
97- port := IntRange (0 , 2 ^ 16 - 1 ).
98- Map (func (i int ) string {
99- if i == 0 {
100- return ""
101- }
102- return fmt .Sprintf (":%d" , i )
103- }).
104- Draw (t , "port" ).(string )
105- path_ := SliceOf (printableGen ).Draw (t , "path" ).([]string )
106- query := SliceOf (printableGen .Map (url .QueryEscape )).Draw (t , "query" ).([]string )
107- fragment := printableGen .Draw (t , "fragment" ).(string )
10899
109100 return url.URL {
110- Host : domain + port ,
101+ Host : domain ,
111102 Path : strings .Join (path_ , "/" ),
112103 Scheme : scheme ,
113104 RawQuery : strings .Join (query , "&" ),
@@ -116,12 +107,12 @@ func (g *urlGenerator) value(t *T) value {
116107}
117108
118109// URL generates RFC 3986 compliant http/https URLs.
119- func URL () * Generator {
110+ func URL () * Generator [url. URL ] {
120111 return urlOf ([]string {"http" , "https" })
121112}
122113
123- func urlOf (schemes []string ) * Generator {
124- return newGenerator (& urlGenerator {
114+ func urlOf (schemes []string ) * Generator [url. URL ] {
115+ return newGenerator [url. URL ] (& urlGenerator {
125116 schemes : schemes ,
126117 })
127118}
0 commit comments