2016-05-24 11 views
1

Ich möchte eine mehrteilige Bytebereichsantwort erzeugen. Gibt es eine Möglichkeit für mich, dies zu tun, ohne jedes Segment zu scannen, das ich gerade aussende, da ich mehrteilige Begrenzungszeichenfolgen erzeugen muss?Erzeugen einer mehrteiligen/Bytebereich-Antwort, ohne die Teile vor dem Senden zu scannen

Zum Beispiel kann ich einen Benutzer anfordern eine Bytebereich, die ich 2 GB Daten holen und scannen würde, was in meinem Fall beinhaltet, dass ich diese Daten in meine (langsame) VM als Strings usw. laden. Idealerweise möchte ich in der Antwort einfach angeben, dass ein Teil eine Länge einer bestimmten Anzahl von Bytes hat, und damit erledigt werden. Gibt es irgendwelche Werkzeuge, die mir diese Option bieten könnten? Ich sehe, dass viele Entwickler nur eine UUID als Grenze nehmen und wahrscheinlich eine winzige Wahrscheinlichkeit riskieren, dass sie irgendwo innerhalb des Teils erscheint, aber dieses Risiko scheint klein genug zu sein, dass mehrere Leute es nehmen?

Um genauer zu erklären: Scannen der Teile im Voraus (vor dem Erzeugen der Antwort) ist in meinem Fall nicht wirklich machbar, da ich sie über HTTP von einem Upstream-Service abrufen muss. Dies bedeutet, dass ich das gesamte Teil im Voraus abrufen muss, um eine nicht übereinstimmende mehrteilige Grenze zu berechnen, und erst dann kann ich diesen Teil in die Antwort splitten.

Antwort

1

Angenommen, die Daten können beliebig sein, ich sehe nicht, wie Sie die Abwesenheit von Kollisionen garantieren können, ohne die Daten zu scannen.

Wenn das Format der Daten sehr begrenzt ist (wie ... Base 64 codiert?), Können Sie möglicherweise eine Grenze auswählen, die bekanntermaßen eine unzulässige Bytefolge in diesem Format ist.

Selbst wenn Ihre Grenze tut mit den Daten kollidieren, muss sie durch Header folgen wie Content-Range, was noch unwahrscheinlicher ist, so ist der Kunde wahrscheinlich als Fehler zu behandeln, anstatt die falschen Daten zu verbrauchen.

Große Webserver verwenden sehr einfache Strategien. Apache grabs 8 random bytes beim Start und rendert sie in Hexadezimal. Nginx verwendet a sequential counter links aufgefüllt mit Nullen.

UUIDs wurden entwickelt, um Kollisionen mit anderen UUIDs zu vermeiden, nicht mit beliebigen Daten. Eine UUID ist nicht wahrscheinlicher eine gute Grenze als eine vollständig zufällige Zeichenfolge derselben Länge. Darüber hinaus enthalten einige UUID-Varianten Informationen, die Sie möglicherweise nicht offenlegen möchten, z. B. die MAC-Adresse Ihres Geräts.

Idealerweise möchte ich einfach in der Antwort angeben, dass ein Teil eine Länge von einer bestimmten Anzahl von Bytes hat, und damit erledigt werden. Gibt es irgendwelche Werkzeuge, die mir diese Option bieten könnten?

Vielleicht können Sie vermeiden, mehrere Bereiche zu unterstützen, und den Clients einfach mitteilen, dass sie jeden Bereich einzeln anfordern sollen. In diesem Fall verwenden Sie nicht das Multipart-Format, so dass es kein Problem gibt.

Wenn Sie mehrere Bereiche in einer Antwort senden möchten, erfordert RFC 7233 das Multipart-Format, für das die Begrenzungszeichenfolge erforderlich ist.

Sie können, natürlich, erfinden Sie Ihren eigenen Mechanismus statt, dass der RFC 7233. In diesem Fall:

  • Sie nicht 206 (Partial Content) verwenden können. Sie müssen 200 (OK) oder einen anderen gültigen Statuscode verwenden.
  • Sie können den Medientyp nicht verwenden.Sie müssen Ihren eigenen Medientyp erstellen.
  • Sie können den Anforderungskopf Range nicht verwenden.
  • Da eine 200 (OK) Antwort auf eine Anfrage GET supposed to carry a (full) representation of the resource ist, können Sie eine der folgenden tun muss:
    • kodieren die gewünschten Bereiche in der URL; oder
    • verwenden Sie etwas wie POST anstelle von GET; oder
    • verwenden Sie einen benutzerdefinierten, nicht standardmäßigen Statuscode statt 200 (OK); oder
    • (nicht sicher, ob dies eine korrekte Vorgehensweise ist) Medientyp-Parameter verwenden, senden Sie sie in Accept, und Accept zu Vary hinzufügen.

Die chunked transfer coding nützlich sein können, aber man kann auf sie allein nicht verlassen, weil es eine Eigenschaft der Verbindung ist, nicht von der Nutzlast.

+0

Derzeit reagiere ich mit einem 416, wenn der Client mehrere Bereiche anfordert, aber ich bin mir nicht sicher, dass es die richtige Antwort ist. Eine weitere SO-Frage ist in Ordnung, so scheint es :-P – Julik