1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
| ///////////////////////////////////////////////////////////////////////////
// //
// Copyright (c) 2015 by Charta Software B.V. //
// All rights reserved //
// //
// Version: 1.7.0.83525 //
// Web site: https://pascal.chartasoftware.com/ //
// //
// This code and information are provided "as is" without warranty of //
// any kind. Dissemination of this information or reproduction of //
// this material is strictly forbidden unless prior written permission //
// is obtained from Charta Software B.V.. //
// //
///////////////////////////////////////////////////////////////////////////
unit Http.Exchange;
interface
uses
Http.Request,
Http.Response,
Object_.ReferenceCounted,
Stream.Output;
type
THttpExchange = class(TReferenceCountedObject)
private
FRequest: THttpRequest;
FResponse: THttpResponse;
procedure SetRequest(const Value: THttpRequest);
procedure SetResponse(const Value: THttpResponse);
public
destructor Destroy(); override;
procedure Write(Stream: TOutputStream);
published
property Request: THttpRequest read FRequest write SetRequest;
property Response: THttpResponse read FResponse write SetResponse;
end;
implementation
uses
Compression.GZip.Stream.Output,
Internet.MediaType.Application,
Internet.MediaType.Text,
Memory.Block.Physical;
{ THttpExchange }
procedure THttpExchange.Write(Stream: TOutputStream);
var
CompressedContent: TPhysicalMemoryBlock;
CompressedStream: TOutputStream;
begin
// TODO: The following check for 'gzip,' is very basic and should be improved. However, it seems to work for most browsers
if
Request.AcceptEncoding.StartsWith('gzip,')
and ((Response.Entity.ContentType is TMediaTypeText) or (Response.Entity.ContentType is TMediaTypeApplicationXml))
and (Response.Entity.ContentEncoding = '')
then
begin
Response.GenerateContent();
CompressedContent := TPhysicalMemoryBlock.Create();
CompressedStream := TGZipOutputStream.Create(CompressedContent.CreateAppendStream());
Response.Entity.Content.Write(CompressedStream);
CompressedStream.Flush();
CompressedStream.Free();
Response.Entity.Content := CompressedContent;
Response.Entity.ContentEncoding := 'gzip';
Response.ContentLength := CompressedContent.Size;
end;
Response.Write(Stream);
end;
destructor THttpExchange.Destroy();
begin
Request.ReleaseReference();
Response.ReleaseReference();
inherited Destroy();
end;
procedure THttpExchange.SetRequest(const Value: THttpRequest);
begin
if Value <> Request then
begin
Value.AddReference();
Request.ReleaseReference();
FRequest := Value;
end;
end;
procedure THttpExchange.SetResponse(const Value: THttpResponse);
begin
if Value <> Response then
begin
Value.AddReference();
Response.ReleaseReference();
FResponse := Value;
end;
end;
end.
|