服务器套接字编程-读取HTTP标头

I am trying to write an HTTP server in Go for school. I am required to AVOID any libraries that make this task easy (the net/http for example).

My problem is that I cannot seem to display the HTTP Response headers correctly. I want to print each header to my terminal, line by line.

I have written this program in Java, and it works well, however, I would like to have this working with a Go program.

I have a function called 'handleClient' that takes an accepted socket.

func handleClient(c net.Conn) {
  defer c.Close()
  req, _ := bufio.NewReader(c).ReadString('
')
  fmt.Print(string(req))

When using a web browser to connect to 'localhost:8080', my terminal displays "GET / HTTP/1.1", which is correct, however, I need the additional lines to be posted as well. I understand that 'ReadString(' ') is what is stopping this from happening, however, it is the only way I know of to end that line.

How to I start additional lines?

You can call ReadString inside a loop until you hit EOF.

Something like this:

func handleClient(c net.Conn) {
  defer c.Close()
  r := bufio.NewReader(c)
  for {
      req, err := r.ReadString('
')
      if err != nil && err != io.EOF {
          panic(err)
      }
      fmt.Println(req)

      // break the loop if the err is eof
      if err == io.EOF {
          break
      }
  }

mkopriva pointed me in the right direction, however, EOF is not the correct way to break the loop. I need to stop looping when I run into a line that is blank. Technically it is never EOF.

To do this, I have adjusted the if condition to break the loop to the following:

if len(req) <=2 {

After all the headers are read / printed, an HTTP request will end with " " I believe. I can confirm that the last line is intact of length 2.

Thanks for the help!