[gelöst] curl header und output in getrente variablen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
derpascal
Beiträge: 25
Registriert: 13.07.2012 15:31:42

[gelöst] curl header und output in getrente variablen

Beitrag von derpascal » 09.08.2013 23:19:55

Moin,

wahrscheinlich ist es wieder viel einfacher als ich denke, aber ich hätte gerne, wenn ich mit curl eine Webseite abrufen, den Header in eine Variable und den Output in eine Variable. Zur zeit sieht mein Konstrukt wie folgt aus:

Code: Alles auswählen

OUTPUT=$(curl $URL -D header.dmp 2> /dev/null)
HEADER=$(cat header.dmp)
rm header.dmp
Nicht schön, besonders nicht performant, aber es funktioniert.

Gibt es einen Weg an den Header ran zu kommen ohne es vorher in eine Datei zu schreiben?

Danke und Gruss

Pascal
Zuletzt geändert von derpascal am 11.08.2013 14:23:45, insgesamt 1-mal geändert.

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: curl header und output in getrente variablen

Beitrag von detix » 10.08.2013 14:11:06

Code: Alles auswählen

OUTPUT=$(curl $URL 2>/dev/null)
echo $OUTPUT
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

derpascal
Beiträge: 25
Registriert: 13.07.2012 15:31:42

Re: curl header und output in getrente variablen

Beitrag von derpascal » 10.08.2013 21:59:13

Hallo Detix,

Das ist mir schon soweit klar, was du da geschrieben hast. Jedoch möchte ich auch den http-header in einer Variable haben!

Gruss

Pascal

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: curl header und output in getrente variablen

Beitrag von Cae » 10.08.2013 22:21:13

Code: Alles auswählen

$ curl -sD - example.org | head -15
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: text/html; charset=UTF-8
Date: Sat, 10 Aug 2013 20:20:43 GMT
Etag: "780602-4f6-4db31b2978ec0"
Last-Modified: Thu, 25 Apr 2013 16:13:23 GMT
Server: ECS (sjc/4FCE)
X-Cache: HIT
Content-Length: 1270

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

Waere fuer Header und Payload gleichzeitig.

Einzeln:

Code: Alles auswählen

$ data="$(curl -sD - example.org)"
$ headers="$(printf %s "$stuff" | awk '!p;/^\r$/{p=1}')"
$ body="$(printf %s "$stuff" | awk '/^\r$/{p=1}p')"
Fragt sich aber, ob ein paar Dateisystemoperationen im tmpfs effizienter sind als zwei awk-fork()s. Ach ja, die Bash fliegt bei dem Code auf die Nase, weil sie offensichtlich das Escaping falsch macht. Das ! in der zweiten Zeile wird expandiert, obwohl es in Ticks ' eingeschlossen ist.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: curl header und output in getrente variablen

Beitrag von rendegast » 11.08.2013 05:23:33

Ich finde die Lösung mit den zwei temporären Dateien gut.

Code: Alles auswählen

curl -D header example.org > example.org
da ja eigentlich nie klar ist, was alles in dem Inhalt stecken könnte.

Der header wird zu einer Datei mit DOS-Zeilenende, was oben nicht zu sehen ist.

Code: Alles auswählen

$ cat header -A
HTTP/1.1 200 OK^M$
Accept-Ranges: bytes^M$
Content-Type: text/html; charset=UTF-8^M$
...
^M$
Über sowas sind hier schon genug gestolpert, und das dann auch noch in eine Variable packen?
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

derpascal
Beiträge: 25
Registriert: 13.07.2012 15:31:42

Re: curl header und output in getrente variablen

Beitrag von derpascal » 11.08.2013 14:16:48

rendegast hat geschrieben:Ich finde die Lösung mit den zwei temporären Dateien gut.
also die Files einfach in ein tmpfs schreiben und gut ist?
rendegast hat geschrieben:Der header wird zu einer Datei mit DOS-Zeilenende, was oben nicht zu sehen ist.
Jup, danke für den Hinweiß, nur da bin ich vor meinem Thread schon drüber gestolpert. Hat mich bestimmt ne ganze Stunden gekostet den Fehler zu erkennen. Die Lösung, war dann zum glück schnell gefunden.

Code: Alles auswählen

cat $tmpdir/header | dos2unix | whatever
:THX: Danke für eure hilfe. Falls kein Gegenvorschlag kommt als die zwei Ausgaben in Datein in einem tmpfs zu schreiben, werde ich das wohl Montag mal umsetzen.

Gruss

derPascal

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: curl header und output in getrente variablen

Beitrag von linuxCowboy » 11.08.2013 20:47:14

Cae hat geschrieben:

Code: Alles auswählen

$ headers="$(printf %s "$data" | awk '!p;/^\r$/{p=1}')"
die Bash fliegt bei dem Code auf die Nase, weil sie offensichtlich das Escaping falsch macht. Das ! in der zweiten Zeile wird expandiert, obwohl es in Ticks ' eingeschlossen ist.
Ein '! p' oder set +o histexpand und sie steht wieder auf... :wink:
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: [gelöst] curl header und output in getrente variablen

Beitrag von r900 » 12.08.2013 00:22:32

linuxCowboy hat geschrieben:
Cae hat geschrieben:

Code: Alles auswählen

$ headers="$(printf %s "$data" | awk '!p;/^\r$/{p=1}')"
die Bash fliegt bei dem Code auf die Nase, weil sie offensichtlich das Escaping falsch macht. Das ! in der zweiten Zeile wird expandiert, obwohl es in Ticks ' eingeschlossen ist.
Ein '! p' oder set +o histexpand und sie steht wieder auf... :wink:
Das kommt davon wenn man unnötige quotes setzt.. :) So geht es nämlich:

Code: Alles auswählen

headers=$(printf %s "$data" | awk '!p;/^\r$/{p=1}')

Antworten