| // Copyright Istio Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package main |
| |
| import ( |
| "bufio" |
| "fmt" |
| "io" |
| "net" |
| "os" |
| "strings" |
| ) |
| |
| // main serves as the program entry point |
| func main() { |
| // obtain the port and prefix via program arguments |
| ports := strings.Split(os.Args[1], ",") |
| prefix := os.Args[2] |
| for _, port := range ports { |
| addr := fmt.Sprintf(":%s", port) |
| go serve(addr, prefix) |
| } |
| ch := make(chan struct{}) |
| <-ch |
| } |
| |
| // serve starts serving on a given address |
| func serve(addr, prefix string) { |
| // create a tcp listener on the given port |
| listener, err := net.Listen("tcp", addr) |
| if err != nil { |
| fmt.Println("failed to create listener, err:", err) |
| os.Exit(1) |
| } |
| fmt.Printf("listening on %s, prefix: %s\n", listener.Addr(), prefix) |
| |
| // listen for new connections |
| for { |
| conn, err := listener.Accept() |
| if err != nil { |
| fmt.Println("failed to accept connection, err:", err) |
| continue |
| } |
| |
| // pass an accepted connection to a handler goroutine |
| go handleConnection(conn, prefix) |
| } |
| } |
| |
| // handleConnection handles the lifetime of a connection |
| func handleConnection(conn net.Conn, prefix string) { |
| defer conn.Close() |
| reader := bufio.NewReader(conn) |
| for { |
| // read client request data |
| bytes, err := reader.ReadBytes(byte('\n')) |
| if err != nil { |
| if err != io.EOF { |
| fmt.Println("failed to read data, err:", err) |
| } |
| return |
| } |
| fmt.Printf("request: %s", bytes) |
| |
| // prepend prefix and send as response |
| line := fmt.Sprintf("%s %s", prefix, bytes) |
| fmt.Printf("response: %s", line) |
| conn.Write([]byte(line)) |
| } |
| } |