48
48
# this: https://github.com/joyent/node/blob/master/src/node_http_parser.cc#L207
49
49
50
50
function on_header_field (parser, at, len)
51
- r = pd (parser). request
51
+ par = pd (parser)
52
+ if par. num_fields == par. num_values
53
+ par. num_fields += 1
54
+ push! (par. vec_fields, " " )
55
+ end
52
56
header = unsafe_string (convert (Ptr{UInt8}, at))
53
57
header_field = header[1 : len]
54
- r . headers[ " current_header " ] = header_field
58
+ par . vec_fields[par . num_fields ] = string (par . vec_fields[par . num_fields], header_field)
55
59
return 0
56
60
end
57
61
58
62
function on_header_value (parser, at, len)
59
- r = pd (parser). request
63
+ par = pd (parser)
64
+ if par. num_values != par. num_fields
65
+ par. num_values += 1
66
+ push! (par. vec_values, " " )
67
+ end
60
68
s = unsafe_string (convert (Ptr{UInt8}, at), Int (len))
61
- r. headers[r. headers[" current_header" ]] = s
62
- r. headers[" current_header" ] = " "
63
- # delete!(r.headers, "current_header")
69
+ header_value = s[1 : len]
70
+ par. vec_values[par. num_values] = string (par. vec_values[par. num_values], header_value)
64
71
return 0
65
72
end
66
73
67
74
function on_headers_complete (parser)
68
- r = pd (parser). request
75
+ par = pd (parser)
76
+ r = par. request
77
+ merge! (r. headers, Dict (zip (par. vec_fields, par. vec_values)))
78
+ par. num_fields = 0
79
+ par. num_values = 0
80
+ empty! (par. vec_fields)
81
+ empty! (par. vec_values)
69
82
p = unsafe_load (parser)
70
83
# get first two bits of p.type_and_flags
71
84
ptype = p. type_and_flags & 0x03
@@ -93,10 +106,6 @@ function on_message_complete(parser)
93
106
r = state. request
94
107
# r.data = takebuf_array(state.data)
95
108
96
- # delete the temporary header key
97
- # delete!(r.headers, "current_header")
98
- pop! (r. headers, " current_header" , nothing )
99
-
100
109
# Get the `parser.id` from the C pointer `parser`.
101
110
# Retrieve our callback function from the global Dict.
102
111
# Call it with the completed `Request`
@@ -112,8 +121,12 @@ default_complete_cb(r::Request) = nothing
112
121
type RequestParserState
113
122
request:: Request
114
123
complete_cb:: Function
124
+ num_fields:: Int
125
+ num_values:: Int
126
+ vec_fields:: Vector{String}
127
+ vec_values:: Vector{String}
115
128
end
116
- RequestParserState () = RequestParserState (Request (),default_complete_cb)
129
+ RequestParserState () = RequestParserState (Request (),default_complete_cb, 0 , 0 , Vector {String} (), Vector {String} () )
117
130
118
131
pd (p:: Ptr{Parser} ) = (unsafe_load (p). data):: RequestParserState
119
132
0 commit comments