1 (edytowany przez tinware 2020-07-10 20:42:21)

Temat: CURL - nagłówek i dane do różnych zmiennych oraz timeouty w uhttpd

Cześć,

Pobieram obraz CURLem:

WWW=$( /usr/bin/curl -m 3 -D - "http://1.2.3.4/image.jpg" | base64 )

Zmienna WWW przyjmuje wartość:

HTTP/1.1 200 OK
Date: Sat, 04 Jul 2020 22:04:39 GMT
Server: Apache/2.4.25 (Debian)
Content-Type: image/jpeg; charset="UTF-8"
Content-Length: 53133
Via: 1.1 localhost

˙Ř˙ŕ JFIF      ˙Ű C 
2!=,.$2I@LKG@FEPZsbPU
;!!;|SFS||||||||||||||||||||||||||||||||||||||||||||||||||˙Ŕ Đ 
˙Ä µ   } !1A
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwx—˜™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôő    
˙Ä µ  w !1AQaq"2
$4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ—˜™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęň¶1KžŐ

Potrzebuję wyciągnąć HEAD ze zmiennej WWW, aby wykonać obliczenia (kod odpowiedzi serwera nie wystarczy, wtedy wystarczyłoby --fail w curl), jeśli obliczenia będą pozytywne, chciałem wydrukować BODY ze zmiennej WWW. Jak mogę wyciąć wszystko od wystąpienia dwóch znaków "\n\n"?

Na ten moment działa mi to tak:

HEAD=$( echo "$WWW" | base64 --decode | head -n 6 )
BODY=$( echo "$WWW" | base64 --decode | tail -n +8 )

...ale nie zawsze będę otrzymywał 6 linijek nagłówka.


Prawie mi się udało z tym:

HEAD=$( echo "$WWW" | base64 --decode | awk '/^$/{exit} 1' )
HEAD=$( echo "$WWW" | base64 --decode | awk -v RS= 'NR==1' )

2

Odp: CURL - nagłówek i dane do różnych zmiennych oraz timeouty w uhttpd

Wyszukiwanie po znakach końca linii jest zawsze problematyczne. Jeżeli jesteś pewien że nie ma 2 końców linii w innym miejscu to coś takie zadziała:

O=$(echo "$WWW" | tr '\n' '@' | grep -baron '@@' -)
offset=$(echo $O | cut -f2 -d:)
offset=$((offset + 2))
echo "$WWW" | dd  of=/tmp/srv1 bs=$offset count=1
echo "$WWW" | dd  of=/tmp/srv2 bs=1 skip=$offset

Dokładnie tak napisane. Sprawdziłem.

Czemu nie możesz tego zrobić przez curl -D /tmp/a http://1.2.3.4/image.jpg?
Wtedy masz nagłówek osobno w pliku i możesz go osobno przeparsować.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3 (edytowany przez tinware 2020-07-08 19:22:09)

Odp: CURL - nagłówek i dane do różnych zmiennych oraz timeouty w uhttpd

Cezary napisał/a:

Czemu nie możesz tego zrobić przez curl -D /tmp/a http://1.2.3.4/image.jpg?

Zapomniałem dodać najważniejszego, że chcę to zrobić "w locie", bez zapisywania.

Czy OpenWRT jest jakaś dyrektywa pozwalająca zrobić coś takiego:

curl -D $VARIABLE http://1.2.3.4/image.jpg

4

Odp: CURL - nagłówek i dane do różnych zmiennych oraz timeouty w uhttpd

-D jest do pliku. To tylko kilka linii, więc co ci szkodzi zapisać to w tmp?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5 (edytowany przez tinware 2020-07-10 21:12:29)

Odp: CURL - nagłówek i dane do różnych zmiennych oraz timeouty w uhttpd

Rozwiązałem to, tak jak radziłeś. Mam jeszcze do Ciebie jedno pytanie dotyczące uhttpd.
Zrobiłem skrypt w JavaScript, który robi requesty http do routera.
Zapytanie odpowiada kodem 200 OK! zwykle w ciągu 2-6 sekund i odpowiada mi plikiem JSON.
Przy 2-3 użytkownikach z uruchomionym stroną routera dostaje timeouty, zapytania muszą się kolejkować.
W /etc/config/uhttpd ustawiłem dla testu:

option max_requests '15'

...ale mam wrażenie, że to mało pomaga.

Gdy jeden ze skryptów zrobiłem tak, że wywołanie requesta, dostaje 404 Not Found i uruchamiam w tle proces, który buduje mi plik JSON, zapisuje do pliku. Następne zapytanie tego URLa odczytuje w kilka milisekund ten plik, przez co strona routera się nie przywiesza przy większej ilości użytkowników, moje requesty odpowiadają natychmiastowo. Czy tak powinienem robić takie skrypty, aby zbyt długo nie odpowiadały?

Jest tak:
1. wysłanie zapytania
2. router przetwarza 2-6 sekund
3. ma gotową odpowiedź
4. wysłanie do przeglądarki

Na którym z tych elementów to wszystko się tak wykłada? Kiedy przetwarzam taki skrypt przez SSH zamiast HTTP jest ok.

Może za pierwszym wczytaniem, powinienem odpowiadać kodem 202:

202 | Accepted | Przyjęto – zapytanie zostało przyjęte do obsłużenia, lecz jego zrealizowanie jeszcze się nie skończyło

a dopiero potem odpowiedzieć 200 OK!

6

Odp: CURL - nagłówek i dane do różnych zmiennych oraz timeouty w uhttpd

Generalizując - nawet jak skrypt po stronie serwera wykonuje się "długo" to klient powinien czekać aż jego timeouty nie nastąpią. Nie ma tu jakiejś specjalnej ideologi.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

7 (edytowany przez tinware 2020-07-11 22:28:59)

Odp: CURL - nagłówek i dane do różnych zmiennych oraz timeouty w uhttpd

Jasne, ale czemu uhttpd sie tak wiesza przy tym?

Sytuacja pierwsza:
Klient wysyła zapytanie http, uruchamia się skrypt, klient dostaje po 5 sekund na odpowiedz. Ledwo działa to równocześnie na trzech otwartych kartach w przeglądarce.

Sytuacja druga:
Klient wysyła zapytanie http, uruchamia się skrypt W TLE, klient otrzymuje pusta odpowiedz po 50ms. Po 5 sekundach skrypt kończy prace, zapisuje wynik do /tmp. Klient wykonuje następne zapytanie http, otrzymuje odpowiedź po 50ms, przy okazji uruchamia kolejny raz skrypt W TLE, aby mieć jego odpowiedź 5 sekund później przy następnym zapytaniu http. Taki sposób działa równocześnie na dziesięciu otwartych kartach w przeglądarce, więcej nie testowałem.

Wygląda to na kolejkowanie zapytań serwera www, ponieważ inni klienci (karty w przeglądarce) długo czekają na odpowiedź.
Ustawiałem nawet -> option max_requests '1500'
Potem uci commit uhttpd
Oraz /etc/init.d/uhttpd restart

Zastanawiam się, czy muszę przekodować teraz wszystkie swoje skrypty, aby zasada ich działania była taka jak w "sytuacja druga", czy mogę zostać przy "sytuacja pierwsza" zmieniając jakąś konfigurację serwera. Pod Apache2 w Raspbianie nie miałem takich problemów, a tam potrafię wysyłać kilkadziesiąt requestów i czekać po 1 minutę na odpowiedź.

8

Odp: CURL - nagłówek i dane do różnych zmiennych oraz timeouty w uhttpd

Zainstaluj sobie więc apache dla testów i zobacz czy to wina serwera www czy czegoś innego.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.