Changeset 256787 in webkit


Ignore:
Timestamp:
Feb 17, 2020 3:45:16 PM (4 years ago)
Author:
youenn@apple.com
Message:

Fix regression in NSURLSessionWebSocketTask WSS support
https://bugs.webkit.org/show_bug.cgi?id=207855

Reviewed by Alex Christensen.

Covered by http/tests/websocket/tests/hybi/simple-wss.html passing with NSURLSessionWebSocketTask code path.
When having an authentication challenge, we need to get the session from the task.
This was not working for websocket tasks.
Fix this by retrieving the session from the web socket data task, which is retrieved from the task identifier.

  • NetworkProcess/Downloads/DownloadID.h:

(WebKit::DownloadID::operator bool const):
Add operator bool for convenience.

  • NetworkProcess/NetworkSocketChannel.cpp:

(WebKit::NetworkSocketChannel::session):

  • NetworkProcess/NetworkSocketChannel.h:
  • NetworkProcess/cocoa/NetworkSessionCocoa.mm:

(-[WKNetworkSessionDelegate sessionFromTask:]):
(-[WKNetworkSessionDelegate URLSession:task:didReceiveChallenge:completionHandler:]):

  • NetworkProcess/cocoa/WebSocketTaskCocoa.h:
  • NetworkProcess/cocoa/WebSocketTaskCocoa.mm:

(WebKit::WebSocketTask::networkSession):

Location:
trunk/Source/WebKit
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r256780 r256787  
     12020-02-17  Youenn Fablet  <youenn@apple.com>
     2
     3        Fix regression in NSURLSessionWebSocketTask WSS support
     4        https://bugs.webkit.org/show_bug.cgi?id=207855
     5
     6        Reviewed by Alex Christensen.
     7
     8        Covered by http/tests/websocket/tests/hybi/simple-wss.html passing with NSURLSessionWebSocketTask code path.
     9        When having an authentication challenge, we need to get the session from the task.
     10        This was not working for websocket tasks.
     11        Fix this by retrieving the session from the web socket data task, which is retrieved from the task identifier.
     12
     13        * NetworkProcess/Downloads/DownloadID.h:
     14        (WebKit::DownloadID::operator bool const):
     15        Add operator bool for convenience.
     16        * NetworkProcess/NetworkSocketChannel.cpp:
     17        (WebKit::NetworkSocketChannel::session):
     18        * NetworkProcess/NetworkSocketChannel.h:
     19        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
     20        (-[WKNetworkSessionDelegate sessionFromTask:]):
     21        (-[WKNetworkSessionDelegate URLSession:task:didReceiveChallenge:completionHandler:]):
     22        * NetworkProcess/cocoa/WebSocketTaskCocoa.h:
     23        * NetworkProcess/cocoa/WebSocketTaskCocoa.mm:
     24        (WebKit::WebSocketTask::networkSession):
     25
    1262020-02-17  Alex Christensen  <achristensen@webkit.org>
    227
  • trunk/Source/WebKit/NetworkProcess/Downloads/DownloadID.h

    r252274 r256787  
    4848    bool operator!=(DownloadID other) const { return m_downloadID != other.m_downloadID; }
    4949
     50    explicit operator bool() const { return downloadID(); }
     51
    5052    uint64_t downloadID() const { return m_downloadID; }
    5153private:
  • trunk/Source/WebKit/NetworkProcess/NetworkSocketChannel.cpp

    r256303 r256787  
    129129}
    130130
     131NetworkSession* NetworkSocketChannel::session()
     132{
     133    return m_session.get();
     134}
     135
    131136} // namespace WebKit
  • trunk/Source/WebKit/NetworkProcess/NetworkSocketChannel.h

    r256303 r256787  
    7373    void close(int32_t code, const String& reason);
    7474
     75    NetworkSession* session();
     76
    7577    IPC::Connection* messageSenderConnection() const final;
    7678    uint64_t messageSenderDestinationID() const final { return m_identifier.toUInt64(); }
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm

    r256632 r256787  
    610610#endif
    611611
     612- (NetworkSessionCocoa*)sessionFromTask:(NSURLSessionTask *)task {
     613    if (auto* networkDataTask = [self existingTask:task])
     614        return static_cast<NetworkSessionCocoa*>(networkDataTask->networkSession());
     615
     616    if (auto downloadID = _sessionWrapper->downloadMap.get(task.taskIdentifier)) {
     617        if (auto download = _session->networkProcess().downloadManager().download(downloadID))
     618            return static_cast<NetworkSessionCocoa*>(_session->networkProcess().networkSession(download->sessionID()));
     619        return nullptr;
     620    }
     621
     622#if HAVE(NSURLSESSION_WEBSOCKET)
     623    if (auto* webSocketTask = _sessionWrapper->webSocketDataTaskMap.get(task.taskIdentifier))
     624        return webSocketTask->networkSession();
     625#endif
     626
     627    return nullptr;
     628}
     629
    612630- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
    613631{
    614     auto* networkDataTask = [self existingTask:task];
    615     auto* sessionCocoa = networkDataTask ? static_cast<NetworkSessionCocoa*>(networkDataTask->networkSession()) : nullptr;
    616     if (!networkDataTask) {
    617         ASSERT(!sessionCocoa);
    618         auto downloadID = _sessionWrapper->downloadMap.get(task.taskIdentifier);
    619         auto download = downloadID.downloadID() ? _session->networkProcess().downloadManager().download(downloadID) : nil;
    620         sessionCocoa = download ? static_cast<NetworkSessionCocoa*>(_session->networkProcess().networkSession(download->sessionID())) : nil;
    621     }
     632    auto* sessionCocoa = [self sessionFromTask: task];
    622633    if (!sessionCocoa || [task state] == NSURLSessionTaskStateCanceling) {
    623634        completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
     
    658669        if (sessionCocoa->fastServerTrustEvaluationEnabled() && negotiatedLegacyTLS == NegotiatedLegacyTLS::No) {
    659670#if HAVE(CFNETWORK_NSURLSESSION_STRICTRUSTEVALUATE)
     671            auto* networkDataTask = [self existingTask:task];
    660672            auto decisionHandler = makeBlockPtr([weakSelf = WeakObjCPtr<WKNetworkSessionDelegate>(self), sessionCocoa = makeWeakPtr(sessionCocoa), completionHandler = makeBlockPtr(completionHandler), taskIdentifier, networkDataTask = makeRefPtr(networkDataTask), negotiatedLegacyTLS](NSURLAuthenticationChallenge *challenge, OSStatus trustResult) mutable {
    661673                auto strongSelf = weakSelf.get();
  • trunk/Source/WebKit/NetworkProcess/cocoa/WebSocketTaskCocoa.h

    r248762 r256787  
    3939namespace WebKit {
    4040class NetworkSession;
     41class NetworkSessionCocoa;
    4142class NetworkSocketChannel;
    4243
     
    6061    TaskIdentifier identifier() const;
    6162
     63    NetworkSessionCocoa* networkSession();
     64
    6265private:
    6366    void readNextMessage();
  • trunk/Source/WebKit/NetworkProcess/cocoa/WebSocketTaskCocoa.mm

    r256662 r256787  
    3030
    3131#import "DataReference.h"
     32#import "NetworkSessionCocoa.h"
    3233#import "NetworkSocketChannel.h"
    3334#import <Foundation/NSURLSession.h>
     
    134135}
    135136
     137NetworkSessionCocoa* WebSocketTask::networkSession()
     138{
     139    return static_cast<NetworkSessionCocoa*>(m_channel.session());
     140}
     141
    136142}
    137143
Note: See TracChangeset for help on using the changeset viewer.