I tried writing this http post request which streams the request body line-by-line as JSON. (This is for an ElasticSearch bulk api request, newline separate JSON in the request body). I didn't think the waitgroup was necessary, but apparently the waitgroup is necessary. Does anyone know why? I assume the need for the waitgroup might represent a bug in my code.
Here is the same code in a github gist: https://gist.github.com/ORESoftware/06341057ca39e1b2a47dc8a8e4e4b55f func doBulkUpsertWithResponse(baseUrl string, z []UpsertDoc) (*map[string]interface{}, error) { var m *map[string]interface{} if len(z) < 1 { return m, nil } rd, wr := io.Pipe() // we stream json lines to post request wg := sync.WaitGroup{} wg.Add(1) go func() { defer func() { // close the stream after writing is finished wg.Done() wr.Close(); }() for _, v := range z { var doc = ElasticBulkUpsertable{ &v.Doc, true, } jsonStr, err := json.Marshal(&doc) if err != nil { continue } updateLine := fmt.Sprintf(`{"update":{"_id":"%s"}}`, v.Id) + "\n" if _, err := wr.Write([]byte(updateLine)); err != nil { continue } docLine := string(jsonStr) + "\n" if _, err := wr.Write([]byte(docLine)); err != nil { continue } } }() fullUrl := fmt.Sprintf("%s/%s", baseUrl, "_bulk") req, err := http.NewRequest("POST", fullUrl, rd) if err != nil { log.Println(fmt.Errorf("cm:3ec045d3-4790-4d7a-aab8-65949933d263: '%v'", err)) return nil, err } req.Header.Set("Content-Type", "application/json") resp, err := client.Do(req) wg.Wait() if err != nil { return m, err } defer func() { resp.Body.Close() }() if resp.StatusCode != 200 { return m, errors.New("request failed with status code: " + resp.Status) } if err := json.NewDecoder(resp.Body).Decode(&m); err != nil { return nil, err } return m, nil } -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/4d6b60cd-4b9e-4bce-aa6f-2d2bfbefbd98n%40googlegroups.com.