Отправить изображение по http через веб-сервер socat bash

Я пытаюсь написать веб-сервер в bash, используя socat. У меня проблемы с обработкой запросов изображений. Я открываю соединение для прослушивания socat следующим образом:

socat -T 30 -d -d TCP-L:$LISTENIP,reuseaddr,fork,crlf SYSTEM:"$0 \"docroot=$DOCROOT\""

Я подаю изображение следующим образом, где $1 — это docroot, а $2 — это имя файла изображения.

function serve_png {
  if [ -e $1$2 ]
  then
    SIZE=`stat -c '%s' $1$2`
    echo -ne "HTTP/1.1 200 OK\nContent-type: image/png\nContent-length: $SIZE\n\n"
    cat $1$2
  else
    echo -ne "HTTP/1.1 404 Not Found\nContent-type: text/html\n\n404 - Not found\n"
  fi
}

Изображение не отображается в Firefox из-за того, что оно «содержат ошибки». Я получаю следующий вывод на console.

2014/01/25 08:00:41 socat[11551] N listening on AF=2 0.0.0.0:8080
2014/01/25 08:00:45 socat[11551] N accepting connection from AF=2 $MYIP:55765 on AF=2 $SERVERIP:8080
2014/01/25 08:00:45 socat[11552] N forking off child, using socket for reading and writing
2014/01/25 08:00:45 socat[11551] N forked off child process 11552
2014/01/25 08:00:45 socat[11551] N listening on AF=2 0.0.0.0:8080
2014/01/25 08:00:45 socat[11552] N forked off child process 11553
2014/01/25 08:00:45 socat[11552] N forked off child process 11553
2014/01/25 08:00:45 socat[11552] N starting data transfer loop with FDs [4,4] and [3,3]
2014/01/25 08:00:45 socat[11552] W read(3, 0x8e2e388, 8192): Connection reset by peer
2014/01/25 08:00:45 socat[11552] N socket 2 to socket 1 is in error
2014/01/25 08:00:45 socat[11552] N socket 2 (fd 3) is at EOF
2014/01/25 08:00:45 socat[11552] N socket 1 (fd 4) is at EOF
2014/01/25 08:00:45 socat[11552] N socket 2 (fd 3) is at EOF
2014/01/25 08:00:45 socat[11552] N exiting with status 0

Я видел похожие сценарии с использованием netcat, но не могу заставить его работать с помощью socat. Я хотел бы продолжать использовать socat, поскольку он может разветвлять и обрабатывать несколько соединений. Любые идеи будут оценены.


person spike.barnett    schedule 25.01.2014    source источник
comment
ты урод! вот так :) Вы открывали изображение в текстовом/шестнадцатеричном редакторе?   -  person hek2mgl    schedule 25.01.2014
comment
Изображение не было открыто ни в каком редакторе на стороне сервера. Я получил его перед запуском сервера специально для тестирования.   -  person spike.barnett    schedule 25.01.2014
comment
Я имею в виду, проверяли ли вы файл после того, как он был загружен с вашего сервера socat?   -  person hek2mgl    schedule 25.01.2014
comment
Не удалось открыть «/home/spikec/test.png»: ошибка при чтении «/home/spikec/test.png». Файл поврежден? Когда я просматриваю их в текстовом редакторе, кажется, что есть разрывы строк там, где их быть не должно. Не удалось добиться разрыва строк в этом комментарии после нескольких правок. :(   -  person spike.barnett    schedule 25.01.2014
comment
Также, похоже, отсутствуют управляющие символы, такие как ^M.   -  person spike.barnett    schedule 25.01.2014
comment
Попробуйте опустить параметр crlf и использовать \r\n вместо \n в операторах эха. Хотя я не могу найти никакой документации для параметра crlf, я предполагаю, что он такой же, как документированный crnl, и в этом случае он изменит все байты 0x0a в PNG на 0x0d0a и, таким образом, испортит изображение.   -  person Steffen Ullrich    schedule 25.01.2014
comment
Штеффен: Это действительно было причиной порчи. Спасибо за помощь.   -  person spike.barnett    schedule 25.01.2014
comment
Вы можете увидеть пример веб-сервера bash, который я развил из другого проекта и над которым работал: https://github.com/AdamDanischewski/bashttpd он использует socat, я использую команду socat TCP4-LISTEN:8080,fork EXEC:"bashttpd"   -  person    schedule 16.05.2015


Ответы (1)


У Штеффена Ульриха было то, что он убрал флаг crlf из команды socat. Это приводило к тому, что Cariage Returns/Line Feeds автоматически вставлялись в поток с помощью socat (отсюда и повреждение файла). После исключения этой опции все заработало, как и ожидалось.

person spike.barnett    schedule 24.06.2014