mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	Fix line delimited JSON response
For GET /events, line delimit JSON. Fixes #7047 Signed-off-by: Jessica Frazelle <jfrazelle@users.noreply.github.com> Docker-DCO-1.1-Signed-off-by: Jessica Frazelle <jfrazelle@users.noreply.github.com> (github: )
This commit is contained in:
		
							parent
							
								
									68e07f3fa0
								
							
						
					
					
						commit
						d2f75a3040
					
				
					 3 changed files with 64 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -278,6 +278,8 @@ func getEvents(eng *engine.Engine, version version.Version, w http.ResponseWrite
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	var job = eng.Job("events")
 | 
			
		||||
	// lineDelimited JSON events was added #7047
 | 
			
		||||
	job.SetenvBool("lineDelim", version.GreaterThanOrEqualTo("1.15"))
 | 
			
		||||
	streamJSON(job, w, true)
 | 
			
		||||
	job.Setenv("since", r.Form.Get("since"))
 | 
			
		||||
	job.Setenv("until", r.Form.Get("until"))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,6 +101,11 @@ func writeEvent(job *engine.Job, event *utils.JSONMessage) error {
 | 
			
		|||
	// When sending an event JSON serialization errors are ignored, but all
 | 
			
		||||
	// other errors lead to the eviction of the listener.
 | 
			
		||||
	if b, err := json.Marshal(event); err == nil {
 | 
			
		||||
 | 
			
		||||
		if job.GetenvBool("lineDelim") {
 | 
			
		||||
			b = append(b, []byte("\r\n")...)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if _, err = job.Stdout.Write(b); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										57
									
								
								integration-cli/docker_api_events_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								integration-cli/docker_api_events_test.go
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,57 @@
 | 
			
		|||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestGetEventsLineDelim(t *testing.T) {
 | 
			
		||||
	name := "testimageevents"
 | 
			
		||||
	defer deleteImages(name)
 | 
			
		||||
	_, err := buildImage(name,
 | 
			
		||||
		`FROM scratch
 | 
			
		||||
        MAINTAINER "docker"`,
 | 
			
		||||
		true)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if err := deleteImages(name); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	endpoint := fmt.Sprintf("/events?since=1&until=%d", time.Now().Unix())
 | 
			
		||||
	body, err := sockRequest("GET", endpoint)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	linesRead := 0
 | 
			
		||||
	scanner := bufio.NewScanner(bytes.NewReader(body))
 | 
			
		||||
	for scanner.Scan() && linesRead < 2 {
 | 
			
		||||
		line := scanner.Bytes()
 | 
			
		||||
		if len(line) == 0 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// make sure line delimited json
 | 
			
		||||
		res := make(map[string]interface{})
 | 
			
		||||
		if err := json.Unmarshal(line, &res); err != nil {
 | 
			
		||||
			t.Fatalf("Unmarshaling the line as JSON failed: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		linesRead++
 | 
			
		||||
	}
 | 
			
		||||
	if err := scanner.Err(); err != nil {
 | 
			
		||||
		t.Fatalf("Scanner failed: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if linesRead < 2 {
 | 
			
		||||
		t.Fatalf("Only %d lines were read from the stream", linesRead)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	logDone("events - test the api response is line delimited json")
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue