# Seltsames Verhalten bei GET Request



## Robokopp (23. Nov 2012)

Ich habe einen Server programmiert, der GET Requests verarbeitet.

Wenn ich nun einen solchen Request sende, passiert folgendes:

1.Der GET Request wird so verarbeitet, wie er soll

2. Es wird ein POST Request empfangen:
         POST /mobiquo/mobiquo.php HTTP/1.1

3.Es wird per GET Request das favicon angefordert:
         GET /favicon.ico HTTP/1.1

Das alles geschieht in 3 verschiedenen Connects, was ich eigentlich nur ungerne möchte, aus zweierlei Gründen: Erstens möchte ich den Server nicht unnötig auslasten, und zweitens springt bei der kurzen Zeitspanne mein implementierter DoS Filter an (hab das schon mehr oder weniger hinbekommen, dass er darüber hinwegsieht aber das ist keine Dauerlösung)

Kann man das unterbinden?

Was soll/bewirkt der Postrequest?

Liegt das nur am Browser oder ist es generell so?

MfG


----------



## nillehammer (23. Nov 2012)

> Das alles geschieht in 3 verschiedenen Connects,


Das ist das Standardverhalten bei HTTP. Für jeden Request wird eine Connection geöffnet und nach dem Response wieder geschlossen. Du kannst das abmildern, indem Du den Server um das Feature "keep-alive" erweiterst (HTTP persistent connection - Wikipedia, the free encyclopedia).


> Was soll/bewirkt der Postrequest?


Das müsstest Du als Autor der Anwendung doch selbst wissen. Ein Webclient mach von sich aus nichts. Ohne weitere Details zu kennen könnte es entweder der POST eines (evtl. versteckten) Formular sein oder Du verwendest AJAX-Technologien?


----------



## Robokopp (23. Nov 2012)

nillehammer hat gesagt.:


> Das ist das Standardverhalten bei HTTP. Für jeden Request wird eine Connection geöffnet und nach dem Response wieder geschlossen. Du kannst das abmildern, indem Du den Server um das Feature "keep-alive" erweiterst (HTTP persistent connection - Wikipedia, the free encyclopedia).



Das ist mir klar, aber mir ist nicht klar warum es überhaupt 3 Connections gibt wenn ich doch nur eine schicke.




> Das müsstest Du als Autor der Anwendung doch selbst wissen. Ein Webclient mach von sich aus nichts. Ohne weitere Details zu kennen könnte es entweder der POST eines (evtl. versteckten) Formular sein oder Du verwendest AJAX-Technologien?



Weder noch. es ist ein simples HTTP Request alla localhost/search?param1=inhalt+param2=inhalt+param3=inhalt
kein Formular, kein AJAX, sondern einfach nur ein link den ich in der Adressleiste eingebe, und daraus resultieren 3 Connects, wie schon genannt.


----------



## nillehammer (23. Nov 2012)

Wenn der Client ein Browser ist, erklärt sich das hier

```
3.Es wird per GET Request das favicon angefordert:
GET /favicon.ico HTTP/1.1
```
Das machen die Browser von sich aus, um in Tabs eine nette kleine Grafik anzuzeigen. Darauf hast Du als Serverbetreiber keinen Einfluss und musst damit leben.


```
localhost/search?param1=inhalt+param2=inhalt+param3=inhalt
```
Was ist denn Dein Response auf die Abfrage? Eine HTML-Seite? Evtl. mit JavaScript eingebunden?


----------



## Robokopp (23. Nov 2012)

nillehammer hat gesagt.:


> Wenn der Client ein Browser ist, erklärt sich das hier
> 
> ```
> 3.Es wird per GET Request das favicon angefordert:
> ...





Danke erstmal für die Erklärung, das macht Sinn. Da die URL später eh nur als API für ein Programm dienen wird, kann ich das schon mal vernachlässigen. 


Ich habe eine Art Defaultseite, die aufgerufen wird falls keine Parameter angegeben werden. Die ist vollständig in html geschrieben.
Dann hab ich die Antworten auf die Anfragen. Dort setze ich den Content-Type auf text/plain, folglich kein html, sondern ganz normaler Text der da ausgegeben wird.

Also keinerlei Javascript, kein AJAX oder sonstiges.

Ich hab jetzt mal testweise einen Clienten geschrieben, der sich mit dem Server verbindet.Nun ist es wirklich auch immer nur genau ein Request.

Naja trotzdem danke


----------



## trääät (24. Nov 2012)

was ist denn das von dir erwartete verhalten ?

wenn der client ein browser ist hat dieser nun mal oben eine URL die er laden soll ... das tut er auch ... aber damit das auch funktioniert wird nicht nur der HTML-code der seite selbst geladen ... sondern auch alle damit verknüpften daten wie im header verlinkte CSS- oder JS-files ... alle eigebunden img- und andere inline daten ... und und und ...

wenn die seite also aus mehr als eben nur diesem einem wirklich statischem html-file besteht ... dann muss dieser inhalt auch irgendwo her kommen ... und das macht ein browser eben dadurch das er für jede resource eine neue anfrage stellt ...

es gibt zwar wie erwähnt HTTP-keep-alive ... was auch von den meisten browsern unterstützt wird ... aber die implementierung auf server seite dürfte etwas aufwändiger sein ...


----------



## Robokopp (25. Nov 2012)

Ja aber es ist eben nichts weiter als eine statische html-Seite,deswegen hat es mich eben gewundert.

Das von mir erwartete Verhalten wäre gewesen, dass eben nur der eine GET-Request ankommt, den ich auch abgeschickt habe und nicht noch irgendwelche anderen.
Ich muss zugeben, dass ich mich mit HTML nicht auskenne.Deswegen bin ich wahrscheinlich auch davon ausgegangen, dass beispielsweise das Favicon einfach in dieser Datei definiert wird und nicht einfach über einen anderen Request angefordert wird.

Anscheinend kommt dieser Post-Request auch nicht immer, hatte den schon lange nicht mehr, warum auch immer!?


Wie dem auch sei, wenn ich die Requests per eigenem Skript schicke, verhält es sich genau so wie ich es erwartet hatte.

Da die Abfragen später eh nicht über den Browser stattfinden werden, kann mir der Effekt den ich hier angesprochen habe ja sowieso egal sein. Alles was per Post kommt, oder nach einem Favicon fragt, oder im allgemeinen nicht der gewünschten Form des Requests entspricht, kann ich filtern und dann einfach ignorieren.


----------



## trääät (25. Nov 2012)

naja ... der unterschied zwischen nem browser und deinem script ist halt das der browser halt nun mal weis was er alles automatisch im hintergrund eben zusätzlich machen muss ... was du halt so nicht in deinem script stehen hast und daher halt auch nicht machst ... und wenn du halt nur einen request sendet kommt natürlich auch nur einer beim server an ... der browser sendet halt mehrere requests weil er halt auch mehrere daten haben will ...

btw : der POST-request kann auch von irgendnem browser-addon kommen wenn halt nichts weiter in der HTML steht ... müsste man mal analysieren


----------

