github
Advanced Search
  • Home
  • Pricing and Signup
  • Explore GitHub
  • Blog
  • Login

ry / http-parser

  • Admin
  • Watch Unwatch
  • Fork
  • Your Fork
  • Pull Request
  • Download Source
    • 190
    • 11
  • Source
  • Commits
  • Network (11)
  • Issues (0)
  • Downloads (3)
  • Graphs
  • Tag: v0.3

click here to add a description

click here to add a homepage

  • Branches (2)
    • master
    • version0.2
  • Tags (3)
    • v0.3
    • v0.2
    • v0.1
Sending Request…
Enable Donations

Pledgie Donations

Once activated, we'll place the following badge in your repository's detail box:
Pledgie_example
This service is courtesy of Pledgie.

http request/response parser for c — Read more

  cancel

  cancel
  • Private
  • Read-Only
  • HTTP Read-Only

This URL has Read+Write access

add message_complete_on_eof test 
ry (author)
Fri Nov 20 08:05:25 -0800 2009
commit  a8f7a3cd78a6727ca3778e3e9be2112d5965bab2
tree    44388737d7f2862c6e9bd1ab1246df7b30a544d3
parent  357d7c2a241af64605fa5fea8e820c98c764011a
http-parser / http_parser.h http_parser.h
100644 126 lines (108 sloc) 3.849 kb
edit raw blame history
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
/* Copyright 2009 Ryan Dahl <ry@tinyclouds.org>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef http_parser_h
#define http_parser_h
#ifdef __cplusplus
extern "C" {
#endif
 
#ifdef _MSC_VER
# include <stddef.h>
#endif
#include <sys/types.h>
 
/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run
* faster
*/
#ifndef HTTP_PARSER_STRICT
# define HTTP_PARSER_STRICT 1
#else
# define HTTP_PARSER_STRICT 0
#endif
 
typedef struct http_parser http_parser;
 
/* Callbacks should return non-zero to indicate an error. The parse will
* then halt execution.
*
* http_data_cb does not return data chunks. It will be call arbitrarally
* many times for each string. E.G. you might get 10 callbacks for "on_path"
* each providing just a few characters more data.
*/
typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);
typedef int (*http_cb) (http_parser*);
 
/* Request Methods */
enum http_method
  { HTTP_DELETE = 0x0002
  , HTTP_GET = 0x0004
  , HTTP_HEAD = 0x0008
  , HTTP_POST = 0x0100
  , HTTP_PUT = 0x0800
  };
 
struct http_parser {
  /** PRIVATE **/
  unsigned short state;
  unsigned short header_state;
  size_t header_index;
 
  char flags;
 
  ssize_t body_read;
  ssize_t content_length;
 
  const char *header_field_mark;
  size_t header_field_size;
  const char *header_value_mark;
  size_t header_value_size;
  const char *query_string_mark;
  size_t query_string_size;
  const char *path_mark;
  size_t path_size;
  const char *url_mark;
  size_t url_size;
  const char *fragment_mark;
  size_t fragment_size;
 
  /** READ-ONLY **/
  unsigned short status_code; /* responses only */
  enum http_method method; /* requests only */
  unsigned short http_major;
  unsigned short http_minor;
 
  /** PUBLIC **/
  void *data; /* A pointer to get hook to the "connection" or "socket" object */
 
  /* an ordered list of callbacks */
 
  http_cb on_message_begin;
 
  /* requests only */
  http_data_cb on_path;
  http_data_cb on_query_string;
  http_data_cb on_url;
  http_data_cb on_fragment;
 
  http_data_cb on_header_field;
  http_data_cb on_header_value;
  http_cb on_headers_complete;
  http_data_cb on_body;
  http_cb on_message_complete;
};
 
void http_parser_init(http_parser *parser);
size_t http_parse_requests(http_parser *parser, const char *data, size_t len);
size_t http_parse_responses(http_parser *parser, const char *data, size_t len);
/* Call this in the on_headers_complete or on_message_complete callback to
* determine if this will be the last message on the connection.
* If you are the server, respond with the "Connection: close" header
* if you are the client, close the connection.
*/
int http_should_keep_alive(http_parser *parser);
 
#ifdef __cplusplus
}
#endif
#endif
 
Blog | Support | Training | Contact | API | Status | Twitter | Help | Security
© 2010 GitHub Inc. All rights reserved. | Terms of Service | Privacy Policy
Powered by the Dedicated Servers and
Cloud Computing of Rackspace Hosting®
Dedicated Server