Hello,
Your program reads data from STDIN. The line you mentioned "$string = <STDIN>;" works if your input is a single line. For multiline input, you need to devise a way to stop reading and start processing.
There are many ways to do this:
- Put the entire input in one line:
Example: Use
Abdulaziz Ghuloum;;myemail@mycompany.com;;Subject Here
instead of From: Abdulaziz Ghuloum
Email: myemail@mycompany.com
Subject: Subject Here
This way, your code can easily extrace all message components. This method only works if the message is small and if you can always find a unique separator (";;" in the example I provided).
- Give the number of lines in the header, just like how http supplies Content-length header or email messages give the number of lines in the header.
Your script should read the headers and check for the message length header and then, after reading the headers, reads in a loop until it reads the whole message.
This is the recommended way for text or binary messages.
- Decide on a terminating sequence to finish reading and start processing. Usually this sequence is a blank line. The client sends a "\n" after sending every "line\n" and the server, after chomping the line, does "last unless length".
This is the recommended method for text messages.
Remember that simply reading from STDIN in a list context will cause your program to appear hanging as it blocks waiting for more input.
Undefining $/ should cause you trouble as your program will read waiting for EOF which might not happen unless the client closes writing to the socket.
Hope this helps,,,
Aziz,,,