Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
U
unique-xids
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
uplex-varnish
unique-xids
Commits
9b65ebca
Commit
9b65ebca
authored
Feb 15, 2012
by
Poul-Henning Kamp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Push worker->busyobj shift up through VFP's.
parent
40761260
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
118 additions
and
139 deletions
+118
-139
cache.h
bin/varnishd/cache/cache.h
+3
-3
cache_esi_fetch.c
bin/varnishd/cache/cache_esi_fetch.c
+10
-19
cache_fetch.c
bin/varnishd/cache/cache_fetch.c
+38
-38
cache_gzip.c
bin/varnishd/cache/cache_gzip.c
+67
-79
No files found.
bin/varnishd/cache/cache.h
View file @
9b65ebca
...
...
@@ -219,9 +219,9 @@ struct dstat {
/* Fetch processors --------------------------------------------------*/
typedef
void
vfp_begin_f
(
struct
worker
*
,
size_t
);
typedef
int
vfp_bytes_f
(
struct
worker
*
,
struct
http_conn
*
,
ssize_t
);
typedef
int
vfp_end_f
(
struct
worker
*
);
typedef
void
vfp_begin_f
(
struct
busyobj
*
,
size_t
);
typedef
int
vfp_bytes_f
(
struct
busyobj
*
,
struct
http_conn
*
,
ssize_t
);
typedef
int
vfp_end_f
(
struct
busyobj
*
);
struct
vfp
{
vfp_begin_f
*
begin
;
...
...
bin/varnishd/cache/cache_esi_fetch.c
View file @
9b65ebca
...
...
@@ -292,15 +292,12 @@ vfp_esi_bytes_gg(const struct busyobj *bo, struct vef_priv *vef,
/*---------------------------------------------------------------------*/
static
void
__match_proto__
()
vfp_esi_begin
(
struct
worker
*
wrk
,
size_t
estimate
)
static
void
__match_proto__
(
vfp_begin_f
)
vfp_esi_begin
(
struct
busyobj
*
bo
,
size_t
estimate
)
{
struct
busyobj
*
bo
;
struct
vef_priv
*
vef
;
(
void
)
estimate
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
bo
=
wrk
->
busyobj
;
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
ALLOC_OBJ
(
vef
,
VEF_MAGIC
);
...
...
@@ -310,16 +307,16 @@ vfp_esi_begin(struct worker *wrk, size_t estimate)
AZ
(
bo
->
vgz_rx
);
if
(
bo
->
is_gzip
&&
bo
->
do_gunzip
)
{
bo
->
vgz_rx
=
VGZ_NewUngzip
(
wrk
->
vsl
,
"U F E"
);
bo
->
vgz_rx
=
VGZ_NewUngzip
(
bo
->
vsl
,
"U F E"
);
VEP_Init
(
bo
,
NULL
);
vef
->
ibuf_sz
=
cache_param
->
gzip_buffer
;
}
else
if
(
bo
->
is_gunzip
&&
bo
->
do_gzip
)
{
vef
->
vgz
=
VGZ_NewGzip
(
wrk
->
vsl
,
"G F E"
);
vef
->
vgz
=
VGZ_NewGzip
(
bo
->
vsl
,
"G F E"
);
VEP_Init
(
bo
,
vfp_vep_callback
);
vef
->
ibuf_sz
=
cache_param
->
gzip_buffer
;
}
else
if
(
bo
->
is_gzip
)
{
bo
->
vgz_rx
=
VGZ_NewUngzip
(
wrk
->
vsl
,
"U F E"
);
vef
->
vgz
=
VGZ_NewGzip
(
wrk
->
vsl
,
"G F E"
);
bo
->
vgz_rx
=
VGZ_NewUngzip
(
bo
->
vsl
,
"U F E"
);
vef
->
vgz
=
VGZ_NewGzip
(
bo
->
vsl
,
"G F E"
);
VEP_Init
(
bo
,
vfp_vep_callback
);
vef
->
ibuf_sz
=
cache_param
->
gzip_buffer
;
vef
->
ibuf2_sz
=
cache_param
->
gzip_buffer
;
...
...
@@ -339,15 +336,12 @@ vfp_esi_begin(struct worker *wrk, size_t estimate)
AN
(
bo
->
vep
);
}
static
int
__match_proto__
()
vfp_esi_bytes
(
struct
worker
*
wrk
,
struct
http_conn
*
htc
,
ssize_t
bytes
)
static
int
__match_proto__
(
vfp_bytes_f
)
vfp_esi_bytes
(
struct
busyobj
*
bo
,
struct
http_conn
*
htc
,
ssize_t
bytes
)
{
struct
busyobj
*
bo
;
struct
vef_priv
*
vef
;
int
i
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
bo
=
wrk
->
busyobj
;
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
vef
=
bo
->
vef_priv
;
CHECK_OBJ_NOTNULL
(
vef
,
VEF_MAGIC
);
...
...
@@ -367,17 +361,14 @@ vfp_esi_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
return
(
i
);
}
static
int
__match_proto__
()
vfp_esi_end
(
struct
worker
*
wrk
)
static
int
__match_proto__
(
vfp_end_f
)
vfp_esi_end
(
struct
busyobj
*
bo
)
{
struct
vsb
*
vsb
;
struct
vef_priv
*
vef
;
struct
busyobj
*
bo
;
ssize_t
l
;
int
retval
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
bo
=
wrk
->
busyobj
;
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
AN
(
bo
->
vep
);
...
...
bin/varnishd/cache/cache_fetch.c
View file @
9b65ebca
...
...
@@ -87,12 +87,12 @@ FetchError(struct busyobj *bo, const char *error)
* 'estimate' is the estimate of the number of bytes we expect to receive,
* as seen on the socket, or zero if unknown.
*/
static
void
__match_proto__
()
vfp_nop_begin
(
struct
worker
*
wrk
,
size_t
estimate
)
static
void
__match_proto__
(
vfp_begin_f
)
vfp_nop_begin
(
struct
busyobj
*
bo
,
size_t
estimate
)
{
if
(
estimate
>
0
)
(
void
)
FetchStorage
(
wrk
->
busyobj
,
estimate
);
(
void
)
FetchStorage
(
bo
,
estimate
);
}
/*--------------------------------------------------------------------
...
...
@@ -106,15 +106,15 @@ vfp_nop_begin(struct worker *wrk, size_t estimate)
* Return 1 when 'bytes' have been processed.
*/
static
int
__match_proto__
()
vfp_nop_bytes
(
struct
worker
*
wrk
,
struct
http_conn
*
htc
,
ssize_t
bytes
)
static
int
__match_proto__
(
vfp_bytes_f
)
vfp_nop_bytes
(
struct
busyobj
*
bo
,
struct
http_conn
*
htc
,
ssize_t
bytes
)
{
ssize_t
l
,
wl
;
struct
storage
*
st
;
AZ
(
wrk
->
busyobj
->
fetch_failed
);
AZ
(
bo
->
fetch_failed
);
while
(
bytes
>
0
)
{
st
=
FetchStorage
(
wrk
->
busyobj
,
0
);
st
=
FetchStorage
(
bo
,
0
);
if
(
st
==
NULL
)
return
(
-
1
);
l
=
st
->
space
-
st
->
len
;
...
...
@@ -124,7 +124,7 @@ vfp_nop_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
if
(
wl
<=
0
)
return
(
wl
);
st
->
len
+=
wl
;
wrk
->
busyobj
->
fetch_obj
->
len
+=
wl
;
bo
->
fetch_obj
->
len
+=
wl
;
bytes
-=
wl
;
}
return
(
1
);
...
...
@@ -139,17 +139,17 @@ vfp_nop_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
* Return 0 for OK
*/
static
int
__match_proto__
()
vfp_nop_end
(
struct
worker
*
wrk
)
static
int
__match_proto__
(
vfp_end_f
)
vfp_nop_end
(
struct
busyobj
*
bo
)
{
struct
storage
*
st
;
st
=
VTAILQ_LAST
(
&
wrk
->
busyobj
->
fetch_obj
->
store
,
storagehead
);
st
=
VTAILQ_LAST
(
&
bo
->
fetch_obj
->
store
,
storagehead
);
if
(
st
==
NULL
)
return
(
0
);
if
(
st
->
len
==
0
)
{
VTAILQ_REMOVE
(
&
wrk
->
busyobj
->
fetch_obj
->
store
,
st
,
list
);
VTAILQ_REMOVE
(
&
bo
->
fetch_obj
->
store
,
st
,
list
);
STV_free
(
st
);
return
(
0
);
}
...
...
@@ -224,20 +224,20 @@ fetch_number(const char *nbr, int radix)
/*--------------------------------------------------------------------*/
static
int
fetch_straight
(
struct
worker
*
wrk
,
struct
http_conn
*
htc
,
ssize_t
cl
)
fetch_straight
(
struct
busyobj
*
bo
,
struct
http_conn
*
htc
,
ssize_t
cl
)
{
int
i
;
assert
(
wrk
->
busyobj
->
body_status
==
BS_LENGTH
);
assert
(
bo
->
body_status
==
BS_LENGTH
);
if
(
cl
<
0
)
{
return
(
FetchError
(
wrk
->
busyobj
,
"straight length field bogus"
));
return
(
FetchError
(
bo
,
"straight length field bogus"
));
}
else
if
(
cl
==
0
)
return
(
0
);
i
=
wrk
->
busyobj
->
vfp
->
bytes
(
wrk
,
htc
,
cl
);
i
=
bo
->
vfp
->
bytes
(
bo
,
htc
,
cl
);
if
(
i
<=
0
)
return
(
FetchError
(
wrk
->
busyobj
,
"straight insufficient bytes"
));
return
(
FetchError
(
bo
,
"straight insufficient bytes"
));
return
(
0
);
}
...
...
@@ -248,14 +248,14 @@ fetch_straight(struct worker *wrk, struct http_conn *htc, ssize_t cl)
*/
static
int
fetch_chunked
(
struct
worker
*
wrk
,
struct
http_conn
*
htc
)
fetch_chunked
(
struct
busyobj
*
bo
,
struct
http_conn
*
htc
)
{
int
i
;
char
buf
[
20
];
/* XXX: 20 is arbitrary */
unsigned
u
;
ssize_t
cl
;
assert
(
wrk
->
busyobj
->
body_status
==
BS_CHUNKED
);
assert
(
bo
->
body_status
==
BS_CHUNKED
);
do
{
/* Skip leading whitespace */
do
{
...
...
@@ -264,7 +264,7 @@ fetch_chunked(struct worker *wrk, struct http_conn *htc)
}
while
(
vct_islws
(
buf
[
0
]));
if
(
!
vct_ishex
(
buf
[
0
]))
return
(
FetchError
(
wrk
->
busyobj
,
"chunked header non-hex"
));
return
(
FetchError
(
bo
,
"chunked header non-hex"
));
/* Collect hex digits, skipping leading zeros */
for
(
u
=
1
;
u
<
sizeof
buf
;
u
++
)
{
...
...
@@ -277,7 +277,7 @@ fetch_chunked(struct worker *wrk, struct http_conn *htc)
}
if
(
u
>=
sizeof
buf
)
return
(
FetchError
(
wrk
->
busyobj
,
"chunked header too long"
));
return
(
FetchError
(
bo
,
"chunked header too long"
));
/* Skip trailing white space */
while
(
vct_islws
(
buf
[
u
])
&&
buf
[
u
]
!=
'\n'
)
...
...
@@ -285,14 +285,14 @@ fetch_chunked(struct worker *wrk, struct http_conn *htc)
return
(
-
1
);
if
(
buf
[
u
]
!=
'\n'
)
return
(
FetchError
(
wrk
->
busyobj
,
"chunked header no NL"
));
return
(
FetchError
(
bo
,
"chunked header no NL"
));
buf
[
u
]
=
'\0'
;
cl
=
fetch_number
(
buf
,
16
);
if
(
cl
<
0
)
return
(
FetchError
(
wrk
->
busyobj
,
"chunked header number syntax"
));
return
(
FetchError
(
bo
,
"chunked header number syntax"
));
if
(
cl
>
0
&&
wrk
->
busyobj
->
vfp
->
bytes
(
wrk
,
htc
,
cl
)
<=
0
)
if
(
cl
>
0
&&
bo
->
vfp
->
bytes
(
bo
,
htc
,
cl
)
<=
0
)
return
(
-
1
);
i
=
HTC_Read
(
htc
,
buf
,
1
);
...
...
@@ -301,7 +301,7 @@ fetch_chunked(struct worker *wrk, struct http_conn *htc)
if
(
buf
[
0
]
==
'\r'
&&
HTC_Read
(
htc
,
buf
,
1
)
<=
0
)
return
(
-
1
);
if
(
buf
[
0
]
!=
'\n'
)
return
(
FetchError
(
wrk
->
busyobj
,
"chunked tail no NL"
));
return
(
FetchError
(
bo
,
"chunked tail no NL"
));
}
while
(
cl
>
0
);
return
(
0
);
}
...
...
@@ -309,12 +309,12 @@ fetch_chunked(struct worker *wrk, struct http_conn *htc)
/*--------------------------------------------------------------------*/
static
int
fetch_eof
(
struct
worker
*
wrk
,
struct
http_conn
*
htc
)
fetch_eof
(
struct
busyobj
*
bo
,
struct
http_conn
*
htc
)
{
int
i
;
assert
(
wrk
->
busyobj
->
body_status
==
BS_EOF
);
i
=
wrk
->
busyobj
->
vfp
->
bytes
(
wrk
,
htc
,
SSIZE_MAX
);
assert
(
bo
->
body_status
==
BS_EOF
);
i
=
bo
->
vfp
->
bytes
(
bo
,
htc
,
SSIZE_MAX
);
if
(
i
<
0
)
return
(
-
1
);
return
(
0
);
...
...
@@ -540,24 +540,24 @@ FetchBody(struct worker *wrk, struct object *obj)
break
;
case
BS_LENGTH
:
cl
=
fetch_number
(
bo
->
h_content_length
,
10
);
bo
->
vfp
->
begin
(
wrk
,
cl
>
0
?
cl
:
0
);
cls
=
fetch_straight
(
wrk
,
htc
,
cl
);
bo
->
vfp
->
begin
(
bo
,
cl
>
0
?
cl
:
0
);
cls
=
fetch_straight
(
bo
,
htc
,
cl
);
mklen
=
1
;
if
(
bo
->
vfp
->
end
(
wrk
))
if
(
bo
->
vfp
->
end
(
bo
))
cls
=
-
1
;
break
;
case
BS_CHUNKED
:
bo
->
vfp
->
begin
(
wrk
,
cl
);
cls
=
fetch_chunked
(
wrk
,
htc
);
bo
->
vfp
->
begin
(
bo
,
cl
);
cls
=
fetch_chunked
(
bo
,
htc
);
mklen
=
1
;
if
(
bo
->
vfp
->
end
(
wrk
))
if
(
bo
->
vfp
->
end
(
bo
))
cls
=
-
1
;
break
;
case
BS_EOF
:
bo
->
vfp
->
begin
(
wrk
,
cl
);
cls
=
fetch_eof
(
wrk
,
htc
);
bo
->
vfp
->
begin
(
bo
,
cl
);
cls
=
fetch_eof
(
bo
,
htc
);
mklen
=
1
;
if
(
bo
->
vfp
->
end
(
wrk
))
if
(
bo
->
vfp
->
end
(
bo
))
cls
=
-
1
;
break
;
case
BS_ERROR
:
...
...
@@ -576,7 +576,7 @@ FetchBody(struct worker *wrk, struct object *obj)
* sitting on wrk->storage, we will always call vfp_nop_end()
* to get it trimmed or thrown out if empty.
*/
AZ
(
vfp_nop_end
(
wrk
));
AZ
(
vfp_nop_end
(
bo
));
bo
->
fetch_obj
=
NULL
;
...
...
bin/varnishd/cache/cache_gzip.c
View file @
9b65ebca
...
...
@@ -428,19 +428,18 @@ VGZ_Destroy(struct vgz **vgp)
* A VFP for gunzip'ing an object as we receive it from the backend
*/
static
void
__match_proto__
()
vfp_gunzip_begin
(
struct
worker
*
wrk
,
size_t
estimate
)
static
void
__match_proto__
(
vfp_begin_f
)
vfp_gunzip_begin
(
struct
busyobj
*
bo
,
size_t
estimate
)
{
(
void
)
estimate
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
busyobj
,
BUSYOBJ_MAGIC
);
AZ
(
wrk
->
busyobj
->
vgz_rx
);
wrk
->
busyobj
->
vgz_rx
=
VGZ_NewUngzip
(
wrk
->
vsl
,
"U F -"
);
XXXAZ
(
vgz_getmbuf
(
wrk
->
busyobj
->
vgz_rx
));
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
AZ
(
bo
->
vgz_rx
);
bo
->
vgz_rx
=
VGZ_NewUngzip
(
bo
->
vsl
,
"U F -"
);
XXXAZ
(
vgz_getmbuf
(
bo
->
vgz_rx
));
}
static
int
__match_proto__
()
vfp_gunzip_bytes
(
struct
worker
*
wrk
,
struct
http_conn
*
htc
,
ssize_t
bytes
)
static
int
__match_proto__
(
vfp_bytes_f
)
vfp_gunzip_bytes
(
struct
busyobj
*
bo
,
struct
http_conn
*
htc
,
ssize_t
bytes
)
{
struct
vgz
*
vg
;
ssize_t
l
,
wl
;
...
...
@@ -448,10 +447,9 @@ vfp_gunzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
size_t
dl
;
const
void
*
dp
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
busyobj
,
BUSYOBJ_MAGIC
);
AZ
(
wrk
->
busyobj
->
fetch_failed
);
vg
=
wrk
->
busyobj
->
vgz_rx
;
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
AZ
(
bo
->
fetch_failed
);
vg
=
bo
->
vgz_rx
;
CHECK_OBJ_NOTNULL
(
vg
,
VGZ_MAGIC
);
AZ
(
vg
->
vz
.
avail_in
);
while
(
bytes
>
0
||
vg
->
vz
.
avail_in
>
0
)
{
...
...
@@ -466,34 +464,32 @@ vfp_gunzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
bytes
-=
wl
;
}
if
(
VGZ_ObufStorage
(
wrk
->
busyobj
,
vg
))
if
(
VGZ_ObufStorage
(
bo
,
vg
))
return
(
-
1
);
i
=
VGZ_Gunzip
(
vg
,
&
dp
,
&
dl
);
if
(
i
!=
VGZ_OK
&&
i
!=
VGZ_END
)
return
(
FetchError
(
wrk
->
busyobj
,
"Gunzip data error"
));
wrk
->
busyobj
->
fetch_obj
->
len
+=
dl
;
return
(
FetchError
(
bo
,
"Gunzip data error"
));
bo
->
fetch_obj
->
len
+=
dl
;
}
assert
(
i
==
Z_OK
||
i
==
Z_STREAM_END
);
return
(
1
);
}
static
int
__match_proto__
()
vfp_gunzip_end
(
struct
worker
*
wrk
)
static
int
__match_proto__
(
vfp_end_f
)
vfp_gunzip_end
(
struct
busyobj
*
bo
)
{
struct
vgz
*
vg
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
busyobj
,
BUSYOBJ_MAGIC
);
vg
=
wrk
->
busyobj
->
vgz_rx
;
wrk
->
busyobj
->
vgz_rx
=
NULL
;
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
vg
=
bo
->
vgz_rx
;
bo
->
vgz_rx
=
NULL
;
CHECK_OBJ_NOTNULL
(
vg
,
VGZ_MAGIC
);
if
(
wrk
->
busyobj
->
fetch_failed
)
{
if
(
bo
->
fetch_failed
)
{
(
void
)
VGZ_Destroy
(
&
vg
);
return
(
0
);
}
if
(
VGZ_Destroy
(
&
vg
)
!=
VGZ_END
)
return
(
FetchError
(
wrk
->
busyobj
,
"Gunzip error at the very end"
));
return
(
FetchError
(
bo
,
"Gunzip error at the very end"
));
return
(
0
);
}
...
...
@@ -509,20 +505,19 @@ struct vfp vfp_gunzip = {
* A VFP for gzip'ing an object as we receive it from the backend
*/
static
void
__match_proto__
()
vfp_gzip_begin
(
struct
worker
*
wrk
,
size_t
estimate
)
static
void
__match_proto__
(
vfp_begin_f
)
vfp_gzip_begin
(
struct
busyobj
*
bo
,
size_t
estimate
)
{
(
void
)
estimate
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
busyobj
,
BUSYOBJ_MAGIC
);
AZ
(
wrk
->
busyobj
->
vgz_rx
);
wrk
->
busyobj
->
vgz_rx
=
VGZ_NewGzip
(
wrk
->
vsl
,
"G F -"
);
XXXAZ
(
vgz_getmbuf
(
wrk
->
busyobj
->
vgz_rx
));
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
AZ
(
bo
->
vgz_rx
);
bo
->
vgz_rx
=
VGZ_NewGzip
(
bo
->
vsl
,
"G F -"
);
XXXAZ
(
vgz_getmbuf
(
bo
->
vgz_rx
));
}
static
int
__match_proto__
()
vfp_gzip_bytes
(
struct
worker
*
wrk
,
struct
http_conn
*
htc
,
ssize_t
bytes
)
static
int
__match_proto__
(
vfp_bytes_f
)
vfp_gzip_bytes
(
struct
busyobj
*
bo
,
struct
http_conn
*
htc
,
ssize_t
bytes
)
{
struct
vgz
*
vg
;
ssize_t
l
,
wl
;
...
...
@@ -530,10 +525,9 @@ vfp_gzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
size_t
dl
;
const
void
*
dp
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
busyobj
,
BUSYOBJ_MAGIC
);
AZ
(
wrk
->
busyobj
->
fetch_failed
);
vg
=
wrk
->
busyobj
->
vgz_rx
;
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
AZ
(
bo
->
fetch_failed
);
vg
=
bo
->
vgz_rx
;
CHECK_OBJ_NOTNULL
(
vg
,
VGZ_MAGIC
);
AZ
(
vg
->
vz
.
avail_in
);
while
(
bytes
>
0
||
!
VGZ_IbufEmpty
(
vg
))
{
...
...
@@ -547,42 +541,41 @@ vfp_gzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
VGZ_Ibuf
(
vg
,
vg
->
m_buf
,
wl
);
bytes
-=
wl
;
}
if
(
VGZ_ObufStorage
(
wrk
->
busyobj
,
vg
))
if
(
VGZ_ObufStorage
(
bo
,
vg
))
return
(
-
1
);
i
=
VGZ_Gzip
(
vg
,
&
dp
,
&
dl
,
VGZ_NORMAL
);
assert
(
i
==
Z_OK
);
wrk
->
busyobj
->
fetch_obj
->
len
+=
dl
;
bo
->
fetch_obj
->
len
+=
dl
;
}
return
(
1
);
}
static
int
__match_proto__
()
vfp_gzip_end
(
struct
worker
*
wrk
)
static
int
__match_proto__
(
vfp_end_f
)
vfp_gzip_end
(
struct
busyobj
*
bo
)
{
struct
vgz
*
vg
;
size_t
dl
;
const
void
*
dp
;
int
i
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
busyobj
,
BUSYOBJ_MAGIC
);
vg
=
wrk
->
busyobj
->
vgz_rx
;
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
vg
=
bo
->
vgz_rx
;
CHECK_OBJ_NOTNULL
(
vg
,
VGZ_MAGIC
);
wrk
->
busyobj
->
vgz_rx
=
NULL
;
if
(
wrk
->
busyobj
->
fetch_failed
)
{
bo
->
vgz_rx
=
NULL
;
if
(
bo
->
fetch_failed
)
{
(
void
)
VGZ_Destroy
(
&
vg
);
return
(
0
);
}
do
{
VGZ_Ibuf
(
vg
,
""
,
0
);
if
(
VGZ_ObufStorage
(
wrk
->
busyobj
,
vg
))
if
(
VGZ_ObufStorage
(
bo
,
vg
))
return
(
-
1
);
i
=
VGZ_Gzip
(
vg
,
&
dp
,
&
dl
,
VGZ_FINISH
);
wrk
->
busyobj
->
fetch_obj
->
len
+=
dl
;
bo
->
fetch_obj
->
len
+=
dl
;
}
while
(
i
!=
Z_STREAM_END
);
VGZ_UpdateObj
(
vg
,
wrk
->
busyobj
->
fetch_obj
);
VGZ_UpdateObj
(
vg
,
bo
->
fetch_obj
);
if
(
VGZ_Destroy
(
&
vg
)
!=
VGZ_END
)
return
(
FetchError
(
wrk
->
busyobj
,
"Gzip error at the very end"
));
return
(
FetchError
(
bo
,
"Gzip error at the very end"
));
return
(
0
);
}
...
...
@@ -599,19 +592,18 @@ struct vfp vfp_gzip = {
* collecting the magic bits while we're at it.
*/
static
void
__match_proto__
()
vfp_testgzip_begin
(
struct
worker
*
wrk
,
size_t
estimate
)
static
void
__match_proto__
(
vfp_begin_f
)
vfp_testgzip_begin
(
struct
busyobj
*
bo
,
size_t
estimate
)
{
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
busyobj
,
BUSYOBJ_MAGIC
);
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
(
void
)
estimate
;
wrk
->
busyobj
->
vgz_rx
=
VGZ_NewUngzip
(
wrk
->
vsl
,
"u F -"
);
CHECK_OBJ_NOTNULL
(
wrk
->
busyobj
->
vgz_rx
,
VGZ_MAGIC
);
XXXAZ
(
vgz_getmbuf
(
wrk
->
busyobj
->
vgz_rx
));
bo
->
vgz_rx
=
VGZ_NewUngzip
(
bo
->
vsl
,
"u F -"
);
CHECK_OBJ_NOTNULL
(
bo
->
vgz_rx
,
VGZ_MAGIC
);
XXXAZ
(
vgz_getmbuf
(
bo
->
vgz_rx
));
}
static
int
__match_proto__
()
vfp_testgzip_bytes
(
struct
worker
*
wrk
,
struct
http_conn
*
htc
,
ssize_t
bytes
)
static
int
__match_proto__
(
vfp_bytes_f
)
vfp_testgzip_bytes
(
struct
busyobj
*
bo
,
struct
http_conn
*
htc
,
ssize_t
bytes
)
{
struct
vgz
*
vg
;
ssize_t
l
,
wl
;
...
...
@@ -620,14 +612,13 @@ vfp_testgzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
const
void
*
dp
;
struct
storage
*
st
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
busyobj
,
BUSYOBJ_MAGIC
);
AZ
(
wrk
->
busyobj
->
fetch_failed
);
vg
=
wrk
->
busyobj
->
vgz_rx
;
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
AZ
(
bo
->
fetch_failed
);
vg
=
bo
->
vgz_rx
;
CHECK_OBJ_NOTNULL
(
vg
,
VGZ_MAGIC
);
AZ
(
vg
->
vz
.
avail_in
);
while
(
bytes
>
0
)
{
st
=
FetchStorage
(
wrk
->
busyobj
,
0
);
st
=
FetchStorage
(
bo
,
0
);
if
(
st
==
NULL
)
return
(
-
1
);
l
=
st
->
space
-
st
->
len
;
...
...
@@ -639,16 +630,15 @@ vfp_testgzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
bytes
-=
wl
;
VGZ_Ibuf
(
vg
,
st
->
ptr
+
st
->
len
,
wl
);
st
->
len
+=
wl
;
wrk
->
busyobj
->
fetch_obj
->
len
+=
wl
;
bo
->
fetch_obj
->
len
+=
wl
;
while
(
!
VGZ_IbufEmpty
(
vg
))
{
VGZ_Obuf
(
vg
,
vg
->
m_buf
,
vg
->
m_sz
);
i
=
VGZ_Gunzip
(
vg
,
&
dp
,
&
dl
);
if
(
i
==
VGZ_END
&&
!
VGZ_IbufEmpty
(
vg
))
return
(
FetchError
(
wrk
->
busyobj
,
"Junk after gzip data"
));
return
(
FetchError
(
bo
,
"Junk after gzip data"
));
if
(
i
!=
VGZ_OK
&&
i
!=
VGZ_END
)
return
(
FetchError2
(
wrk
->
busyobj
,
return
(
FetchError2
(
bo
,
"Invalid Gzip data"
,
vg
->
vz
.
msg
));
}
}
...
...
@@ -656,24 +646,22 @@ vfp_testgzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
return
(
1
);
}
static
int
__match_proto__
()
vfp_testgzip_end
(
struct
worker
*
wrk
)
static
int
__match_proto__
(
vfp_end_f
)
vfp_testgzip_end
(
struct
busyobj
*
bo
)
{
struct
vgz
*
vg
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
busyobj
,
BUSYOBJ_MAGIC
);
vg
=
wrk
->
busyobj
->
vgz_rx
;
wrk
->
busyobj
->
vgz_rx
=
NULL
;
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
vg
=
bo
->
vgz_rx
;
bo
->
vgz_rx
=
NULL
;
CHECK_OBJ_NOTNULL
(
vg
,
VGZ_MAGIC
);
if
(
wrk
->
busyobj
->
fetch_failed
)
{
if
(
bo
->
fetch_failed
)
{
(
void
)
VGZ_Destroy
(
&
vg
);
return
(
0
);
}
VGZ_UpdateObj
(
vg
,
wrk
->
busyobj
->
fetch_obj
);
VGZ_UpdateObj
(
vg
,
bo
->
fetch_obj
);
if
(
VGZ_Destroy
(
&
vg
)
!=
VGZ_END
)
return
(
FetchError
(
wrk
->
busyobj
,
"TestGunzip error at the very end"
));
return
(
FetchError
(
bo
,
"TestGunzip error at the very end"
));
return
(
0
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment