Skip to content

Commit

Permalink
Updated to new version.
Browse files Browse the repository at this point in the history
  • Loading branch information
dfirsht committed May 19, 2016
2 parents ef517c6 + 6720797 commit 1f0f012
Show file tree
Hide file tree
Showing 15 changed files with 395 additions and 509 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ branches:

notifications:
slack:
secure: "rbi1R2Icz5jsIo5YsFmRFyhjb+sJgAXHYQEdRE508oRjANhvOJ0JwIbDLLOT4w3lN1$
secure: "P0r4xHJ1C6siPNtB0HM8kcRDGrD7PX0iY3UrDwRN41isiw1IpjNjNOvtzEzATyIkkpMlMXEq3QBdEsxZCwIKYUZHCy99CSkoY/brUdIJgaC92XZzP7BucQAhbweilVX4YcB8CmfKJ9b5I/+7o7bbnOlcVDUkd29QuMb0nUy2rXl6xZVLJ/9BmFSsffAquPjfdQKq/xh/hIbaBtHLDVxxQ4Q/DeDJ+FLkG16tFAvEj9EMDgeFcKZF9pOpFrCdpwj1Bg8NLB5vZqizxgr9xK4lBBr7LBrwhwfzvxs8DAjwWSUZkZEhPfoRzSBZ0tYeqH2V3dL8B9eEPVyfDawq8DXQcjMVIn5wpVQqNzzjuAXNlqhjT7PzjDccnU821uNs9nYDY5aug8pqC+ZaB1GSnt4Y0jH4NjSnEQIGeYwn3D4CiTwAGjO/OFJT5VV/DcKpdtzcuEbhCJyaPPfk4obgiUOOBEH6Ut932fqYfd70h7gupofFcctzsei3egAv9bff/PTIzhYsf5Vacj4i/hx+AaBK63BctKu8okcPne40OKms15dO/BB5AfFZYsN+sSOhzOpTzZpxS2tEqVJsVna0DcFX5cWzIMr0MonQYLr/uVB7mgE/VT8wETbVaEkSq/yqScOQRLM/ja/o273e3bv1EoRxYJPQSHQR/Du1le1E2dQS+Qc="

