Skip to content

Commit c589190

Browse files
authored
Revert "fix headers/body order (#55)" (#74)
This reverts commit e63e657. The commit above introduced sane-ordering to the terminal output by prioritizing headers first and then the response body. But unfortunately it introduces a deadlock in cases where we have no headers to print. Commands like `curlie` or `curlie -h` will hang. Sometimes it also causes the program to deadlock even when headers are present. It probably has something to do with the code failing to properly detect where the headers' section ends. But this is difficult to reproduce.
1 parent 961dad4 commit c589190

File tree

2 files changed

+1
-36
lines changed

2 files changed

+1
-36
lines changed

Diff for: formatter/cleanup.go

-11
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ type HeaderCleaner struct {
1616
// Post is inserted after the request headers.
1717
Post *bytes.Buffer
1818

19-
HeadersDone chan<- struct{}
20-
2119
buf []byte
2220
line []byte
2321
}
@@ -31,8 +29,6 @@ func (c *HeaderCleaner) Write(p []byte) (n int, err error) {
3129
n = len(p)
3230
cp := c.buf
3331
p = bytes.Replace(p, capath, ccapath, 1) // Fix curl misformatted line
34-
35-
closeAfterWrite := false
3632
for len(p) > 0 {
3733
idx := bytes.IndexByte(p, '\n')
3834
if idx == -1 {
@@ -52,9 +48,6 @@ func (c *HeaderCleaner) Write(p []byte) (n int, err error) {
5248
}
5349
case '<':
5450
c.line = c.line[i+2:]
55-
if bytes.Equal(c.line, []byte("\r\n")) && c.HeadersDone != nil {
56-
closeAfterWrite = true
57-
}
5851
case '}', '{':
5952
ignore = true
6053
if c.Verbose && c.Post != nil {
@@ -69,13 +62,9 @@ func (c *HeaderCleaner) Write(p []byte) (n int, err error) {
6962
if !ignore {
7063
cp = append(cp, c.line...)
7164
}
72-
7365
c.line = c.line[:0]
7466
}
7567
_, err = c.Out.Write(cp)
76-
if closeAfterWrite {
77-
close(c.HeadersDone)
78-
}
7968
return
8069
}
8170

Diff for: main.go

+1-25
Original file line numberDiff line numberDiff line change
@@ -138,28 +138,14 @@ func main() {
138138
fmt.Println()
139139
return
140140
}
141-
142141
cmd := exec.Command("curl", opts...)
143142
cmd.Stdin = stdin
144143
cmd.Stdout = stdout
145-
146-
tmpOut := &formatter.HeaderCleaner{
144+
cmd.Stderr = &formatter.HeaderCleaner{
147145
Out: stderr,
148146
Verbose: verbose,
149147
Post: input,
150148
}
151-
152-
if terminal.IsTerminal(stdoutFd) && terminal.IsTerminal(stderrFd) && !quiet {
153-
headerBlock := make(chan struct{})
154-
cmd.Stdout = &blockedWrite{
155-
ch: headerBlock,
156-
out: stdout,
157-
}
158-
tmpOut.HeadersDone = headerBlock
159-
}
160-
161-
cmd.Stderr = tmpOut
162-
163149
if (opts.Has("I") || opts.Has("head")) && terminal.IsTerminal(stdoutFd) {
164150
cmd.Stdout = ioutil.Discard
165151
}
@@ -189,13 +175,3 @@ func headerSupplied(opts args.Opts, header string) bool {
189175
}
190176
return false
191177
}
192-
193-
type blockedWrite struct {
194-
ch <-chan struct{}
195-
out io.Writer
196-
}
197-
198-
func (c *blockedWrite) Write(p []byte) (n int, err error) {
199-
<-c.ch
200-
return c.out.Write(p)
201-
}

0 commit comments

Comments
 (0)