Skip to content

Commit

Permalink
Merge pull request #248 from Zewo/swift-4
Browse files Browse the repository at this point in the history
Swift 4
  • Loading branch information
paulofaria committed Oct 31, 2017
2 parents 7e46591 + 16885e5 commit 5ac1c6f
Show file tree
Hide file tree
Showing 78 changed files with 4,637 additions and 1,584 deletions.
3 changes: 3 additions & 0 deletions .gitignore
@@ -1,4 +1,7 @@
.DS_Store
*.lock
*.resolved
/build
/.build
/Packages
/*.xcodeproj
Expand Down
2 changes: 1 addition & 1 deletion .swift-version
@@ -1 +1 @@
3.1
4.0
2 changes: 0 additions & 2 deletions .travis.yml
@@ -1,10 +1,8 @@
os:
- linux
- osx
language: generic
sudo: false
dist: trusty
osx_image: xcode8.3
addons:
apt:
sources:
Expand Down
5 changes: 0 additions & 5 deletions Package.pins

This file was deleted.

34 changes: 22 additions & 12 deletions Package.swift
@@ -1,21 +1,31 @@
// swift-tools-version:3.1
// swift-tools-version:4.0

import PackageDescription

let package = Package(
name: "Zewo",
targets: [
Target(name: "CYAJL"),
Target(name: "CHTTPParser"),

Target(name: "Core"),
Target(name: "IO", dependencies: ["Core"]),
Target(name: "Content", dependencies: ["CYAJL", "Core"]),
Target(name: "HTTP", dependencies: ["Content", "IO", "CHTTPParser"]),
products: [
.library(name: "Zewo", targets: ["CYAJL", "CHTTPParser", "Core", "IO", "Media", "HTTP", "Zewo"])
],
dependencies: [
.Package(url: "https://github.com/Zewo/Venice.git", majorVersion: 0, minor: 19),
.Package(url: "https://github.com/Zewo/CBtls.git", majorVersion: 1),
.Package(url: "https://github.com/Zewo/CLibreSSL.git", majorVersion: 3),
.package(url: "https://github.com/Zewo/CLibdill.git", .branch("swift-4")),
.package(url: "https://github.com/Zewo/Venice.git", .branch("swift-4")),
.package(url: "https://github.com/Zewo/CBtls.git", .branch("swift-4")),
.package(url: "https://github.com/Zewo/CLibreSSL.git", .branch("swift-4")),
],
targets: [
.target(name: "CYAJL"),
.target(name: "CHTTPParser"),

.target(name: "Core", dependencies: ["Venice"]),
.target(name: "IO", dependencies: ["Core"]),
.target(name: "Media", dependencies: ["Core", "CYAJL"]),
.target(name: "HTTP", dependencies: ["Media", "IO", "CHTTPParser"]),
.target(name: "Zewo", dependencies: ["Core", "IO", "Media", "HTTP"]),

.testTarget(name: "CoreTests", dependencies: ["Core"]),
.testTarget(name: "IOTests", dependencies: ["IO"]),
.testTarget(name: "MediaTests", dependencies: ["Media"]),
.testTarget(name: "HTTPTests", dependencies: ["HTTP"]),
]
)
5 changes: 2 additions & 3 deletions README.md
Expand Up @@ -6,7 +6,7 @@
</p>

<p align="center">
<a href="https://swift.org"><img src="https://img.shields.io/badge/Swift-3.0-orange.svg?style=flat" alt="Swift" /></a>
<a href="https://swift.org"><img src="https://img.shields.io/badge/Swift-4.0-orange.svg?style=flat" alt="Swift" /></a>
<a href="https://tldrlegal.com/license/mit-license"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=flat" alt="License" /></a>
<a href="http://slack.zewo.io"><img src="https://zewo-slackin.herokuapp.com/badge.svg" alt="Slack" /></a>
<a href="https://travis-ci.org/Zewo/Zewo"><img src="https://api.travis-ci.org/Zewo/Zewo.svg?branch=master" alt="Travis" /></a>
Expand Down Expand Up @@ -70,5 +70,4 @@ All **Zewo** modules are released under the MIT license. See [LICENSE](LICENSE)

[slack-image]: http://s13.postimg.org/ybwy92ktf/Slack.png
[slack-url]: http://slack.zewo.io
[codecov-url]: https://codecov.io/gh/Zewo/Zewo
[codecov-sunburst]: https://codecov.io/gh/Zewo/Zewo/branch/master/graphs/sunburst.svg

78 changes: 39 additions & 39 deletions Sources/CHTTPParser/http_parser.c
Expand Up @@ -77,13 +77,13 @@ do { \


/* Run the notify callback FOR, returning ER if it fails */
#define CALLBACK_NOTIFY_(FOR, ER) \
#define CALLBACK_NOTIFY_(FOR, ER, METHOD, STATUS_CODE, HTTP_MAJOR, HTTP_MINOR) \
do { \
assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \
\
if (LIKELY(settings->on_##FOR)) { \
parser->state = CURRENT_STATE(); \
if (UNLIKELY(0 != settings->on_##FOR(parser))) { \
if (UNLIKELY(0 != settings->on_##FOR(parser, (METHOD), (STATUS_CODE), (HTTP_MAJOR), (HTTP_MINOR)))) { \
SET_ERRNO(HPE_CB_##FOR); \
} \
UPDATE_STATE(parser->state); \
Expand All @@ -96,21 +96,21 @@ do { \
} while (0)

/* Run the notify callback FOR and consume the current byte */
#define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1)
#define CALLBACK_NOTIFY(FOR, METHOD, STATUS_CODE, HTTP_MAJOR, HTTP_MINOR) CALLBACK_NOTIFY_(FOR, p - data + 1, (METHOD), (STATUS_CODE), (HTTP_MAJOR), (HTTP_MINOR))

/* Run the notify callback FOR and don't consume the current byte */
#define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data)
#define CALLBACK_NOTIFY_NOADVANCE(FOR, METHOD, STATUS_CODE, HTTP_MAJOR, HTTP_MINOR) CALLBACK_NOTIFY_(FOR, p - data, (METHOD), (STATUS_CODE), (HTTP_MAJOR), (HTTP_MINOR))

/* Run data callback FOR with LEN bytes, returning ER if it fails */
#define CALLBACK_DATA_(FOR, LEN, ER) \
/* Run data callback FOR with LEN bytes, returning ER if it fails (long version)*/
#define CALLBACK_DATA_(FOR, LEN, ER, METHOD, STATUS_CODE, HTTP_MAJOR, HTTP_MINOR) \
do { \
assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \
\
if (FOR##_mark) { \
if (LIKELY(settings->on_##FOR)) { \
parser->state = CURRENT_STATE(); \
if (UNLIKELY(0 != \
settings->on_##FOR(parser, FOR##_mark, (LEN)))) { \
settings->on_##FOR(parser, FOR##_mark, (LEN), (METHOD), (STATUS_CODE), (HTTP_MAJOR), (HTTP_MINOR)))) { \
SET_ERRNO(HPE_CB_##FOR); \
} \
UPDATE_STATE(parser->state); \
Expand All @@ -125,12 +125,12 @@ do { \
} while (0)

/* Run the data callback FOR and consume the current byte */
#define CALLBACK_DATA(FOR) \
CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)
#define CALLBACK_DATA(FOR, METHOD, STATUS_CODE, HTTP_MAJOR, HTTP_MINOR) \
CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1, METHOD, STATUS_CODE, HTTP_MAJOR, HTTP_MINOR)

/* Run the data callback FOR and don't consume the current byte */
#define CALLBACK_DATA_NOADVANCE(FOR) \
CALLBACK_DATA_(FOR, p - FOR##_mark, p - data)
#define CALLBACK_DATA_NOADVANCE(FOR, METHOD, STATUS_CODE, HTTP_MAJOR, HTTP_MINOR) \
CALLBACK_DATA_(FOR, p - FOR##_mark, p - data, METHOD, STATUS_CODE, HTTP_MAJOR, HTTP_MINOR)

/* Set the mark FOR; non-destructive if mark is already set */
#define MARK(FOR) \
Expand Down Expand Up @@ -658,7 +658,7 @@ size_t http_parser_execute (http_parser *parser,
/* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if
* we got paused.
*/
CALLBACK_NOTIFY_NOADVANCE(message_complete);
CALLBACK_NOTIFY_NOADVANCE(message_complete, parser->method, parser->status_code, parser->http_major, parser->http_minor);
return 0;

case s_dead:
Expand Down Expand Up @@ -728,7 +728,7 @@ size_t http_parser_execute (http_parser *parser,
if (ch == 'H') {
UPDATE_STATE(s_res_or_resp_H);

CALLBACK_NOTIFY(message_begin);
CALLBACK_NOTIFY(message_begin, parser->method, parser->status_code, parser->http_major, parser->http_minor);
} else {
parser->type = HTTP_REQUEST;
UPDATE_STATE(s_start_req);
Expand Down Expand Up @@ -774,7 +774,7 @@ size_t http_parser_execute (http_parser *parser,
goto error;
}

CALLBACK_NOTIFY(message_begin);
CALLBACK_NOTIFY(message_begin, parser->method, parser->status_code, parser->http_major, parser->http_minor);
break;
}

Expand Down Expand Up @@ -934,13 +934,13 @@ size_t http_parser_execute (http_parser *parser,
case s_res_status:
if (ch == CR) {
UPDATE_STATE(s_res_line_almost_done);
CALLBACK_DATA(status);
CALLBACK_DATA(status, parser->method, parser->status_code, parser->http_major, parser->http_minor);
break;
}

if (ch == LF) {
UPDATE_STATE(s_header_field_start);
CALLBACK_DATA(status);
CALLBACK_DATA(status, parser->method, parser->status_code, parser->http_major, parser->http_minor);
break;
}

Expand Down Expand Up @@ -989,7 +989,7 @@ size_t http_parser_execute (http_parser *parser,
}
UPDATE_STATE(s_req_method);

CALLBACK_NOTIFY(message_begin);
CALLBACK_NOTIFY(message_begin, parser->method, parser->status_code, parser->http_major, parser->http_minor);

break;
}
Expand Down Expand Up @@ -1102,7 +1102,7 @@ size_t http_parser_execute (http_parser *parser,
switch (ch) {
case ' ':
UPDATE_STATE(s_req_http_start);
CALLBACK_DATA(url);
CALLBACK_DATA(url, parser->method, parser->status_code, parser->http_major, parser->http_minor);
break;
case CR:
case LF:
Expand All @@ -1111,7 +1111,7 @@ size_t http_parser_execute (http_parser *parser,
UPDATE_STATE((ch == CR) ?
s_req_line_almost_done :
s_header_field_start);
CALLBACK_DATA(url);
CALLBACK_DATA(url, parser->method, parser->status_code, parser->http_major, parser->http_minor);
break;
default:
UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch));
Expand Down Expand Up @@ -1421,7 +1421,7 @@ size_t http_parser_execute (http_parser *parser,

if (ch == ':') {
UPDATE_STATE(s_header_value_discard_ws);
CALLBACK_DATA(header_field);
CALLBACK_DATA(header_field, parser->method, parser->status_code, parser->http_major, parser->http_minor);
break;
}

Expand Down Expand Up @@ -1511,15 +1511,15 @@ size_t http_parser_execute (http_parser *parser,
if (ch == CR) {
UPDATE_STATE(s_header_almost_done);
parser->header_state = h_state;
CALLBACK_DATA(header_value);
CALLBACK_DATA(header_value, parser->method, parser->status_code, parser->http_major, parser->http_minor);
break;
}

if (ch == LF) {
UPDATE_STATE(s_header_almost_done);
COUNT_HEADER_SIZE(p - start);
parser->header_state = h_state;
CALLBACK_DATA_NOADVANCE(header_value);
CALLBACK_DATA_NOADVANCE(header_value, parser->method, parser->status_code, parser->http_major, parser->http_minor);
REEXECUTE();
}

Expand Down Expand Up @@ -1766,7 +1766,7 @@ size_t http_parser_execute (http_parser *parser,
/* header value was empty */
MARK(header_value);
UPDATE_STATE(s_header_field_start);
CALLBACK_DATA_NOADVANCE(header_value);
CALLBACK_DATA_NOADVANCE(header_value, parser->method, parser->status_code, parser->http_major, parser->http_minor);
REEXECUTE();
}
}
Expand All @@ -1778,7 +1778,7 @@ size_t http_parser_execute (http_parser *parser,
if (parser->flags & F_TRAILING) {
/* End of a chunked request */
UPDATE_STATE(s_message_done);
CALLBACK_NOTIFY_NOADVANCE(chunk_complete);
CALLBACK_NOTIFY_NOADVANCE(chunk_complete, parser->method, parser->status_code, parser->http_major, parser->http_minor);
REEXECUTE();
}

Expand Down Expand Up @@ -1808,7 +1808,7 @@ size_t http_parser_execute (http_parser *parser,
* we have to simulate it by handling a change in errno below.
*/
if (settings->on_headers_complete) {
switch (settings->on_headers_complete(parser)) {
switch (settings->on_headers_complete(parser, parser->method, parser->status_code, parser->http_major, parser->http_minor)) {
case 0:
break;

Expand Down Expand Up @@ -1842,29 +1842,29 @@ size_t http_parser_execute (http_parser *parser,
(parser->flags & F_SKIPBODY) || !hasBody)) {
/* Exit, the rest of the message is in a different protocol. */
UPDATE_STATE(NEW_MESSAGE());
CALLBACK_NOTIFY(message_complete);
CALLBACK_NOTIFY(message_complete, parser->method, parser->status_code, parser->http_major, parser->http_minor);
RETURN((p - data) + 1);
}

if (parser->flags & F_SKIPBODY) {
UPDATE_STATE(NEW_MESSAGE());
CALLBACK_NOTIFY(message_complete);
CALLBACK_NOTIFY(message_complete, parser->method, parser->status_code, parser->http_major, parser->http_minor);
} else if (parser->flags & F_CHUNKED) {
/* chunked encoding - ignore Content-Length header */
UPDATE_STATE(s_chunk_size_start);
} else {
if (parser->content_length == 0) {
/* Content-Length header given but zero: Content-Length: 0\r\n */
UPDATE_STATE(NEW_MESSAGE());
CALLBACK_NOTIFY(message_complete);
CALLBACK_NOTIFY(message_complete, parser->method, parser->status_code, parser->http_major, parser->http_minor);
} else if (parser->content_length != ULLONG_MAX) {
/* Content-Length header given and non-zero */
UPDATE_STATE(s_body_identity);
} else {
if (!http_message_needs_eof(parser)) {
/* Assume content-length 0 - read the next */
UPDATE_STATE(NEW_MESSAGE());
CALLBACK_NOTIFY(message_complete);
CALLBACK_NOTIFY(message_complete, parser->method, parser->status_code, parser->http_major, parser->http_minor);
} else {
/* Read body until EOF */
UPDATE_STATE(s_body_identity_eof);
Expand Down Expand Up @@ -1904,7 +1904,7 @@ size_t http_parser_execute (http_parser *parser,
* complete-on-length. It's not clear that this distinction is
* important for applications, but let's keep it for now.
*/
CALLBACK_DATA_(body, p - body_mark + 1, p - data);
CALLBACK_DATA_(body, p - body_mark + 1, p - data, parser->method, parser->status_code, parser->http_major, parser->http_minor);
REEXECUTE();
}

Expand All @@ -1920,7 +1920,7 @@ size_t http_parser_execute (http_parser *parser,

case s_message_done:
UPDATE_STATE(NEW_MESSAGE());
CALLBACK_NOTIFY(message_complete);
CALLBACK_NOTIFY(message_complete, parser->method, parser->status_code, parser->http_major, parser->http_minor);
if (parser->upgrade) {
/* Exit, the rest of the message is in a different protocol. */
RETURN((p - data) + 1);
Expand Down Expand Up @@ -2004,7 +2004,7 @@ size_t http_parser_execute (http_parser *parser,
} else {
UPDATE_STATE(s_chunk_data);
}
CALLBACK_NOTIFY(chunk_header);
CALLBACK_NOTIFY(chunk_header, parser->method, parser->status_code, parser->http_major, parser->http_minor);
break;
}

Expand Down Expand Up @@ -2036,15 +2036,15 @@ size_t http_parser_execute (http_parser *parser,
assert(parser->content_length == 0);
STRICT_CHECK(ch != CR);
UPDATE_STATE(s_chunk_data_done);
CALLBACK_DATA(body);
CALLBACK_DATA(body, parser->method, parser->status_code, parser->http_major, parser->http_minor);
break;

case s_chunk_data_done:
assert(parser->flags & F_CHUNKED);
STRICT_CHECK(ch != LF);
parser->nread = 0;
UPDATE_STATE(s_chunk_size_start);
CALLBACK_NOTIFY(chunk_complete);
CALLBACK_NOTIFY(chunk_complete, parser->method, parser->status_code, parser->http_major, parser->http_minor);
break;

default:
Expand All @@ -2070,11 +2070,11 @@ size_t http_parser_execute (http_parser *parser,
(body_mark ? 1 : 0) +
(status_mark ? 1 : 0)) <= 1);

CALLBACK_DATA_NOADVANCE(header_field);
CALLBACK_DATA_NOADVANCE(header_value);
CALLBACK_DATA_NOADVANCE(url);
CALLBACK_DATA_NOADVANCE(body);
CALLBACK_DATA_NOADVANCE(status);
CALLBACK_DATA_NOADVANCE(header_field, parser->method, parser->status_code, parser->http_major, parser->http_minor);
CALLBACK_DATA_NOADVANCE(header_value, parser->method, parser->status_code, parser->http_major, parser->http_minor);
CALLBACK_DATA_NOADVANCE(url, parser->method, parser->status_code, parser->http_major, parser->http_minor);
CALLBACK_DATA_NOADVANCE(body, parser->method, parser->status_code, parser->http_major, parser->http_minor);
CALLBACK_DATA_NOADVANCE(status, parser->method, parser->status_code, parser->http_major, parser->http_minor);

RETURN(len);

Expand Down
4 changes: 2 additions & 2 deletions Sources/CHTTPParser/include/http_parser.h
Expand Up @@ -81,8 +81,8 @@ typedef struct http_parser_settings http_parser_settings;
* many times for each string. E.G. you might get 10 callbacks for "on_url"
* 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*);
typedef int (*http_data_cb) (http_parser*, const char *at, size_t length, int method, int status_code, short http_major, short http_minor);
typedef int (*http_cb) (http_parser*, int method, int status_code, short http_major, short http_minor);


/* Request Methods */
Expand Down

0 comments on commit 5ac1c6f

Please sign in to comment.