11var assert = require ( 'assert' )
22var stringKey = require ( 'dat-encoding' ) . toStr
33var nets = require ( 'nets' )
4+ var parseUrl = require ( 'node-parse-url' )
5+ var datDns = require ( 'dat-dns' ) ( )
46var debug = require ( 'debug' ) ( 'dat-link-resolve' )
57
68module . exports = resolve
@@ -22,30 +24,40 @@ function resolve (link, cb) {
2224
2325 function lookup ( ) {
2426 var url = link . indexOf ( 'http' ) > - 1 ? link : 'http://' + link
25-
26- // TODO: if TLD, check .well-known first
27-
28- debug ( 'lookup()' , url )
29- nets ( { url : url , json : true } , function ( err , resp , body ) {
30- if ( err ) return cb ( err )
31- if ( resp . statusCode !== 200 ) return cb ( body . message )
32-
33- // first check if key is in header response
34- key = resp . headers [ 'hyperdrive-key' ] || resp . headers [ 'dat-key' ]
35- if ( key ) {
36- debug ( 'Received key from http header:' , key )
37- return cb ( null , key )
38- }
39-
40- // else fall back to parsing the body
41- try {
42- key = stringKey ( body . url )
43- debug ( 'Received key via json:' , key )
44- if ( key ) return cb ( null , key )
45- } catch ( e ) {
46- cb ( new Error ( e ) )
47- }
48- cb ( new Error ( 'Unable to lookup key from http link.' ) )
27+ var parsed = parseUrl ( url )
28+ debug ( 'parsed url' , parsed )
29+ if ( parsed . path && parsed . path !== '/' ) return resolveKey ( )
30+
31+ // If no path, check .well-known first
32+ url = parsed . subdomain ? `${ parsed . subdomain } .${ parsed . domain } ` : parsed . domain
33+ datDns . resolveName ( parsed . domain , function ( err , key ) {
34+ if ( key ) return cb ( null , key )
35+ if ( err ) debug ( 'datDns.resolveName() error' , err )
36+ resolveKey ( )
4937 } )
38+
39+ function resolveKey ( ) {
40+ nets ( { url : url , json : true } , function ( err , resp , body ) {
41+ if ( err ) return cb ( err )
42+ if ( resp . statusCode !== 200 ) return cb ( body . message )
43+
44+ // first check if key is in header response
45+ key = resp . headers [ 'hyperdrive-key' ] || resp . headers [ 'dat-key' ]
46+ if ( key ) {
47+ debug ( 'Received key from http header:' , key )
48+ return cb ( null , key )
49+ }
50+
51+ // else fall back to parsing the body
52+ try {
53+ key = stringKey ( body . url )
54+ debug ( 'Received key via json:' , key )
55+ if ( key ) return cb ( null , key )
56+ } catch ( e ) {
57+ cb ( new Error ( e ) )
58+ }
59+ cb ( new Error ( 'Unable to lookup key from http link.' ) )
60+ } )
61+ }
5062 }
5163}
0 commit comments