ovgolovin
ovgolovin

Reputation: 13410

Reading lines from piped input in infinite while loop

I made a simple script in bash to serve as a http proxy.

#!/usr/bin/env bash

trap "kill 0" SIGINT SIGTERM EXIT  # kill all subshells on exit

port="6000"

rm -f client_output client_output_for_request_forming server_output
mkfifo client_output client_output_for_request_forming server_output  # create named pipes

# creating subshell
(
    cat <server_output |
    nc -lp $port |  # awaiting connection from the client of the port specified
    tee client_output |  # sending copy of ouput to client_output pipe
    tee client_output_for_request_forming # sending copy of ouput to client_output_for_request_forming pipe
) &   # starting subshell in a separate process

echo "OK!"

# creating another subshell (to feed client_output_for_request_forming to it)
(
    while read line;  # read input from client_output_for_request_forming line by line
    do
        echo "line read: $line"
        if [[ $line =~ ^Host:[[:space:]]([[:alnum:].-_]*)(:([[:digit:]]+))?[[:space:]]*$ ]]
        then
            echo "match: $line"
            server_port=${BASH_REMATCH[3]}  # extracting server port from regular expression
            if [[ "$server_port" -eq "" ]]
            then
                server_port="80"
            fi
            host=${BASH_REMATCH[1]}  # extracting host from regular expression
            nc $host $server_port <client_output |  # connect to the server
            tee server_output  # send copy to server_output pipe
            break
        fi
    done

) <client_output_for_request_forming


echo "OK2!"

rm -f client_output client_output_for_request_forming server_output

I start it in first terminal. And it outputs OK!

And in the second I type:

netcat localhost 6000

and then start entering lines of text expecting them to be displayed in the first terminal window as there is a cycle while read line. But nothing is displayed.

What is it that I'm doing wrong? How can I make it work?

Upvotes: 0

Views: 682

Answers (1)

William Pursell
William Pursell

Reputation: 212268

If no process is reading from the client_output fifo, then the background pipeline is not starting. Since the process that reads client_output does not start until a line is read from client_output_for_request_forming, your processes are blocked.

Upvotes: 3

Related Questions