// reduce boilerplate, dump this segment to disk. func SegToFile(seg *capn.Segment, filePath string) { file, err := os.Create(filePath) if err != nil { panic(err) } seg.WriteTo(file) file.Close() }
func ShowSeg(msg string, seg *capn.Segment) []byte { pre := bytes.Buffer{} seg.WriteTo(&pre) fmt.Printf("%s\n", msg) by := pre.Bytes() ShowBytes(by, 10) return by }
func SegToBytes(seg *capn.Segment) []byte { if seg == nil { log.Fatal("SegToBytes called with nil segment!") } buf := new(bytes.Buffer) if _, err := seg.WriteTo(buf); err != nil { log.Fatal("Error when writing segment to bytes:", err) } return buf.Bytes() }
// notifyContact routes a message to a single contact. func (r *BroadcastRouter) notifyContact(deliveries chan<- bool, url string, segment *capn.Segment, logID string) { buf := bytes.Buffer{} segment.WriteTo(&buf) req, err := http.NewRequest("PUT", url, &buf) if err != nil { if r.logger.ShouldLog(ERROR) { r.logger.Error("router", "Router request failed", LogFields{"rid": logID, "error": err.Error()}) } deliveries <- false return } req.Header.Set(HeaderID, logID) if r.logger.ShouldLog(DEBUG) { r.logger.Debug("router", "Sending request", LogFields{"rid": logID, "url": url}) } req.Header.Add("Content-Type", "application/json") resp, err := r.rclient.Do(req) if err != nil { if r.logger.ShouldLog(ERROR) { r.logger.Error("router", "Router send failed", LogFields{"rid": logID, "error": err.Error()}) } deliveries <- false return } defer resp.Body.Close() // Discard the response body. If the body is not fully consumed, the HTTP // client will not reuse the underlying TCP connection. io.Copy(ioutil.Discard, resp.Body) if resp.StatusCode != 200 { if r.logger.ShouldLog(DEBUG) { r.logger.Debug("router", "Denied", LogFields{"rid": logID, "url": url}) } deliveries <- false return } if r.logger.ShouldLog(INFO) { r.logger.Info("router", "Server accepted", LogFields{"rid": logID, "url": url}) } deliveries <- true }
// shell out to display capnp bytes as human-readable text. Data flow: // in-memory capn segment -> stdin to capnp decode -> stdout human-readble string form func CapnpDecodeSegment(seg *capn.Segment, capnpExePath string, capnpSchemaFilePath string, typeName string) string { // set defaults if capnpExePath == "" { capnpExePath = CheckAndGetCapnpPath() } if capnpSchemaFilePath == "" { capnpSchemaFilePath = "aircraftlib/aircraft.capnp" } if typeName == "" { typeName = "Z" } cs := []string{"decode", "--short", capnpSchemaFilePath, typeName} cmd := exec.Command(capnpExePath, cs...) cmdline := capnpExePath + " " + strings.Join(cs, " ") buf := new(bytes.Buffer) seg.WriteTo(buf) cmd.Stdin = buf var errout bytes.Buffer cmd.Stderr = &errout bs, err := cmd.Output() if err != nil { if err.Error() == "exit status 1" { cwd, _ := os.Getwd() fmt.Fprintf(os.Stderr, "\nCall to capnp in CapnpDecodeSegment(): '%s' in dir '%s' failed with status 1\n", cmdline, cwd) fmt.Printf("stderr: '%s'\n", string(errout.Bytes())) fmt.Printf("stdout: '%s'\n", string(bs)) } panic(err) } return strings.TrimSpace(string(bs)) }