2014-10-05 78 views
0

我有一個格式爲blah = foo的配置文件。我想有這樣的條目:一個HTTP分隔符來規則它們全部

http = https://stackoverflow.com/questions,header keys and values,string to search for.

我沒事要求該URL中urlecncoded。有沒有我可以使用的ASCII字符,在上面的例子中任何地方都不是有效的值(在分割一次後=)?我的例子使用逗號,但我認爲這是有效的標題值?

通過一些RFC後,我認爲有人更熟悉這可以節省我一些痛苦。

而且我的項目是圍棋若存在STD庫,可能這方面的幫助...

+0

如果你有控制格式,爲什麼不使用json或csv? – OneOfOne 2014-10-05 18:59:33

+0

@OneOfOne:我開始在CSV中實現它。所以我讀了=使用Go的標準csv閱讀器的右側。開始,除非我陷入困境。然後我的想法是使標題最後作爲vargs ... – 2014-10-05 19:07:59

回答

1

您可以使用使用中等點(組成一個非ASCII字符,並用urlencode,例如+^+在linux上):

const sep = `·` 
const t = `http = https://stackoverflow.com/questions·string to search for·header=value·header=value` 

func parseLine(line string) (name, url, search string, headers []string) { 
    idx := strings.Index(line, " = ") 
    if idx == -1 { 
     return 
    } 
    name = line[:idx] 
    parts := strings.Split(line[idx+3:], sep) 
    if len(parts) < 3 { 
     // handle invalid line 
    } 
    url, search = parts[0], parts[1] 
    headers = parts[2:] 
    return 
} 

儘管使用JSON可能是最好的和最長期的可維護選項。

爲了完整起見,JSON版本會是什麼樣子:

type Site struct { 
    Url  string 
    Query string 
    Headers map[string]string 
} 

const t = `[ 
    { 
     "url": "https://stackoverflow.com/questions", 
     "query": "string to search for", 
     "headers": {"header": "value", "header2": "value"} 
    }, 
    { 
     "url": "https://google.com", 
     "query": "string to search for", 
     "headers": {"header": "value", "header2": "value"} 
    } 
]` 

func main() { 
    var sites []Site 
    err := json.Unmarshal([]byte(t), &sites) 
    fmt.Printf("%+v (%v)\n", sites, err) 
} 
0

從本質上講,你要看看RFC 3986,RFC 7230和朋友,看看能發生什麼。

如果您堅持認爲它們是有效的,只需使用空格字符或「<」和「>」作爲分隔符即可。

字段值幾乎可以是任何東西;儘管HTTP禁止控制字符,所以你可能能夠使用水平TAB(如果你可以用無效的字段值來解決問題)。

+0

空間可以在http頭值我想.... – 2014-10-05 20:45:41

+0

以及我的「搜索字符串」。 – 2014-10-05 20:46:09

相關問題