This file is indexed.

/usr/share/doc/libpion-doc/html/spdy__parser_8cpp_source.html is in libpion-doc 5.0.4+dfsg-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>pion: src/spdy_parser.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.1 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
    </ul>
  </div>
<h1>src/spdy_parser.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// ---------------------------------------------------------------------</span>
<a name="l00002"></a>00002 <span class="comment">// pion:  a Boost C++ framework for building lightweight HTTP interfaces</span>
<a name="l00003"></a>00003 <span class="comment">// ---------------------------------------------------------------------</span>
<a name="l00004"></a>00004 <span class="comment">// Copyright (C) 2007-2012 Cloudmeter, Inc.  (http://www.cloudmeter.com)</span>
<a name="l00005"></a>00005 <span class="comment">//</span>
<a name="l00006"></a>00006 <span class="comment">// Distributed under the Boost Software License, Version 1.0.</span>
<a name="l00007"></a>00007 <span class="comment">// See http://www.boost.org/LICENSE_1_0.txt</span>
<a name="l00008"></a>00008 <span class="comment">//</span>
<a name="l00009"></a>00009 
<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;cstdlib&gt;</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include &lt;boost/regex.hpp&gt;</span>
<a name="l00012"></a>00012 <span class="preprocessor">#include &lt;boost/logic/tribool.hpp&gt;</span>
<a name="l00013"></a>00013 <span class="preprocessor">#include &lt;boost/asio/detail/socket_ops.hpp&gt;</span>
<a name="l00014"></a>00014 <span class="preprocessor">#include &lt;pion/algorithm.hpp&gt;</span>
<a name="l00015"></a>00015 <span class="preprocessor">#include &lt;pion/spdy/parser.hpp&gt;</span>
<a name="l00016"></a>00016 <span class="preprocessor">#include &lt;pion/spdy/decompressor.hpp&gt;</span>
<a name="l00017"></a>00017 <span class="preprocessor">#include &lt;pion/spdy/types.hpp&gt;</span>
<a name="l00018"></a>00018 
<a name="l00019"></a>00019 
<a name="l00020"></a>00020 <span class="keyword">namespace </span>pion {    <span class="comment">// begin namespace pion</span>
<a name="l00021"></a>00021 <span class="keyword">namespace </span>spdy {    <span class="comment">// begin namespace spdy</span>
<a name="l00022"></a>00022 
<a name="l00023"></a>00023 
<a name="l00024"></a>00024 parser::error_category_t *  parser::m_error_category_ptr = NULL;
<a name="l00025"></a>00025 boost::once_flag            parser::m_instance_flag = BOOST_ONCE_INIT;
<a name="l00026"></a>00026 
<a name="l00027"></a>00027 <span class="comment">// parser member functions</span>
<a name="l00028"></a>00028 
<a name="l00029"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#a289c7ef60496f20705af20bec52d5302">00029</a> <a class="code" href="classpion_1_1spdy_1_1parser.html#a289c7ef60496f20705af20bec52d5302" title="constructs a new parser object (default constructor)">parser::parser</a>()
<a name="l00030"></a>00030     : m_read_ptr(NULL),
<a name="l00031"></a>00031     m_uncompressed_ptr(NULL),
<a name="l00032"></a>00032     m_current_data_chunk_ptr(NULL),
<a name="l00033"></a>00033     m_last_data_chunk_ptr(NULL),
<a name="l00034"></a>00034     m_logger(PION_GET_LOGGER(<span class="stringliteral">&quot;pion.spdy.parser&quot;</span>))
<a name="l00035"></a>00035 {}
<a name="l00036"></a>00036 
<a name="l00037"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#a824b2f98f915c0402c75c50e33af1d4f">00037</a> boost::tribool <a class="code" href="classpion_1_1spdy_1_1parser.html#a824b2f98f915c0402c75c50e33af1d4f">parser::parse</a>(<a class="code" href="structpion_1_1spdy_1_1__http__protocol__info__t.html" title="This structure contains the HTTP Protocol information.">http_protocol_info</a>&amp; http_info,
<a name="l00038"></a>00038                              boost::system::error_code&amp; ec,
<a name="l00039"></a>00039                              decompressor_ptr&amp; <a class="code" href="classpion_1_1spdy_1_1decompressor.html">decompressor</a>,
<a name="l00040"></a>00040                              <span class="keyword">const</span> <span class="keywordtype">char</span> *packet_ptr,
<a name="l00041"></a>00041                              boost::uint32_t&amp; length_packet,
<a name="l00042"></a>00042                              boost::uint32_t current_stream_count)
<a name="l00043"></a>00043 {
<a name="l00044"></a>00044     <span class="comment">// initialize read position</span>
<a name="l00045"></a>00045     <a class="code" href="classpion_1_1spdy_1_1parser.html#a84d142819f982415844b77f5c3d8d0bb" title="resets the read pointer">set_read_ptr</a>(packet_ptr);
<a name="l00046"></a>00046     
<a name="l00047"></a>00047     <span class="comment">// Parse the frame</span>
<a name="l00048"></a>00048     <span class="keywordflow">return</span> <a class="code" href="classpion_1_1spdy_1_1parser.html#a7fa079f8501944f9d55f2054f896d08a">parse_spdy_frame</a>(ec, decompressor, http_info, length_packet, current_stream_count);
<a name="l00049"></a>00049 }
<a name="l00050"></a>00050 
<a name="l00051"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#a9d162f5bb587fe627f678a9ab19dd712">00051</a> <span class="keywordtype">bool</span> <a class="code" href="classpion_1_1spdy_1_1parser.html#a9d162f5bb587fe627f678a9ab19dd712">parser::is_spdy_control_frame</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *ptr)
<a name="l00052"></a>00052 {
<a name="l00053"></a>00053     <span class="comment">// Parse further for higher accuracy</span>
<a name="l00054"></a>00054     
<a name="l00055"></a>00055     <span class="comment">// Get the control bit</span>
<a name="l00056"></a>00056     boost::uint8_t control_bit;
<a name="l00057"></a>00057     boost::uint16_t version, type;
<a name="l00058"></a>00058     boost::uint16_t byte_value = <a class="code" href="structpion_1_1algorithm.html#aa755b157b2cda061aec92c49b7ee9dac" title="convert sequence of two bytes to 16-bit unsigned integer">algorithm::to_uint16</a>(ptr);
<a name="l00059"></a>00059     control_bit = byte_value &gt;&gt; (<span class="keyword">sizeof</span>(short) * CHAR_BIT - 1);
<a name="l00060"></a>00060 
<a name="l00061"></a>00061     <span class="keywordflow">if</span> (!control_bit) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00062"></a>00062     
<a name="l00063"></a>00063     <span class="comment">// Control bit is set; This is a control frame</span>
<a name="l00064"></a>00064     
<a name="l00065"></a>00065     <span class="comment">// Get the version number</span>
<a name="l00066"></a>00066     boost::uint16_t two_bytes = <a class="code" href="structpion_1_1algorithm.html#aa755b157b2cda061aec92c49b7ee9dac" title="convert sequence of two bytes to 16-bit unsigned integer">algorithm::to_uint16</a>(ptr);
<a name="l00067"></a>00067     version = two_bytes &amp; 0x7FFF;
<a name="l00068"></a>00068     
<a name="l00069"></a>00069     <span class="keywordflow">if</span>(version &lt; 1 || version &gt; 3){
<a name="l00070"></a>00070         <span class="comment">// SPDY does not have a version higher than 3 and lower than 1 at the moment</span>
<a name="l00071"></a>00071         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00072"></a>00072     }
<a name="l00073"></a>00073     
<a name="l00074"></a>00074     <span class="comment">// Increment the read pointer</span>
<a name="l00075"></a>00075     ptr += 2;
<a name="l00076"></a>00076     
<a name="l00077"></a>00077     type = <a class="code" href="structpion_1_1algorithm.html#aa755b157b2cda061aec92c49b7ee9dac" title="convert sequence of two bytes to 16-bit unsigned integer">algorithm::to_uint16</a>(ptr);
<a name="l00078"></a>00078     
<a name="l00079"></a>00079     <span class="keywordflow">if</span> (type &gt;= SPDY_INVALID) {
<a name="l00080"></a>00080         <span class="comment">// Not among the recognized SPDY types</span>
<a name="l00081"></a>00081         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00082"></a>00082     }
<a name="l00083"></a>00083     
<a name="l00084"></a>00084     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00085"></a>00085 }
<a name="l00086"></a>00086 
<a name="l00087"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#afa6e6079f12d6adc17688b38bc0727dd">00087</a> spdy_frame_type <a class="code" href="classpion_1_1spdy_1_1parser.html#afa6e6079f12d6adc17688b38bc0727dd">parser::get_spdy_frame_type</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *ptr)
<a name="l00088"></a>00088 {
<a name="l00089"></a>00089     <span class="comment">// Determine if this a SPDY frame</span>
<a name="l00090"></a>00090     BOOST_ASSERT(ptr);
<a name="l00091"></a>00091 
<a name="l00092"></a>00092     <span class="comment">/*</span>
<a name="l00093"></a>00093 <span class="comment">     * The first byte of a SPDY frame must be either 0 or</span>
<a name="l00094"></a>00094 <span class="comment">     * 0x80. If it&apos;s not, assume that this is not SPDY.</span>
<a name="l00095"></a>00095 <span class="comment">     * (In theory, a data frame could have a stream ID</span>
<a name="l00096"></a>00096 <span class="comment">     * &gt;= 2^24, in which case it won&apos;t have 0 for a first</span>
<a name="l00097"></a>00097 <span class="comment">     * byte, but this is a pretty reliable heuristic for</span>
<a name="l00098"></a>00098 <span class="comment">     * now.)</span>
<a name="l00099"></a>00099 <span class="comment">     */</span>
<a name="l00100"></a>00100     
<a name="l00101"></a>00101     spdy_frame_type spdy_frame;
<a name="l00102"></a>00102     boost::uint8_t first_byte = *((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)ptr);
<a name="l00103"></a>00103     <span class="keywordflow">if</span>(first_byte == 0x80){
<a name="l00104"></a>00104         spdy_frame = spdy_control_frame;
<a name="l00105"></a>00105     }<span class="keywordflow">else</span> <span class="keywordflow">if</span>(first_byte == 0x0){
<a name="l00106"></a>00106         spdy_frame = spdy_data_frame;
<a name="l00107"></a>00107     }<span class="keywordflow">else</span>{
<a name="l00108"></a>00108         spdy_frame = spdy_invalid_frame;
<a name="l00109"></a>00109     }
<a name="l00110"></a>00110     <span class="keywordflow">return</span> spdy_frame;
<a name="l00111"></a>00111 }
<a name="l00112"></a>00112     
<a name="l00113"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#a472c57e8a77ee5ad056ef11fe5aad50e">00113</a> boost::uint32_t <a class="code" href="classpion_1_1spdy_1_1parser.html#a472c57e8a77ee5ad056ef11fe5aad50e">parser::get_control_frame_stream_id</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *ptr)
<a name="l00114"></a>00114 {
<a name="l00115"></a>00115     <span class="comment">// The stream ID for control frames is at a 8 bit offser from start</span>
<a name="l00116"></a>00116     ptr += 8;
<a name="l00117"></a>00117 
<a name="l00118"></a>00118     boost::uint32_t four_bytes = <a class="code" href="structpion_1_1algorithm.html#af2092366e2a82fbfc456bceb15a0f599" title="convert sequence of four bytes to 32-bit unsigned integer">algorithm::to_uint32</a>(ptr);
<a name="l00119"></a>00119     <span class="keywordflow">return</span> four_bytes &amp; 0x7FFFFFFF;
<a name="l00120"></a>00120 }
<a name="l00121"></a>00121     
<a name="l00122"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#a7fa079f8501944f9d55f2054f896d08a">00122</a> boost::tribool <a class="code" href="classpion_1_1spdy_1_1parser.html#a7fa079f8501944f9d55f2054f896d08a">parser::parse_spdy_frame</a>(boost::system::error_code&amp; ec,
<a name="l00123"></a>00123                                         decompressor_ptr&amp; <a class="code" href="classpion_1_1spdy_1_1decompressor.html">decompressor</a>,
<a name="l00124"></a>00124                                         <a class="code" href="structpion_1_1spdy_1_1__http__protocol__info__t.html" title="This structure contains the HTTP Protocol information.">http_protocol_info</a>&amp; http_info,
<a name="l00125"></a>00125                                         boost::uint32_t&amp; length_packet,
<a name="l00126"></a>00126                                         boost::uint32_t current_stream_count)
<a name="l00127"></a>00127 {
<a name="l00128"></a>00128     boost::tribool rc = <span class="keyword">true</span>;
<a name="l00129"></a>00129     
<a name="l00130"></a>00130     <span class="comment">// Verify that this is a spdy frame</span>
<a name="l00131"></a>00131     
<a name="l00132"></a>00132     BOOST_ASSERT(m_read_ptr);
<a name="l00133"></a>00133     boost::uint8_t first_byte = (boost::uint8_t)*m_read_ptr;
<a name="l00134"></a>00134     <span class="keywordflow">if</span> (first_byte != 0x80 &amp;&amp; first_byte != 0x0) {
<a name="l00135"></a>00135         <span class="comment">// This is not a SPDY frame, throw an error</span>
<a name="l00136"></a>00136         PION_LOG_ERROR(m_logger, <span class="stringliteral">&quot;Invalid SPDY Frame&quot;</span>);
<a name="l00137"></a>00137         <a class="code" href="classpion_1_1spdy_1_1parser.html#a8caaf3917f65aeab5feee513e8b656b5">set_error</a>(ec, ERROR_INVALID_SPDY_FRAME);
<a name="l00138"></a>00138         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00139"></a>00139     }
<a name="l00140"></a>00140     
<a name="l00141"></a>00141     boost::uint8_t              control_bit;
<a name="l00142"></a>00142     <a class="code" href="structpion_1_1spdy_1_1spdy__control__frame__info.html" title="This structure will be tied to each SPDY frame.">spdy_control_frame_info</a>     frame;
<a name="l00143"></a>00143     boost::uint32_t             stream_id = 0;
<a name="l00144"></a>00144     
<a name="l00145"></a>00145     ec.clear();
<a name="l00146"></a>00146 
<a name="l00147"></a>00147     <span class="comment">// Populate the frame</span>
<a name="l00148"></a>00148     <span class="keywordtype">bool</span> populate_frame_result = <a class="code" href="classpion_1_1spdy_1_1parser.html#aa0000b4cee0f8a2084f3e0056ab561de">populate_frame</a>(ec, frame, length_packet, stream_id, http_info);
<a name="l00149"></a>00149     
<a name="l00150"></a>00150     <span class="keywordflow">if</span>(!populate_frame_result){
<a name="l00152"></a>00152         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00153"></a>00153     }
<a name="l00154"></a>00154     
<a name="l00155"></a>00155     BOOST_ASSERT(stream_id != 0);
<a name="l00156"></a>00156     
<a name="l00157"></a>00157     control_bit = (boost::uint8_t)frame.control_bit;
<a name="l00158"></a>00158     
<a name="l00159"></a>00159     <span class="comment">// There is a possibility that there are more than one SPDY frames in one TCP frame</span>
<a name="l00160"></a>00160     <span class="keywordflow">if</span>(length_packet &gt; frame.length){
<a name="l00161"></a>00161         m_current_data_chunk_ptr = m_read_ptr + frame.length;
<a name="l00162"></a>00162         length_packet -= frame.length;
<a name="l00163"></a>00163         rc = boost::indeterminate;
<a name="l00164"></a>00164     }
<a name="l00165"></a>00165     
<a name="l00166"></a>00166     <span class="keywordflow">if</span> (!control_bit) {
<a name="l00167"></a>00167         <span class="comment">// Parse the data packet</span>
<a name="l00168"></a>00168         <a class="code" href="classpion_1_1spdy_1_1parser.html#aae6750b7a90921dd6d8bc2da50cc1aa7">parse_spdy_data</a>(ec, frame, stream_id, http_info);
<a name="l00169"></a>00169     }
<a name="l00170"></a>00170     
<a name="l00171"></a>00171     <span class="comment">/* Abort here if the version is too low. */</span>
<a name="l00172"></a>00172     
<a name="l00173"></a>00173     <span class="keywordflow">if</span> (frame.version &gt; MIN_SPDY_VERSION) {
<a name="l00174"></a>00174         <span class="comment">// Version less that min SPDY version, throw an error</span>
<a name="l00175"></a>00175         PION_LOG_ERROR(m_logger, <span class="stringliteral">&quot;Invalid SPDY Version Number&quot;</span>);
<a name="l00176"></a>00176         <a class="code" href="classpion_1_1spdy_1_1parser.html#a8caaf3917f65aeab5feee513e8b656b5">set_error</a>(ec, ERROR_INVALID_SPDY_VERSION);
<a name="l00177"></a>00177         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00178"></a>00178     }
<a name="l00179"></a>00179     
<a name="l00180"></a>00180     <span class="keywordflow">if</span>(frame.type ==  SPDY_SYN_STREAM){
<a name="l00181"></a>00181         http_info.http_type = HTTP_REQUEST;
<a name="l00182"></a>00182     }<span class="keywordflow">else</span> <span class="keywordflow">if</span> (frame.type == SPDY_SYN_REPLY){
<a name="l00183"></a>00183         http_info.http_type = HTTP_RESPONSE;
<a name="l00184"></a>00184     }<span class="keywordflow">else</span> <span class="keywordflow">if</span> (frame.type == SPDY_DATA){
<a name="l00185"></a>00185         http_info.http_type = HTTP_DATA;
<a name="l00186"></a>00186     }
<a name="l00187"></a>00187 
<a name="l00188"></a>00188     <span class="keywordflow">switch</span> (frame.type) {
<a name="l00189"></a>00189         <span class="keywordflow">case</span> SPDY_SYN_STREAM:
<a name="l00190"></a>00190         <span class="keywordflow">case</span> SPDY_SYN_REPLY:
<a name="l00191"></a>00191         <span class="keywordflow">case</span> SPDY_HEADERS:
<a name="l00192"></a>00192             <a class="code" href="classpion_1_1spdy_1_1parser.html#a76731f8ae345f1a5af910e5e92b64bbe">parse_header_payload</a>(ec, decompressor, frame, http_info, current_stream_count);
<a name="l00193"></a>00193             <span class="keywordflow">break</span>;
<a name="l00194"></a>00194             
<a name="l00195"></a>00195         <span class="keywordflow">case</span> SPDY_RST_STREAM:
<a name="l00196"></a>00196             <a class="code" href="classpion_1_1spdy_1_1parser.html#ad69dd18af5afc1b6d84d743c3d21d8e0">parse_spdy_rst_stream</a>(ec, frame);
<a name="l00197"></a>00197             http_info.http_type = SPDY_CONTROL;
<a name="l00198"></a>00198             <span class="keywordflow">break</span>;
<a name="l00199"></a>00199             
<a name="l00200"></a>00200         <span class="keywordflow">case</span> SPDY_SETTINGS:
<a name="l00201"></a>00201             <a class="code" href="classpion_1_1spdy_1_1parser.html#a36bd7ae76e3796cf4f99a30aa728c800">parse_spdy_settings_frame</a>(ec, frame);
<a name="l00202"></a>00202             http_info.http_type = SPDY_CONTROL;
<a name="l00203"></a>00203             <span class="keywordflow">break</span>;
<a name="l00204"></a>00204             
<a name="l00205"></a>00205         <span class="keywordflow">case</span> SPDY_PING:
<a name="l00206"></a>00206             <a class="code" href="classpion_1_1spdy_1_1parser.html#a22199322320ed1a68407b438a898d98b">parse_spdy_ping_frame</a>(ec, frame);
<a name="l00207"></a>00207             http_info.http_type = SPDY_CONTROL;
<a name="l00208"></a>00208             <span class="keywordflow">break</span>;
<a name="l00209"></a>00209             
<a name="l00210"></a>00210         <span class="keywordflow">case</span> SPDY_GOAWAY:
<a name="l00211"></a>00211             <a class="code" href="classpion_1_1spdy_1_1parser.html#ae213965a7a77b4cfb385bfa8685c3e50">parse_spdy_goaway_frame</a>(ec, frame);
<a name="l00212"></a>00212             http_info.http_type = SPDY_CONTROL;
<a name="l00213"></a>00213             <span class="keywordflow">break</span>;
<a name="l00214"></a>00214             
<a name="l00215"></a>00215         <span class="keywordflow">case</span> SPDY_WINDOW_UPDATE:
<a name="l00216"></a>00216             <a class="code" href="classpion_1_1spdy_1_1parser.html#a0ce476c60751c29909aec2af32b5b64e">parse_spdy_window_update_frame</a>(ec, frame);
<a name="l00217"></a>00217             http_info.http_type = SPDY_CONTROL;
<a name="l00218"></a>00218             <span class="keywordflow">break</span>;
<a name="l00219"></a>00219             
<a name="l00220"></a>00220         <span class="keywordflow">case</span> SPDY_CREDENTIAL:
<a name="l00221"></a>00221             <span class="comment">// We dont need to parse this for now</span>
<a name="l00222"></a>00222             http_info.http_type = SPDY_CONTROL;
<a name="l00223"></a>00223             <span class="keywordflow">break</span>;
<a name="l00224"></a>00224             
<a name="l00225"></a>00225         <span class="keywordflow">default</span>:
<a name="l00226"></a>00226             <span class="keywordflow">break</span>;
<a name="l00227"></a>00227     }
<a name="l00228"></a>00228     
<a name="l00229"></a>00229     <span class="keywordflow">if</span> (ec)
<a name="l00230"></a>00230         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00231"></a>00231     
<a name="l00232"></a>00232     m_last_data_chunk_ptr = m_read_ptr;
<a name="l00233"></a>00233     m_read_ptr = m_current_data_chunk_ptr;
<a name="l00234"></a>00234     
<a name="l00235"></a>00235     <span class="keywordflow">return</span> rc;
<a name="l00236"></a>00236 }
<a name="l00237"></a>00237 
<a name="l00238"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#a81f25358fc4fbffeb6532cf10c6f7aa4">00238</a> <span class="keywordtype">void</span> <a class="code" href="classpion_1_1spdy_1_1parser.html#a81f25358fc4fbffeb6532cf10c6f7aa4" title="creates the unique parser error_category_t">parser::create_error_category</a>(<span class="keywordtype">void</span>)
<a name="l00239"></a>00239 {
<a name="l00240"></a>00240     <span class="keyword">static</span> <a class="code" href="classpion_1_1spdy_1_1parser_1_1error__category__t.html" title="class-specific error category">error_category_t</a> UNIQUE_ERROR_CATEGORY;
<a name="l00241"></a>00241     m_error_category_ptr = &amp;UNIQUE_ERROR_CATEGORY;
<a name="l00242"></a>00242 }
<a name="l00243"></a>00243 
<a name="l00244"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#aa0000b4cee0f8a2084f3e0056ab561de">00244</a> <span class="keywordtype">bool</span> <a class="code" href="classpion_1_1spdy_1_1parser.html#aa0000b4cee0f8a2084f3e0056ab561de">parser::populate_frame</a>(boost::system::error_code&amp; ec,
<a name="l00245"></a>00245                             <a class="code" href="structpion_1_1spdy_1_1spdy__control__frame__info.html" title="This structure will be tied to each SPDY frame.">spdy_control_frame_info</a>&amp; frame,
<a name="l00246"></a>00246                             boost::uint32_t&amp; length_packet,
<a name="l00247"></a>00247                             boost::uint32_t&amp; stream_id,
<a name="l00248"></a>00248                             <a class="code" href="structpion_1_1spdy_1_1__http__protocol__info__t.html" title="This structure contains the HTTP Protocol information.">http_protocol_info</a>&amp; http_info)
<a name="l00249"></a>00249 {
<a name="l00250"></a>00250     <span class="comment">// Get the control bit</span>
<a name="l00251"></a>00251     boost::uint8_t control_bit;
<a name="l00252"></a>00252     boost::uint16_t byte_value = <a class="code" href="structpion_1_1algorithm.html#aa755b157b2cda061aec92c49b7ee9dac" title="convert sequence of two bytes to 16-bit unsigned integer">algorithm::to_uint16</a>(m_read_ptr);
<a name="l00253"></a>00253     control_bit = byte_value &gt;&gt; (<span class="keyword">sizeof</span>(short) * CHAR_BIT - 1);
<a name="l00254"></a>00254     
<a name="l00255"></a>00255     frame.control_bit = (bool)control_bit;
<a name="l00256"></a>00256     
<a name="l00257"></a>00257     <span class="keywordflow">if</span>(control_bit){
<a name="l00258"></a>00258         
<a name="l00259"></a>00259         <span class="comment">// Control bit is set; This is a control frame</span>
<a name="l00260"></a>00260         
<a name="l00261"></a>00261         <span class="comment">// Get the version number</span>
<a name="l00262"></a>00262         boost::uint16_t two_bytes = <a class="code" href="structpion_1_1algorithm.html#aa755b157b2cda061aec92c49b7ee9dac" title="convert sequence of two bytes to 16-bit unsigned integer">algorithm::to_uint16</a>(m_read_ptr);
<a name="l00263"></a>00263         frame.version = two_bytes &amp; 0x7FFF;
<a name="l00264"></a>00264         
<a name="l00265"></a>00265         <span class="comment">// Increment the read pointer</span>
<a name="l00266"></a>00266         m_read_ptr += 2;
<a name="l00267"></a>00267         length_packet -= 2;
<a name="l00268"></a>00268         http_info.data_offset +=2;
<a name="l00269"></a>00269         
<a name="l00270"></a>00270         <span class="comment">// Get the type</span>
<a name="l00271"></a>00271         frame.type = <a class="code" href="structpion_1_1algorithm.html#aa755b157b2cda061aec92c49b7ee9dac" title="convert sequence of two bytes to 16-bit unsigned integer">algorithm::to_uint16</a>(m_read_ptr);
<a name="l00272"></a>00272         
<a name="l00273"></a>00273         <span class="keywordflow">if</span> (frame.type &gt;= SPDY_INVALID) {
<a name="l00274"></a>00274             <span class="comment">// SPDY Frame is invalid</span>
<a name="l00275"></a>00275             
<a name="l00276"></a>00276             <span class="comment">// This is not a SPDY frame, throw an error</span>
<a name="l00277"></a>00277             PION_LOG_ERROR(m_logger, <span class="stringliteral">&quot;Invalid SPDY Frame&quot;</span>);
<a name="l00278"></a>00278             <a class="code" href="classpion_1_1spdy_1_1parser.html#a8caaf3917f65aeab5feee513e8b656b5">set_error</a>(ec, ERROR_INVALID_SPDY_FRAME);
<a name="l00279"></a>00279             <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00280"></a>00280         }
<a name="l00281"></a>00281     }<span class="keywordflow">else</span> {
<a name="l00282"></a>00282         
<a name="l00283"></a>00283         <span class="comment">// Control bit is not set; This is a data frame</span>
<a name="l00284"></a>00284         
<a name="l00285"></a>00285         frame.type = SPDY_DATA;
<a name="l00286"></a>00286         frame.version = 0; <span class="comment">/* Version doesn&apos;t apply to DATA. */</span>
<a name="l00287"></a>00287         <span class="comment">// Get the stream id</span>
<a name="l00288"></a>00288         boost::uint32_t four_bytes = <a class="code" href="structpion_1_1algorithm.html#af2092366e2a82fbfc456bceb15a0f599" title="convert sequence of four bytes to 32-bit unsigned integer">algorithm::to_uint32</a>(m_read_ptr);
<a name="l00289"></a>00289         stream_id = four_bytes &amp; 0x7FFFFFFF;
<a name="l00290"></a>00290         
<a name="l00291"></a>00291         http_info.stream_id = stream_id;
<a name="l00292"></a>00292         
<a name="l00293"></a>00293         m_read_ptr +=2;
<a name="l00294"></a>00294         http_info.data_offset +=2;
<a name="l00295"></a>00295         length_packet -= 2;
<a name="l00296"></a>00296         
<a name="l00297"></a>00297     }
<a name="l00298"></a>00298     
<a name="l00299"></a>00299     <span class="comment">// Increment the read pointer</span>
<a name="l00300"></a>00300     m_read_ptr += 2;
<a name="l00301"></a>00301     length_packet -= 2;
<a name="l00302"></a>00302     http_info.data_offset +=2;
<a name="l00303"></a>00303     
<a name="l00304"></a>00304     <span class="comment">// Get the flags</span>
<a name="l00305"></a>00305     frame.flags = (boost::uint8_t)*m_read_ptr;
<a name="l00306"></a>00306     
<a name="l00307"></a>00307     <span class="comment">// Increment the read pointer</span>
<a name="l00308"></a>00308     
<a name="l00309"></a>00309     <span class="comment">// Get the length</span>
<a name="l00310"></a>00310     boost::uint32_t four_bytes = <a class="code" href="structpion_1_1algorithm.html#af2092366e2a82fbfc456bceb15a0f599" title="convert sequence of four bytes to 32-bit unsigned integer">algorithm::to_uint32</a>(m_read_ptr);
<a name="l00311"></a>00311     frame.length = four_bytes &amp; 0xFFFFFF;
<a name="l00312"></a>00312     
<a name="l00313"></a>00313     <span class="comment">// Increment the read pointer</span>
<a name="l00314"></a>00314     m_read_ptr += 4;
<a name="l00315"></a>00315     length_packet -= 4;
<a name="l00316"></a>00316     http_info.data_offset +=4;
<a name="l00317"></a>00317     
<a name="l00318"></a>00318     http_info.data_size = frame.length;
<a name="l00319"></a>00319     
<a name="l00320"></a>00320     <span class="keywordflow">if</span>(control_bit){
<a name="l00321"></a>00321         four_bytes = <a class="code" href="structpion_1_1algorithm.html#af2092366e2a82fbfc456bceb15a0f599" title="convert sequence of four bytes to 32-bit unsigned integer">algorithm::to_uint32</a>(m_read_ptr);
<a name="l00322"></a>00322         stream_id = four_bytes &amp; 0x7FFFFFFF;
<a name="l00323"></a>00323     }
<a name="l00324"></a>00324     
<a name="l00325"></a>00325     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00326"></a>00326 }
<a name="l00327"></a>00327 
<a name="l00328"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#a76731f8ae345f1a5af910e5e92b64bbe">00328</a> <span class="keywordtype">void</span> <a class="code" href="classpion_1_1spdy_1_1parser.html#a76731f8ae345f1a5af910e5e92b64bbe">parser::parse_header_payload</a>(boost::system::error_code &amp;ec,
<a name="l00329"></a>00329                                   decompressor_ptr&amp; <a class="code" href="classpion_1_1spdy_1_1decompressor.html">decompressor</a>,
<a name="l00330"></a>00330                                   <span class="keyword">const</span> <a class="code" href="structpion_1_1spdy_1_1spdy__control__frame__info.html" title="This structure will be tied to each SPDY frame.">spdy_control_frame_info</a>&amp; frame,
<a name="l00331"></a>00331                                   <a class="code" href="structpion_1_1spdy_1_1__http__protocol__info__t.html" title="This structure contains the HTTP Protocol information.">http_protocol_info</a>&amp; http_info,
<a name="l00332"></a>00332                                   boost::uint32_t current_stream_count)
<a name="l00333"></a>00333 {
<a name="l00334"></a>00334     boost::uint32_t stream_id = 0;
<a name="l00335"></a>00335     boost::uint32_t associated_stream_id;
<a name="l00336"></a>00336     boost::uint32_t header_block_length = frame.length;
<a name="l00337"></a>00337     
<a name="l00338"></a>00338     <span class="comment">// Get the 31 bit stream id</span>
<a name="l00339"></a>00339     
<a name="l00340"></a>00340     boost::uint32_t four_bytes = <a class="code" href="structpion_1_1algorithm.html#af2092366e2a82fbfc456bceb15a0f599" title="convert sequence of four bytes to 32-bit unsigned integer">algorithm::to_uint32</a>(m_read_ptr);
<a name="l00341"></a>00341     stream_id = four_bytes &amp; 0x7FFFFFFF;
<a name="l00342"></a>00342     
<a name="l00343"></a>00343     m_read_ptr += 4;
<a name="l00344"></a>00344     
<a name="l00345"></a>00345     http_info.stream_id = stream_id;
<a name="l00346"></a>00346     
<a name="l00347"></a>00347     <span class="comment">// Get SYN_STREAM-only fields.</span>
<a name="l00348"></a>00348     
<a name="l00349"></a>00349     <span class="keywordflow">if</span> (frame.type == SPDY_SYN_STREAM) {
<a name="l00350"></a>00350         
<a name="l00351"></a>00351         <span class="comment">// Get associated stream ID.</span>
<a name="l00352"></a>00352         
<a name="l00353"></a>00353         boost::uint32_t four_bytes = <a class="code" href="structpion_1_1algorithm.html#af2092366e2a82fbfc456bceb15a0f599" title="convert sequence of four bytes to 32-bit unsigned integer">algorithm::to_uint32</a>(m_read_ptr);
<a name="l00354"></a>00354         associated_stream_id = four_bytes &amp; 0x7FFFFFFF;
<a name="l00355"></a>00355         
<a name="l00356"></a>00356         m_read_ptr += 4;
<a name="l00357"></a>00357         
<a name="l00358"></a>00358         <span class="comment">// The next bits are priority, unused, and slot.</span>
<a name="l00359"></a>00359         <span class="comment">// Disregard these for now as we dont need them</span>
<a name="l00360"></a>00360         
<a name="l00361"></a>00361         m_read_ptr +=2 ;
<a name="l00362"></a>00362         
<a name="l00363"></a>00363     } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( frame.type == SPDY_SYN_REPLY || frame.type == SPDY_HEADERS ) {
<a name="l00364"></a>00364         
<a name="l00365"></a>00365         <span class="comment">// Unused bits</span>
<a name="l00366"></a>00366         m_read_ptr +=2 ;
<a name="l00367"></a>00367     }
<a name="l00368"></a>00368     
<a name="l00369"></a>00369     <span class="comment">// Get our header block length.</span>
<a name="l00370"></a>00370     
<a name="l00371"></a>00371     <span class="keywordflow">switch</span> (frame.type) {
<a name="l00372"></a>00372         <span class="keywordflow">case</span> SPDY_SYN_STREAM:
<a name="l00373"></a>00373             header_block_length -= 10;
<a name="l00374"></a>00374             <span class="keywordflow">break</span>;
<a name="l00375"></a>00375         <span class="keywordflow">case</span> SPDY_SYN_REPLY:
<a name="l00376"></a>00376         <span class="keywordflow">case</span> SPDY_HEADERS:
<a name="l00377"></a>00377             <span class="comment">// This is a very important distinction.</span>
<a name="l00378"></a>00378             <span class="comment">// It should be 6 bytes for SPDYv2 and 4 bytes for SPDYv3.</span>
<a name="l00379"></a>00379             header_block_length -= 6;
<a name="l00380"></a>00380             <span class="keywordflow">break</span>;
<a name="l00381"></a>00381         <span class="keywordflow">default</span>:
<a name="l00382"></a>00382             <span class="comment">// Unhandled case. This should never happen.</span>
<a name="l00383"></a>00383             PION_LOG_ERROR(m_logger, <span class="stringliteral">&quot;Invalid SPDY Frame Type&quot;</span>);
<a name="l00384"></a>00384             <a class="code" href="classpion_1_1spdy_1_1parser.html#a8caaf3917f65aeab5feee513e8b656b5">set_error</a>(ec, ERROR_INVALID_SPDY_FRAME);
<a name="l00385"></a>00385             <span class="keywordflow">return</span>;
<a name="l00386"></a>00386     }
<a name="l00387"></a>00387     
<a name="l00388"></a>00388     <span class="comment">// Decompress header block as necessary.</span>
<a name="l00389"></a>00389     m_uncompressed_ptr = decompressor-&gt;decompress(m_read_ptr,
<a name="l00390"></a>00390                                                   stream_id,
<a name="l00391"></a>00391                                                   frame,
<a name="l00392"></a>00392                                                   header_block_length);
<a name="l00393"></a>00393     
<a name="l00394"></a>00394     <span class="keywordflow">if</span> (!m_uncompressed_ptr) {
<a name="l00395"></a>00395         <a class="code" href="classpion_1_1spdy_1_1parser.html#a8caaf3917f65aeab5feee513e8b656b5">set_error</a>(ec, ERROR_DECOMPRESSION);
<a name="l00396"></a>00396         <span class="keywordflow">return</span>;
<a name="l00397"></a>00397     }
<a name="l00398"></a>00398         
<a name="l00399"></a>00399     <span class="comment">// Now parse the name/value pairs</span>
<a name="l00400"></a>00400     
<a name="l00401"></a>00401     <span class="comment">// The number of name/value pairs is 16 bit SPDYv2</span>
<a name="l00402"></a>00402     <span class="comment">// and it is 32 bit in SPDYv3</span>
<a name="l00403"></a>00403     
<a name="l00404"></a>00404     <span class="comment">// TBD : Add support for SPDYv3</span>
<a name="l00405"></a>00405     boost::uint16_t num_name_val_pairs = <a class="code" href="structpion_1_1algorithm.html#aa755b157b2cda061aec92c49b7ee9dac" title="convert sequence of two bytes to 16-bit unsigned integer">algorithm::to_uint16</a>(m_uncompressed_ptr);
<a name="l00406"></a>00406     
<a name="l00407"></a>00407     m_uncompressed_ptr += 2;
<a name="l00408"></a>00408     
<a name="l00409"></a>00409     std::string content_type = <span class="stringliteral">&quot;&quot;</span>;
<a name="l00410"></a>00410     std::string content_encoding = <span class="stringliteral">&quot;&quot;</span>;
<a name="l00411"></a>00411     
<a name="l00412"></a>00412     <span class="keywordflow">for</span>(boost::uint16_t count = 0; count &lt; num_name_val_pairs; ++count){
<a name="l00413"></a>00413         
<a name="l00414"></a>00414         
<a name="l00415"></a>00415         <span class="comment">// Get the length of the name</span>
<a name="l00416"></a>00416         boost::uint16_t length_name = <a class="code" href="structpion_1_1algorithm.html#aa755b157b2cda061aec92c49b7ee9dac" title="convert sequence of two bytes to 16-bit unsigned integer">algorithm::to_uint16</a>(m_uncompressed_ptr);
<a name="l00417"></a>00417         std::string name = <span class="stringliteral">&quot;&quot;</span>;
<a name="l00418"></a>00418         
<a name="l00419"></a>00419         m_uncompressed_ptr += 2;
<a name="l00420"></a>00420         
<a name="l00421"></a>00421         {
<a name="l00422"></a>00422             <span class="keywordflow">for</span>(boost::uint16_t count = 0; count &lt; length_name; ++count){
<a name="l00423"></a>00423                 name.push_back(*(m_uncompressed_ptr+count));
<a name="l00424"></a>00424             }
<a name="l00425"></a>00425             m_uncompressed_ptr += length_name;
<a name="l00426"></a>00426         }
<a name="l00427"></a>00427         
<a name="l00428"></a>00428         <span class="comment">// Get the length of the value</span>
<a name="l00429"></a>00429         boost::uint16_t length_value = <a class="code" href="structpion_1_1algorithm.html#aa755b157b2cda061aec92c49b7ee9dac" title="convert sequence of two bytes to 16-bit unsigned integer">algorithm::to_uint16</a>(m_uncompressed_ptr);
<a name="l00430"></a>00430         std::string value = <span class="stringliteral">&quot;&quot;</span>;
<a name="l00431"></a>00431         
<a name="l00432"></a>00432         m_uncompressed_ptr += 2;
<a name="l00433"></a>00433         
<a name="l00434"></a>00434         {
<a name="l00435"></a>00435             <span class="keywordflow">for</span>(boost::uint16_t count = 0; count &lt; length_value; ++count){
<a name="l00436"></a>00436                 value.push_back(*(m_uncompressed_ptr+count));
<a name="l00437"></a>00437             }
<a name="l00438"></a>00438             m_uncompressed_ptr += length_value;
<a name="l00439"></a>00439         }
<a name="l00440"></a>00440         
<a name="l00441"></a>00441         <span class="comment">// Save these headers</span>
<a name="l00442"></a>00442         http_info.http_headers.insert(std::make_pair(name, value));
<a name="l00443"></a>00443     }
<a name="l00444"></a>00444 }
<a name="l00445"></a>00445 
<a name="l00446"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#aae6750b7a90921dd6d8bc2da50cc1aa7">00446</a> <span class="keywordtype">void</span> <a class="code" href="classpion_1_1spdy_1_1parser.html#aae6750b7a90921dd6d8bc2da50cc1aa7">parser::parse_spdy_data</a>(boost::system::error_code &amp;ec,
<a name="l00447"></a>00447                              <span class="keyword">const</span> <a class="code" href="structpion_1_1spdy_1_1spdy__control__frame__info.html" title="This structure will be tied to each SPDY frame.">spdy_control_frame_info</a>&amp; frame,
<a name="l00448"></a>00448                              boost::uint32_t stream_id,
<a name="l00449"></a>00449                              <a class="code" href="structpion_1_1spdy_1_1__http__protocol__info__t.html" title="This structure contains the HTTP Protocol information.">http_protocol_info</a>&amp; http_info)
<a name="l00450"></a>00450 {
<a name="l00451"></a>00451     <span class="comment">// This marks the finish flag</span>
<a name="l00452"></a>00452     <span class="keywordflow">if</span> (frame.flags &amp; SPDY_FLAG_FIN){
<a name="l00453"></a>00453         http_info.last_chunk = <span class="keyword">true</span>;
<a name="l00454"></a>00454     }
<a name="l00455"></a>00455 }
<a name="l00456"></a>00456 
<a name="l00457"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#ad69dd18af5afc1b6d84d743c3d21d8e0">00457</a> <span class="keywordtype">void</span> <a class="code" href="classpion_1_1spdy_1_1parser.html#ad69dd18af5afc1b6d84d743c3d21d8e0">parser::parse_spdy_rst_stream</a>(boost::system::error_code &amp;ec,
<a name="l00458"></a>00458                                    <span class="keyword">const</span> <a class="code" href="structpion_1_1spdy_1_1spdy__control__frame__info.html" title="This structure will be tied to each SPDY frame.">spdy_control_frame_info</a>&amp; frame)
<a name="l00459"></a>00459 {
<a name="l00460"></a>00460     boost::uint32_t stream_id = 0;
<a name="l00461"></a>00461     boost::uint32_t status_code = 0;
<a name="l00462"></a>00462     
<a name="l00463"></a>00463     <span class="comment">// First complete the check for size and flag</span>
<a name="l00464"></a>00464     <span class="comment">// The flag for RST frame should be 0, The length should be 8</span>
<a name="l00465"></a>00465     <span class="keywordflow">if</span>(frame.flags != 0 || frame.length != 8 ){
<a name="l00466"></a>00466         <span class="keywordflow">return</span>;
<a name="l00467"></a>00467     }
<a name="l00468"></a>00468 
<a name="l00469"></a>00469     <span class="comment">// Get the 31 bit stream id</span>
<a name="l00470"></a>00470     
<a name="l00471"></a>00471     boost::uint32_t four_bytes = <a class="code" href="structpion_1_1algorithm.html#af2092366e2a82fbfc456bceb15a0f599" title="convert sequence of four bytes to 32-bit unsigned integer">algorithm::to_uint32</a>(m_read_ptr);
<a name="l00472"></a>00472     stream_id = four_bytes &amp; 0x7FFFFFFF;
<a name="l00473"></a>00473     
<a name="l00474"></a>00474     m_read_ptr += 4;
<a name="l00475"></a>00475     
<a name="l00476"></a>00476     <span class="comment">// Get the status code</span>
<a name="l00477"></a>00477     
<a name="l00478"></a>00478     status_code = <a class="code" href="structpion_1_1algorithm.html#af2092366e2a82fbfc456bceb15a0f599" title="convert sequence of four bytes to 32-bit unsigned integer">algorithm::to_uint32</a>(m_read_ptr);
<a name="l00479"></a>00479     
<a name="l00480"></a>00480     <span class="comment">// Check the index before using the stream status array</span>
<a name="l00481"></a>00481     
<a name="l00482"></a>00482     <span class="keywordflow">if</span>(status_code &gt;=1 &amp;&amp; status_code &lt;= 12){
<a name="l00483"></a>00483     
<a name="l00484"></a>00484         PION_LOG_INFO(m_logger,
<a name="l00485"></a>00485                       <span class="stringliteral">&quot;SPDY &quot;</span> &lt;&lt; <span class="stringliteral">&quot;Status Code is : &quot;</span>
<a name="l00486"></a>00486                       &lt;&lt; rst_stream_status_names[status_code].str);
<a name="l00487"></a>00487     }<span class="keywordflow">else</span>{
<a name="l00488"></a>00488         PION_LOG_INFO(m_logger, <span class="stringliteral">&quot;SPDY RST Invalid status code : &quot;</span> &lt;&lt; status_code);
<a name="l00489"></a>00489     }
<a name="l00490"></a>00490 }
<a name="l00491"></a>00491 
<a name="l00492"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#a22199322320ed1a68407b438a898d98b">00492</a> <span class="keywordtype">void</span> <a class="code" href="classpion_1_1spdy_1_1parser.html#a22199322320ed1a68407b438a898d98b">parser::parse_spdy_ping_frame</a>(boost::system::error_code &amp;ec,
<a name="l00493"></a>00493                                    <span class="keyword">const</span> <a class="code" href="structpion_1_1spdy_1_1spdy__control__frame__info.html" title="This structure will be tied to each SPDY frame.">spdy_control_frame_info</a>&amp; frame)
<a name="l00494"></a>00494 {
<a name="l00495"></a>00495     <span class="comment">// First complete the check for size </span>
<a name="l00496"></a>00496     <span class="comment">// The length should be 4 always</span>
<a name="l00497"></a>00497     <span class="keywordflow">if</span>(frame.length != 4){
<a name="l00498"></a>00498         <span class="keywordflow">return</span>;
<a name="l00499"></a>00499     }
<a name="l00500"></a>00500   
<a name="l00501"></a>00501     boost::uint32_t ping_id = 0;
<a name="l00502"></a>00502     
<a name="l00503"></a>00503     <span class="comment">// Get the 32 bit ping id</span>
<a name="l00504"></a>00504     
<a name="l00505"></a>00505     ping_id = <a class="code" href="structpion_1_1algorithm.html#af2092366e2a82fbfc456bceb15a0f599" title="convert sequence of four bytes to 32-bit unsigned integer">algorithm::to_uint32</a>(m_read_ptr);
<a name="l00506"></a>00506     
<a name="l00507"></a>00507     m_read_ptr += 4;
<a name="l00508"></a>00508     
<a name="l00509"></a>00509     PION_LOG_INFO(m_logger, <span class="stringliteral">&quot;SPDY &quot;</span> &lt;&lt; <span class="stringliteral">&quot;Ping ID is : &quot;</span> &lt;&lt; ping_id);
<a name="l00510"></a>00510 }
<a name="l00511"></a>00511 
<a name="l00512"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#a36bd7ae76e3796cf4f99a30aa728c800">00512</a> <span class="keywordtype">void</span> <a class="code" href="classpion_1_1spdy_1_1parser.html#a36bd7ae76e3796cf4f99a30aa728c800">parser::parse_spdy_settings_frame</a>(boost::system::error_code &amp;ec,
<a name="l00513"></a>00513                                        <span class="keyword">const</span> <a class="code" href="structpion_1_1spdy_1_1spdy__control__frame__info.html" title="This structure will be tied to each SPDY frame.">spdy_control_frame_info</a>&amp; frame)
<a name="l00514"></a>00514 {
<a name="l00515"></a>00515     <span class="comment">// Can ignore this frame for our purposes</span>
<a name="l00516"></a>00516 }
<a name="l00517"></a>00517 
<a name="l00518"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#ae213965a7a77b4cfb385bfa8685c3e50">00518</a> <span class="keywordtype">void</span> <a class="code" href="classpion_1_1spdy_1_1parser.html#ae213965a7a77b4cfb385bfa8685c3e50">parser::parse_spdy_goaway_frame</a>(boost::system::error_code &amp;ec,
<a name="l00519"></a>00519                                      <span class="keyword">const</span> <a class="code" href="structpion_1_1spdy_1_1spdy__control__frame__info.html" title="This structure will be tied to each SPDY frame.">spdy_control_frame_info</a>&amp; frame)
<a name="l00520"></a>00520 {
<a name="l00521"></a>00521     <span class="comment">// First complete the check for size</span>
<a name="l00522"></a>00522     <span class="comment">// The length should be 4 always</span>
<a name="l00523"></a>00523     <span class="keywordflow">if</span>(frame.length != 4){
<a name="l00524"></a>00524         <span class="keywordflow">return</span>;
<a name="l00525"></a>00525     }
<a name="l00526"></a>00526     
<a name="l00527"></a>00527     boost::uint32_t last_good_stream_id = 0;
<a name="l00528"></a>00528     boost::uint32_t status_code = 0;
<a name="l00529"></a>00529     
<a name="l00530"></a>00530     <span class="comment">// Get the 31 bit stream id</span>
<a name="l00531"></a>00531     
<a name="l00532"></a>00532     boost::uint32_t four_bytes = <a class="code" href="structpion_1_1algorithm.html#af2092366e2a82fbfc456bceb15a0f599" title="convert sequence of four bytes to 32-bit unsigned integer">algorithm::to_uint32</a>(m_read_ptr);
<a name="l00533"></a>00533     last_good_stream_id = four_bytes &amp; 0x7FFFFFFF;
<a name="l00534"></a>00534     
<a name="l00535"></a>00535     m_read_ptr += 4;
<a name="l00536"></a>00536     
<a name="l00537"></a>00537     <span class="comment">// Get the status code</span>
<a name="l00538"></a>00538     
<a name="l00539"></a>00539     status_code = <a class="code" href="structpion_1_1algorithm.html#af2092366e2a82fbfc456bceb15a0f599" title="convert sequence of four bytes to 32-bit unsigned integer">algorithm::to_uint32</a>(m_read_ptr);
<a name="l00540"></a>00540     
<a name="l00541"></a>00541     <span class="comment">// Chek if there was an error</span>
<a name="l00542"></a>00542     <span class="keywordflow">if</span>(status_code == 1){
<a name="l00543"></a>00543         
<a name="l00544"></a>00544         PION_LOG_ERROR(m_logger, <span class="stringliteral">&quot;There was a Protocol Error&quot;</span>);
<a name="l00545"></a>00545         <a class="code" href="classpion_1_1spdy_1_1parser.html#a8caaf3917f65aeab5feee513e8b656b5">set_error</a>(ec, ERROR_PROTOCOL_ERROR);
<a name="l00546"></a>00546         <span class="keywordflow">return</span>;
<a name="l00547"></a>00547     }<span class="keywordflow">else</span> <span class="keywordflow">if</span> (status_code == 11) {
<a name="l00548"></a>00548         
<a name="l00549"></a>00549         PION_LOG_ERROR(m_logger, <span class="stringliteral">&quot;There was an Internal Error&quot;</span>);
<a name="l00550"></a>00550         <a class="code" href="classpion_1_1spdy_1_1parser.html#a8caaf3917f65aeab5feee513e8b656b5">set_error</a>(ec, ERROR_INTERNAL_SPDY_ERROR);
<a name="l00551"></a>00551         <span class="keywordflow">return</span>;
<a name="l00552"></a>00552     }
<a name="l00553"></a>00553     
<a name="l00554"></a>00554     PION_LOG_INFO(m_logger, <span class="stringliteral">&quot;SPDY &quot;</span> &lt;&lt; <span class="stringliteral">&quot;Status Code is : &quot;</span> &lt;&lt; status_code);
<a name="l00555"></a>00555     
<a name="l00556"></a>00556 }
<a name="l00557"></a>00557 
<a name="l00558"></a><a class="code" href="classpion_1_1spdy_1_1parser.html#a0ce476c60751c29909aec2af32b5b64e">00558</a> <span class="keywordtype">void</span> <a class="code" href="classpion_1_1spdy_1_1parser.html#a0ce476c60751c29909aec2af32b5b64e">parser::parse_spdy_window_update_frame</a>(boost::system::error_code &amp;ec,
<a name="l00559"></a>00559                                             <span class="keyword">const</span> <a class="code" href="structpion_1_1spdy_1_1spdy__control__frame__info.html" title="This structure will be tied to each SPDY frame.">spdy_control_frame_info</a>&amp; frame)
<a name="l00560"></a>00560 {
<a name="l00561"></a>00561     <span class="comment">// TBD : Do we really need this for our purpose</span>
<a name="l00562"></a>00562 }
<a name="l00563"></a>00563     
<a name="l00564"></a>00564 }   <span class="comment">// end namespace spdy</span>
<a name="l00565"></a>00565 }   <span class="comment">// end namespace pion</span>
</pre></div></div>
<hr size="1"/><address style="text-align: right;"><small>Generated on 16 Sep 2013 for pion by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>