github.com/aarzilli/tools@v0.0.0-20151123112009-0d27094f75e0/net/http/fileserver/2_dir_contents.go (about)

     1  package fileserver
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"net/url"
     7  	"path"
     8  	"strings"
     9  	"time"
    10  
    11  	"github.com/pbberlin/tools/net/http/fetch"
    12  	"github.com/pbberlin/tools/net/http/loghttp"
    13  	"github.com/pbberlin/tools/os/fsi/common"
    14  	"github.com/pbberlin/tools/stringspb"
    15  )
    16  
    17  // GetDirContents fetches from fileserver - via http
    18  // Parsing the received JSON into string slices
    19  func GetDirContents(hostWithPrefix, dir string) ([]string, []string, *bytes.Buffer, error) {
    20  
    21  	lg, lge := loghttp.Logger(nil, nil)
    22  	_ = lg
    23  
    24  	var b = new(bytes.Buffer)
    25  
    26  	dirs := []string{}
    27  	fils := []string{}
    28  
    29  	// build url
    30  	urlSubDirs, err := url.Parse(path.Join(hostWithPrefix, dir))
    31  	lge(err)
    32  	if err != nil {
    33  		return dirs, fils, b, err
    34  	}
    35  	sd := urlSubDirs.String()
    36  	sd = common.Directorify(sd)
    37  	wpf(b, "requ subdirs from  %v", sd)
    38  
    39  	// make req
    40  	bsubdirs, effU, err := fetch.UrlGetter(nil, fetch.Options{URL: sd})
    41  	lge(err)
    42  	if err != nil {
    43  		return dirs, fils, b, err
    44  	}
    45  	wpf(b, "got %s - %v", bsubdirs, effU)
    46  
    47  	// parse json
    48  	mpSubDir := []map[string]string{}
    49  	err = json.Unmarshal(bsubdirs, &mpSubDir)
    50  	lge(err)
    51  	if err != nil {
    52  		// lg("%s", bsubdirs)
    53  		return dirs, fils, b, err
    54  	}
    55  	wpf(b, "json of subdir is %s", stringspb.IndentedDump(mpSubDir))
    56  
    57  	for _, v := range mpSubDir {
    58  
    59  		if dir, ok := v["path"]; ok {
    60  			if strings.HasSuffix(dir, "/") {
    61  				dirs = append(dirs, dir)
    62  			} else {
    63  				fils = append(fils, dir)
    64  			}
    65  		}
    66  
    67  		if smod, ok := v["mod"]; ok {
    68  			t, err := time.Parse(time.RFC1123Z, smod)
    69  			lge(err)
    70  			wpf(b, "age %-6.2v", time.Now().Sub(t).Hours())
    71  		}
    72  
    73  	}
    74  	return dirs, fils, b, nil
    75  
    76  }