matrix:
include:
Expand Down
3 changes: 1 addition & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@ import PackageDescription
let package = Package(
name: "Kitura-net",
dependencies: [
.Package(url: "https://github.com/IBM-Swift/Kitura-sys.git", majorVersion: 0, minor: 12),
.Package(url: "https://github.com/IBM-Swift/Kitura-sys.git", majorVersion: 0, minor: 14),
.Package(url: "https://github.com/IBM-Swift/BlueSocket.git", majorVersion: 0, minor: 5),
.Package(url: "https://github.com/IBM-Swift/LoggerAPI.git", majorVersion: 0, minor: 5),
.Package(url: "https://github.com/IBM-Swift/CCurl.git", majorVersion: 0, minor: 1),
.Package(url: "https://github.com/IBM-Swift/CHttpParser.git", majorVersion: 0, minor: 1),
]
Expand Down
32 changes: 20 additions & 12 deletions Sources/KituraNet/ClientRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ public class ClientRequest: SocketWriter {


private var callback: ClientRequestCallback

private var disableSSLVerification = false

///
/// Initializes a ClientRequest instance
Expand Down Expand Up @@ -117,26 +119,28 @@ public class ClientRequest: SocketWriter {
for option in options {
switch(option) {

case .Method(let method):
case .method(let method):
self.method = method
case .Schema(let schema):
case .schema(let schema):
theSchema = schema
case .Hostname(let host):
case .hostname(let host):
hostName = host
case .Port(let thePort):
case .port(let thePort):
port = thePort
case .Path(let thePath):
case .path(let thePath):
path = thePath
case .Headers(let headers):
case .headers(let headers):
for (key, value) in headers {
self.headers[key] = value
}
case .Username(let userName):
case .username(let userName):
self.userName = userName
case .Password(let password):
case .password(let password):
self.password = password
case .MaxRedirects(let maxRedirects):
case .maxRedirects(let maxRedirects):
self.maxRedirects = maxRedirects
case .disableSSLVerification:
self.disableSSLVerification = true
}
}

Expand Down Expand Up @@ -248,7 +252,7 @@ public class ClientRequest: SocketWriter {
if code == CURLE_OK {
response.parse() {status in
switch(status) {
case .Success:
case .success:
self.callback(response: self.response)
callCallback = false

Expand Down Expand Up @@ -282,6 +286,10 @@ public class ClientRequest: SocketWriter {
// HTTP parser does the decoding
curlHelperSetOptInt(handle!, CURLOPT_HTTP_TRANSFER_DECODING, 0)
curlHelperSetOptString(handle!, CURLOPT_URL, UnsafeMutablePointer<Int8>(urlBuf.bytes))
if disableSSLVerification {
curlHelperSetOptInt(handle!, CURLOPT_SSL_VERIFYHOST, 0)
curlHelperSetOptInt(handle!, CURLOPT_SSL_VERIFYPEER, 0)
}
setMethod()
let count = writeBuffers.count
if count != 0 {
Expand Down Expand Up @@ -366,8 +374,8 @@ extension ClientRequest: CurlInvokerDelegate {
///
public enum ClientRequestOptions {

case Method(String), Schema(String), Hostname(String), Port(Int16), Path(String),
Headers([String: String]), Username(String), Password(String), MaxRedirects(Int)
case method(String), schema(String), hostname(String), port(Int16), path(String),
headers([String: String]), username(String), password(String), maxRedirects(Int), disableSSLVerification

}

Expand Down
4 changes: 2 additions & 2 deletions Sources/KituraNet/ClientResponse.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ public class ClientResponse: IncomingMessage {
public internal(set) var status = -1 {

didSet {
statusCode = HttpStatusCode(rawValue: status)!
statusCode = HTTPStatusCode(rawValue: status)!
}

}

///
/// HTTP Status code
public internal(set) var statusCode: HttpStatusCode = HttpStatusCode.UNKNOWN
public internal(set) var statusCode: HTTPStatusCode = HTTPStatusCode.unknown

///
/// BufferList instance for storing the response
Expand Down
42 changes: 21 additions & 21 deletions Sources/KituraNet/Http.swift → Sources/KituraNet/HTTP.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

import Foundation

// MARK: Http
// MARK: HTTP

public class Http {
public class HTTP {

///
/// Mapping of integer status codes to the String description
Expand All @@ -44,13 +44,13 @@ public class Http {
]

///
/// Creates a new Http server
/// Creates a new HTTP server
///
/// - Returns: an instance of HttpServer
/// - Returns: an instance of HTTPServer
///
public static func createServer() -> HttpServer {
public static func createServer() -> HTTPServer {

return HttpServer()
return HTTPServer()

}

Expand Down Expand Up @@ -103,7 +103,7 @@ public class Http {
/// A set of characters that are valid in requests
///
#if os(Linux)
private static let allowedCharacterSet = NSCharacterSet(charactersInString:"\"#%/<>?@\\^`{|}").invertedSet
private static let allowedCharacterSet = NSCharacterSet(charactersIn:"\"#%/<>?@\\^`{|}").invertedSet
#else
private static let allowedCharacterSet = NSCharacterSet(charactersIn:"\"#%/<>?@\\^`{|}").inverted
#endif
Expand Down Expand Up @@ -134,20 +134,20 @@ public class Http {
///
/// HTTP status codes and numbers
///
public enum HttpStatusCode: Int {
public enum HTTPStatusCode: Int {

case ACCEPTED = 202, BAD_GATEWAY = 502, BAD_REQUEST = 400, CONFLICT = 409, CONTINUE = 100, CREATED = 201
case EXPECTATION_FAILED = 417, FAILED_DEPENDENCY = 424, FORBIDDEN = 403, GATEWAY_TIMEOUT = 504, GONE = 410
case HTTP_VERSION_NOT_SUPPORTED = 505, INSUFFICIENT_SPACE_ON_RESOURCE = 419, INSUFFICIENT_STORAGE = 507
case INTERNAL_SERVER_ERROR = 500, LENGTH_REQUIRED = 411, METHOD_FAILURE = 420, METHOD_NOT_ALLOWED = 405
case MOVED_PERMANENTLY = 301, MOVED_TEMPORARILY = 302, MULTI_STATUS = 207, MULTIPLE_CHOICES = 300
case NETWORK_AUTHENTICATION_REQUIRED = 511, NO_CONTENT = 204, NON_AUTHORITATIVE_INFORMATION = 203
case NOT_ACCEPTABLE = 406, NOT_FOUND = 404, NOT_IMPLEMENTED = 501, NOT_MODIFIED = 304, OK = 200
case PARTIAL_CONTENT = 206, PAYMENT_REQUIRED = 402, PRECONDITION_FAILED = 412, PRECONDITION_REQUIRED = 428
case PROXY_AUTHENTICATION_REQUIRED = 407, PROCESSING = 102, REQUEST_HEADER_FIELDS_TOO_LARGE = 431
case REQUEST_TIMEOUT = 408, REQUEST_TOO_LONG = 413, REQUEST_URI_TOO_LONG = 414, REQUESTED_RANGE_NOT_SATISFIABLE = 416
case RESET_CONTENT = 205, SEE_OTHER = 303, SERVICE_UNAVAILABLE = 503, SWITCHING_PROTOCOLS = 101
case TEMPORARY_REDIRECT = 307, TOO_MANY_REQUESTS = 429, UNAUTHORIZED = 401, UNPROCESSABLE_ENTITY = 422
case UNSUPPORTED_MEDIA_TYPE = 415, USE_PROXY = 305, UNKNOWN = -1
case accepted = 202, badGateway = 502, badRequest = 400, conflict = 409, `continue` = 100, created = 201
case expectationFailed = 417, failedDependency = 424, forbidden = 403, gatewayTimeout = 504, gone = 410
case httpVersionNotSupported = 505, insufficientSpaceOnResource = 419, insufficientStorage = 507
case internalServerError = 500, lengthRequired = 411, methodFailure = 420, methodNotAllowed = 405
case movedPermanently = 301, movedTemporarily = 302, multiStatus = 207, multipleChoices = 300
case networkAuthenticationRequired = 511, noContent = 204, nonAuthoritativeInformation = 203
case notAcceptable = 406, notFound = 404, notImplemented = 501, notModified = 304, OK = 200
case partialContent = 206, paymentRequired = 402, preconditionFailed = 412, preconditionRequired = 428
case proxyAuthenticationRequired = 407, processing = 102, requestHeaderFieldsTooLarge = 431
case requestTimeout = 408, requestTooLong = 413, requestURITooLong = 414, requestedRangeNotSatisfiable = 416
case resetContent = 205, seeOther = 303, serviceUnavailable = 503, switchingProtocols = 101
case temporaryRedirect = 307, tooManyRequests = 429, unauthorized = 401, unprocessableEntity = 422
case unsupportedMediaType = 415, useProxy = 305, unknown = -1

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,29 @@ import KituraSys
import CHttpParser
import Foundation

// MARK: HttpParser
// MARK: HTTPParser

class HttpParser {
class HTTPParser {

///
/// A Handle to the HttpParser C-library
/// A Handle to the HTTPParser C-library
///
var parser: http_parser

///
/// Settings used for HttpParser
/// Settings used for HTTPParser
///
var settings: http_parser_settings

///
/// Parsing a request? (or a response)
///
var isRequest = true

///
/// Delegate used for the parsing
///
var delegate: HttpParserDelegate? {
var delegate: HTTPParserDelegate? {

didSet {
if let _ = delegate {
Expand All @@ -54,48 +59,50 @@ class HttpParser {
var upgrade = 1

///
/// Initializes a HttpParser instance
/// Initializes a HTTPParser instance
///
/// - Parameter isRequest: whether or not this HTTP message is a request
///
/// - Returns: an HttpParser instance
/// - Returns: an HTTPParser instance
///
init(isRequest: Bool) {

self.isRequest = isRequest

parser = http_parser()
settings = http_parser_settings()

settings.on_url = { (parser, chunk, length) -> Int32 in
let p = UnsafePointer<HttpParserDelegate?>(parser.pointee.data)
let p = UnsafePointer<HTTPParserDelegate?>(parser.pointee.data)
let data = NSData(bytes: chunk, length: length)
p?.pointee?.onUrl(data)
return 0
}

settings.on_header_field = { (parser, chunk, length) -> Int32 in
let data = NSData(bytes: chunk, length: length)
let p = UnsafePointer<HttpParserDelegate?>(parser.pointee.data)
let p = UnsafePointer<HTTPParserDelegate?>(parser.pointee.data)
p?.pointee?.onHeaderField(data)
return 0
}

settings.on_header_value = { (parser, chunk, length) -> Int32 in
let data = NSData(bytes: chunk, length: length)
let p = UnsafePointer<HttpParserDelegate?>(parser.pointee.data)
let p = UnsafePointer<HTTPParserDelegate?>(parser.pointee.data)
p?.pointee?.onHeaderValue(data)
return 0
}

settings.on_body = { (parser, chunk, length) -> Int32 in
let p = UnsafePointer<HttpParserDelegate?>(parser.pointee.data)
let p = UnsafePointer<HTTPParserDelegate?>(parser.pointee.data)
let data = NSData(bytes: chunk, length: length)
p?.pointee?.onBody(data)

return 0
}

settings.on_headers_complete = { (parser) -> Int32 in
let p = UnsafePointer<HttpParserDelegate?>(parser.pointee.data)
let p = UnsafePointer<HTTPParserDelegate?>(parser.pointee.data)
// TODO: Clean and refactor
//let method = String( get_method(parser))
let po = get_method(parser)
Expand All @@ -112,14 +119,14 @@ class HttpParser {
}

settings.on_message_begin = { (parser) -> Int32 in
let p = UnsafePointer<HttpParserDelegate?>(parser.pointee.data)
let p = UnsafePointer<HTTPParserDelegate?>(parser.pointee.data)
p?.pointee?.onMessageBegin()

return 0
}

settings.on_message_complete = { (parser) -> Int32 in
let p = UnsafePointer<HttpParserDelegate?>(parser.pointee.data)
let p = UnsafePointer<HTTPParserDelegate?>(parser.pointee.data)
if get_status_code(parser) == 100 {
p?.pointee?.reset()
}
Expand All @@ -130,8 +137,7 @@ class HttpParser {
return 0
}

http_parser_init(&parser, isRequest ? HTTP_REQUEST : HTTP_RESPONSE)

reset()
}

///
Expand All @@ -147,12 +153,19 @@ class HttpParser {
let upgrade = get_upgrade_value(&parser)
return (nparsed, upgrade)
}

///
/// Reset the http_parser context structure.
///
func reset() {
http_parser_init(&parser, isRequest ? HTTP_REQUEST : HTTP_RESPONSE)
}
}

///
/// Delegate protocol for HTTP parsing stages
///
protocol HttpParserDelegate: class {
protocol HTTPParserDelegate: class {

func onUrl(_ url:NSData)
func onHeaderField(_ data: NSData)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ import Foundation
import Darwin
#endif

// MARK: UrlParser
// MARK: URLParser

public class UrlParser : CustomStringConvertible {
public class URLParser : CustomStringConvertible {

///
/// Schema
Expand Down Expand Up @@ -104,7 +104,7 @@ public class UrlParser : CustomStringConvertible {


///
/// Initializes a new UrlParser instance
/// Initializes a new URLParser instance
///
/// - Parameter url: url to be parsed
/// - Parameter isConnect: whether or not a connection has been established
Expand All @@ -117,32 +117,24 @@ public class UrlParser : CustomStringConvertible {
if http_parser_parse_url_url(UnsafePointer<Int8>(url.bytes), url.length, isConnect ? 1 : 0 , &parsedUrl) == 0 {

let (s, h, ps, p, q, f, u) = parsedUrl.field_data
schema = getValueFromUrl(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_SCHEMA.rawValue), fieldData: s)
host = getValueFromUrl(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_HOST.rawValue), fieldData: h)
let portString = getValueFromUrl(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_PORT.rawValue), fieldData: ps)
path = getValueFromUrl(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_PATH.rawValue), fieldData: p)
query = getValueFromUrl(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_QUERY.rawValue), fieldData: q)
fragment = getValueFromUrl(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_FRAGMENT.rawValue), fieldData: f)
userinfo = getValueFromUrl(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_USERINFO.rawValue), fieldData: u)
schema = getValueFromURL(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_SCHEMA.rawValue), fieldData: s)
host = getValueFromURL(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_HOST.rawValue), fieldData: h)
let portString = getValueFromURL(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_PORT.rawValue), fieldData: ps)
path = getValueFromURL(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_PATH.rawValue), fieldData: p)
query = getValueFromURL(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_QUERY.rawValue), fieldData: q)
fragment = getValueFromURL(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_FRAGMENT.rawValue), fieldData: f)
userinfo = getValueFromURL(url, fieldSet: parsedUrl.field_set, fieldIndex: UInt16(UF_USERINFO.rawValue), fieldData: u)

if let _ = portString {
port = parsedUrl.port
}

if let query = query {

#if os(Linux)
let pairs = query.bridge().componentsSeparatedByString("&")
#else
let pairs = query.components(separatedBy: "&")
#endif
for pair in pairs {

#if os(Linux)
let pairArr = pair.bridge().componentsSeparatedByString("=")
#else
let pairArr = pair.components(separatedBy: "=")
#endif
if pairArr.count == 2 {
queryParams[pairArr[0]] = pairArr[1]
}
Expand All @@ -157,7 +149,7 @@ public class UrlParser : CustomStringConvertible {
/// TODO: ???
///
///
private func getValueFromUrl(_ url: NSData, fieldSet: UInt16, fieldIndex: UInt16,
private func getValueFromURL(_ url: NSData, fieldSet: UInt16, fieldIndex: UInt16,
fieldData: http_parser_url_field_data) -> String? {

if fieldSet & (1 << fieldIndex) != 0 {
Expand Down
Loading

0 comments on commit 1f0f012

Please sign in to comment.